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

2020/03/23 公開

・神経衰弱 その4

ここでは神経衰弱のソースコードを解説しています。3回目です。「神経衰弱」

前の説明はこちらを参照してください。「神経衰弱 その3」

それでは、神経衰弱のソースコードを続きを解説していきます。

102:    	// 指定した状態の数を戻す
103:    	private static int getStatusNumber( int status  )
104:    	{
105:    		int number = 0;
106:    
107:    		for ( int i = 0; i < statuses.length; i++ ) {
108:    			if ( statuses[ i ] == status )
109:    				++ number;
110:    		}
111:    
112:    		return number;
113:    	}

引数として与えた状態を持つカードの個数を戻すメソッドです。このメソッドは、まだオープンしていないカードの数を取得したり、全てのカードがペアになっているかの判定に使います。

for文を使って配列statusesの値と引数statusが一致した個数を戻しています。

116:    	// カードを1枚オープン
117:    	private static int openCard()
118:    	{

伏せているカードを1枚オープンするメソッドです。オープンしたカード番号を戻します。(配列添え字ではない)

119:    		// 伏せられたカードの数を取得
120:    		int hidenumber = getStatusNumber( STATUS_HIDE );
121:    		if ( 1 > hidenumber ) return 0;

上記のgetStatusNumberメソッド引数STATUS_HIDEを渡して、伏せているカードの枚数を取得しています。結果はint型変数hidenumberに代入しています。

変数hidenumberが1未満の場合、return文で0を戻します。

123:    		// 1~hidenumberの乱数を発生
124:    		int rnd = (int)( Math.random() * (double)hidenumber ) + 1;

乱数を使って1からhidenumberの値を発生し変数rndに代入しています。変数rndは、伏せているカードの何番目をオープンするかの判定に使います。

Math.randomメソッド

public static double Math.random()
■乱数を返します。

  パラメータ なし

  戻り値     0.0以上、1.0未満の乱数

126:    		// 伏せられたカードのrnd番目のカードをオープン
127:    		int cardnum = 0;
128:    		for ( int i = 0; i < statuses.length; i++ ) {
129:    			if ( STATUS_HIDE == statuses[ i ] ) {
130:    				--rnd;			
131:    				if ( 0 == rnd ) {
132:    					// 状態を"オープンの状態"に変更
133:    					statuses[ i ] = STATUS_OPEN;
134:    					// カード番号を代入
135:    					cardnum = cards[ i ];
136:    					//記憶を登録
137:    					memory[ i ] = cardnum;
138:    					break;
139:    				}
140:    			}
141:    		}

for文を使って配列statusesの値がSTATUS_HIDEのものを探します。見つかったら変数rndから1を引いていき、rndが0になったときのカードをオープンします。

statuses[ i ]にSTATUS_OPENを、変数cardnumにカード番号cards[ i ]を代入しています。そして、memory[ i ]にcardnumを代入します。これで1度オープンしたカードが記憶されます。

143:    		// オープンしたカード番号を戻す
144:    		return cardnum;

メソッドの最後に、return文でオープンしたカード番号crdnumを戻します。

148:    	// 記憶したカード番号で隠されているカードをオープン
149:    	private static boolean openMemoryCard( int cardnum )
150:    	{
151:    		for ( int i = 0; i < statuses.length; i++ ) {
152:    			if ( STATUS_HIDE == statuses[ i ] ) {
153:    				if ( cardnum == memory[ i ] ) {
154:    					// 状態を"オープンの状態"に変更
155:    					statuses[ i ] = STATUS_OPEN;
156:    					return true;
157:    				}
158:    			}
159:    		}
160:    
161:    		return false;
162:    	}

伏せているカードのうち、指定したカード番号を記憶しているカードをオープンするメソッドです。カードをオープンできた場合はtrueを戻し、オープンできなかった場合はfalseを戻します。

for文を使って配列statusesの値がSTATUS_HIDEのものを探します。さらに指定したカード番号cardnumとmemory[ i ]の値が一致したら、そのカードをオープンします。

statuses[ i ]にSTATUS_OPENを代入しています。

165:    	// "オープン状態"の2枚のカード番号が同じかを判定	
166:    	private static boolean isPair()
167:    	{
168:    		int number, cardnum;
169:    
170:    		number = 0;
171:    		cardnum = 0;
172:    		for ( int i = 0; i < statuses.length; i++ ) {
173:    			if ( STATUS_OPEN == statuses[ i ] ) {
174:    				++ number;
175:    				if ( 1 == number ) {
176:    					// 1枚目
177:    					cardnum = cards[ i ]; 
178:    				}
179:    				else {
180:    					// 2枚目
181:    					if ( cardnum == cards[ i ] ) {
182:    						return true;
183:    					}
184:    					break;
185:    				}
186:    			}
187:    		}
188:    
189:    		return false;
190:    	}

オープン状態のカードを2枚探し、そのカード番号が一致しているかを判定しています。2つのカード番号が一致している場合はtrueを、違う場合がfalseを戻します。

変数numberは見つけたオープン状態のカード数で、numberが1の場合に変数cardnumにカード番号を代入しています。numberが2の場合に、cardnumとcards[ i ]の一致判定をしています。

193:    	// 状態の変更(旧状態→新状態)
194:    	private static void replaceStatus( int oldStatus, int newStatus )
195:    	{
196:    		for ( int i = 0; i < statuses.length; i++ ) {
197:    			if ( oldStatus == statuses[ i ] )
198:    				statuses[ i ] = newStatus;
199:    		}
200:    	}

カードの状態を変更するメソッドです。変数oldStatusで与えられた状態を、変数newStatusに変更します。

オープンしたカード(STATUS_OPEN)を伏せる(STATUS_HIDE)などに使います。

続きはこちらです。「神経衰弱 その5」

■関連コンテンツ

神経衰弱 1人で神経衰弱
ポーカーの役判定 ポーカーの役を判定
トランプの操作 トランプを操作するクラス
配列の並び替え 配列をランダムに並び替える方法を解説
switch文 式による処理の分岐に使用するswitch文について解説
値のコンソール表示 print()、println()とは?
Math.randomの使い方について解説-画像

乱数 random

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

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

サイコロの出目確率

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

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

ゾロ目の出る確率

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

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

for文

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

条件による処理の分岐に使用するif文について解説-画像

if文

条件による処理の分岐に使用するif文について解説

■新着情報

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

■広告

 

 

 

 

 

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

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

 

 

 

Topへ