Javaプログラミング学習サイト ゆるゆるプログラミング

2019/08/05 公開

・トランプの操作

トランプ(カード)を扱うクラスを作成しました。

このクラスには、トランプを整列機能(並びを新品の状態にする)、シャッフル機能(ランダムで並び替え)、1~53の番号指定でカードを取得する機能があります。

以下が、そのソースコードです。これは、トランプシャッフルして、1枚目から53枚目のカードの情報を全て表示するものです。

Cards.java ← クリックしてダウンロードページに移動
001:    // トランプを操作するクラス
002:    class CardsManager {
003:    	// トランプ配列
004:    	private int[] cards;
005:    
006:    	//  配列の値
007:    	//  000 : ジョーカー
008:    	//  101~113 : スペードの1~13
009:    	//  201~213 : ハートの1~13
010:    	//  301~313 : ダイヤの1~13
011:    	//  401~413 : クラブの1~13
012:    
013:    	// コンストラクタ
014:    	public CardsManager()
015:    	{
016:    		// 配列を作成
017:    		cards = new int[ 13 * 4 + 1 ];
018:    
019:    		// 初期化
020:    		organize();
021:    	}
022:    
023:    
024:    	// トランプの整列
025:    	public void organize()
026:    	{
027:    		// ジョーカーを格納
028:    		cards[ 0 ] = 0;
029:    
030:    		for ( int i = 1; i <= 13; ++ i ) {
031:    			// スペードを格納(添え字:1~13)
032:    			cards[ i ] = 100 + i;
033:    
034:    			// ダイヤを格納(添え字:14~26)
035:    			cards[ i + 13 ] = 300 + i;
036:    
037:    			// クラブを格納(添え字:27~39)
038:    			cards[ i + 26 ] = 400 + i;
039:    
040:    			// ハートを格納(添え字:40~52)
041:    			cards[ i + 39 ] = 200 + i;
042:    		}
043:    	}
044:    
045:    
046:    	// トランプのシャッフル
047:    	public void shuffle()
048:    	{
049:    		for ( int i = 0; i < cards.length; ++ i ) {
050:    			// 0~(配列aryの個数-1)の乱数を発生
051:    			int rnd = (int)( Math.random() * (double)cards.length );
052:    
053:    			// cards[ i ]とcards[ rnd ]を入れ替える
054:    			int w = cards[ i ];
055:    			cards[ i ] = cards[ rnd ];
056:    			cards[ rnd ] = w;
057:    		}
058:    	}
059:    
060:    
061:    	// トランプの取得
062:    	public int getCard( int num )
063:    	{
064:    		// numが、1~53番目以外の場合、-1を戻す
065:    		if ( ( 1 > num ) || ( 53 < num ) ) return -1;
066:    
067:    		// カードを戻す
068:    		return cards[ num - 1 ];
069:    	}
070:    }
071:    
072:    
073:    // メイン
074:    public class Cards {
075:    	public static void main( String[] args ) {
076:    		// 変数を宣言
077:    		int card, mark, num;
078:    
079:    		// トランプクラスを作成
080:    		CardsManager cards = new CardsManager();
081:    
082:    		// トランプをシャッフル
083:    		cards.shuffle();
084:    
085:    		// トランプを順番に表示
086:    		for ( int i = 1; i <= 53; ++ i ) {
087:    			// i番目のカードを取得
088:    			card = cards.getCard( i );
089:    
090:    			// 結果の表示
091:    			// マーク
092:    			mark = card / 100;
093:    			// 番号
094:    			num = card % 100;
095:    			// 表示
096:    			switch ( mark ) {
097:    				case 0:
098:    					// ジョーカー
099:    					System.out.println( "ジョーカー" );
100:    					break;
101:    				case 1:
102:    					// スペード
103:    					System.out.println( "スペードの" + num );
104:    					break;
105:    				case 2:
106:    					// ハート
107:    					System.out.println( "ハートの" + num );
108:    					break;
109:    				case 3:
110:    					// ダイヤ
111:    					System.out.println( "ダイヤの" + num );
112:    					break;
113:    				case 4:
114:    					// クラブ
115:    					System.out.println( "クラブの" + num );
116:    					break;
117:    			}
118:    		}
119:    	}
120:    }

Cards.javaの出力結果

スペードの1
スペードの11
クラブの10
ジョーカー
ハートの12
ダイヤの11
ハートの2
ダイヤの9
スペードの10

  :

ダイヤの6
ダイヤの7
スペードの6
ダイヤの10
ダイヤの12
クラブの2
ハートの10
スペードの8

この結果から、順番がランダムになったトランプを取り出せたことが確認できます。

それでは、トランプを操作するプログラムのソースコードを解説していきます。

001:    // トランプを操作するクラス
002:    class CardsManager {

トランプを操作するクラス名を、CardsManagerとしています。

003:    	// トランプ配列
004:    	private int[] cards;
005:    
006:    	//  配列の値
007:    	//  000 : ジョーカー
008:    	//  101~113 : スペードの1~13
009:    	//  201~213 : ハートの1~13
010:    	//  301~313 : ダイヤの1~13
011:    	//  401~413 : クラブの1~13

メンバ変数を宣言しています。int型変数cardsは、カードの情報を格納するもので、ジョーカー1枚とスペード・ハート・ダイヤ・クラブの番号1~13の合計53個(1+4×13)の値を格納します。

格納する値は整数で、

  000は、ジョーカー

  101~113は、スペードの1~13

  201~213は、ハートの1~13

  301~313は、ダイヤの1~13

  401~413は、クラブの1~13

です。100の位の値がマークの種類、100未満の値がカードの番号になるようにしています。

013:    	// コンストラクタ
014:    	public CardsManager()
015:    	{
016:    		// 配列を作成
017:    		cards = new int[ 13 * 4 + 1 ];
018:    
019:    		// 初期化
020:    		organize();
021:    	}

クラスコンストラクタで、クラスの初期化を行っています。53個のint型配列を作成し、organizeメソッドでカード情報を格納しています。

024:    	// トランプの整列
025:    	public void organize()
026:    	{
027:    		// ジョーカーを格納
028:    		cards[ 0 ] = 0;
029:    
030:    		for ( int i = 1; i <= 13; ++ i ) {
031:    			// スペードを格納(添え字:1~13)
032:    			cards[ i ] = 100 + i;
033:    
034:    			// ダイヤを格納(添え字:14~26)
035:    			cards[ i + 13 ] = 300 + i;
036:    
037:    			// クラブを格納(添え字:27~39)
038:    			cards[ i + 26 ] = 400 + i;
039:    
040:    			// ハートを格納(添え字:40~52)
041:    			cards[ i + 39 ] = 200 + i;
042:    		}
043:    	}

トランプを整列させるメソッドです。トランプを新品の状態に戻すイメージです。

ここでの整列は、配列cardsに初期値を代入することです。

046:    	// トランプのシャッフル
047:    	public void shuffle()
048:    	{
049:    		for ( int i = 0; i < cards.length; ++ i ) {
050:    			// 0~(配列aryの個数-1)の乱数を発生
051:    			int rnd = (int)( Math.random() * (double)cards.length );
052:    
053:    			// cards[ i ]とcards[ rnd ]を入れ替える
054:    			int w = cards[ i ];
055:    			cards[ i ] = cards[ rnd ];
056:    			cards[ rnd ] = w;
057:    		}
058:    	}

配列cardsの値の順番をランダムに変更しています。

詳細はこちらを参考にしてください。「配列の並び替え」

061:    	// トランプの取得
062:    	public int getCard( int num )
063:    	{
064:    		// numが、1~53番目以外の場合、-1を戻す
065:    		if ( ( 1 > num ) || ( 53 < num ) ) return -1;
066:    
067:    		// カードを戻す
068:    		return cards[ num - 1 ];
069:    	}

指定した番号でカード情報を取得するメソッドです。引数numに1~53の範囲外の値を指定すると-1を戻すようにしています。

0以上の値が戻って来た場合、カード情報の取得に成功したと判断します。

ここまでが、トランプを操作するクラスCardsManagerの説明です。

次に、クラスCardsManagerを使うソースコードの説明です。

073:    // メイン
074:    public class Cards {

クラス名を、Cardsとしています。

075:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

076:    		// 変数を宣言
077:    		int card, mark, num;

このプログラムで使う変数を宣言しています。

079:    		// トランプクラスを作成
080:    		CardsManager cards = new CardsManager();

トランプを操作するクラスCardsManagerを作成しています。

この時点で、CardsManagerのコンストラクタが実行され、トランプの初期化と整列処理が行われます。

082:    		// トランプをシャッフル
083:    		cards.shuffle();

shuffleメソッドで、トランプの並びをランダムに変更します。

085:    		// トランプを順番に表示
086:    		for ( int i = 1; i <= 53; ++ i ) {
087:    			// i番目のカードを取得
088:    			card = cards.getCard( i );

for文で、トランプの1枚目から53枚目までループを作り、getCardメソッドを呼んでカード情報を取得しています。

091:    			// マーク
092:    			mark = card / 100;

取得したカード情報cardを100で割った値をマークの種類を格納する変数markに代入しています。

  mark=0は、ジョーカー

  mark=1は、スペード

  mark=2は、ハート

  mark=3は、ダイヤ

  mark=4は、クラブ

093:    			// 番号
094:    			num = card % 100;

取得したカード情報cardを100で割った余りをカード番号を格納する変数numに代入しています。

  num=0は、ジョーカー

095:    			// 表示
096:    			switch ( mark ) {
097:    				case 0:
098:    					// ジョーカー
099:    					System.out.println( "ジョーカー" );
100:    					break;
101:    				case 1:
102:    					// スペード
103:    					System.out.println( "スペードの" + num );
104:    					break;
105:    				case 2:
106:    					// ハート
107:    					System.out.println( "ハートの" + num );
108:    					break;
109:    				case 3:
110:    					// ダイヤ
111:    					System.out.println( "ダイヤの" + num );
112:    					break;
113:    				case 4:
114:    					// クラブ
115:    					System.out.println( "クラブの" + num );
116:    					break;
117:    			}

変数markと変数numの情報を元に結果をコンソール出力しています。

トランプのマークの仕分けには、switch文を使っています。

■関連コンテンツ

ポーカーの役判定 ポーカーの役を判定
神経衰弱 1人で神経衰弱
配列の並び替え 配列をランダムに並び替える方法を解説
switch文 式による処理の分岐に使用するswitch文について解説
Math.randomの使い方について解説-画像

乱数 random

Math.randomメソッドを使って乱数を発生する方法を解説します。指定範囲の乱数の発生方法も解説しています。

サイコロの目のでる確率は?-画像

サイコロの出目確率

乱数で1から6の数を発生し、それぞれの数値が出現する回数を調べます。

サイコロの目のでる確率は?-画像

ゾロ目の出る確率

2つのサイコロの出目を乱数で1から6の数を発生し、出目が同じときの回数と出現率を調べます。

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

 

Topへ