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メソッド
■乱数を返します。 パラメータ なし 戻り値 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()とは? |
乱数 randomMath.randomメソッドを使って乱数を発生する方法を解説します。指定範囲の乱数の発生方法も解説しています。 |
|
サイコロの出目確率乱数で1から6の数を発生し、それぞれの数値が出現する回数を調べます。 |
|
ゾロ目の出る確率2つのサイコロの出目を乱数で1から6の数を発生し、出目が同じときの回数と出現率を調べます。 |
|
for文繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。 |
|
if文条件による処理の分岐に使用するif文について解説 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告