ゆるゆるプログラミング

・トランプの操作

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

このクラスには、トランプを整列機能(並びを新品の状態にする)、シャッフル機能(ランダムで並び替え)、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文を使っています。

■関連コンテンツ

配列の並び替え 配列をランダムに並び替える方法を解説
switch文 式による処理の分岐に使用するswitch文について解説
for文 繰り返し処理に使用するfor文について解説

■新着情報

2019.09.13 長さの単位変換 1マイル、1フィートは何m?
2019.09.06 クイックソート 高速に配列に並び替える方法
2019.09.05 中央値(メディアン) 配列に格納されている値の中央値を求める
2019.09.05 最頻値 配列から出現回数が最も多い値の取得
2019.09.03 配列値の反転 配列の反転処理
2019.08.05 トランプの操作 トランプを操作するクラス

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

 

 

Topへ