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

・Javaソースダウンロード(ShinkeiSuijaku.java)

自動で神経衰弱を行うJavaソースコード例です。始めのほうはランダムにカードをめくっていきますが、徐々に記憶したカード番号をめくっていくようにしています。参考にしてください。

このソースについての記事はこちら「神経衰弱」です。

ShinkeiSuijaku.javaをダウンロード

ダウンロードしたファイルはzip形式です。解凍して使ってください。Windowsの場合、ダウンロードしたzipファイルをマウスの右ボタンでクリックして表示されるポップアップメニューから「すべて展開(T)」で解凍できます。

// 神経衰弱
public class ShinkeiSuijaku {
	// カードの状態を表す定数
	final static int STATUS_HIDE = 0;	// 伏せられた状態
	final static int STATUS_OPEN = 1;	// オープンの状態
	final static int STATUS_PAIR = 2;	// 揃った状態

	// カード番号を格納する配列
	static int[] cards;

	// カードの状態を格納する配列
	static int[] statuses;

	// オープンしたカードを記憶する配列
	static int[] memory;


	// カードの初期化
	private static void initCards()
	{
		// カードを格納する配列
		cards = new int[ 52 ];

		// カードを配列に格納し、シャフルする
		for ( int i = 0; i < cards.length; i++ )
			cards[ i ] = ( i / 4 ) + 1;

		for ( int i = 0; i < cards.length; ++ i ) {
			// 0~(配列cardsの個数-1)の乱数を発生
			int rnd = (int)( Math.random() * (double)cards.length );

			// cards[ i ]とcards[ rnd ]を入れ替える
			int w = cards[ i ];
			cards[ i ] = cards[ rnd ];
			cards[ rnd ] = w;
		}
	}


	// 状態の初期化
	private static void initStatuses()
	{
		statuses = new int[ 52 ];
		// カードの状態を"隠された状態"にする
		for ( int i = 0; i < statuses.length; i++ )
			statuses[ i ] = STATUS_HIDE;
	}


	// 記憶の初期化
	private static void initMemory()
	{
		memory = new int[ 52 ];
		for ( int i = 0; i < memory.length; i++ )
			memory[ i ] = 0;
	}


	// カードの出力
	private static void outputCards()
	{
		for ( int i = 0; i < cards.length; ++ i ) {
			//
			switch ( statuses[ i ] ) {
				case STATUS_HIDE:
					System.out.print( "*" );
					break;

				case STATUS_OPEN:
				case STATUS_PAIR:
					switch ( cards[ i ] )
					{
						case 10:
							System.out.print( "A" );
							break;
						case 11:
							System.out.print( "J" );
							break;
						case 12:
							System.out.print( "Q" );
							break;
						case 13:
							System.out.print( "K" );
							break;

						default:
							System.out.print( cards[ i ] );
							break;
					}
					break;
			}

			// カード13枚ごとに改行
			if ( 0 == ( ( i + 1 ) % 13 ) )
				System.out.println();
		}
		// 改行
		System.out.println();
	}


	// 指定した状態の数を戻す
	private static int getStatusNumber( int status  )
	{
		int number = 0;

		for ( int i = 0; i < statuses.length; i++ ) {
			if ( statuses[ i ] == status )
				++ number;
		}

		return number;
	}


	// カードを1枚オープン
	private static int openCard()
	{
		// 伏せられたカードの数を取得
		int hidenumber = getStatusNumber( STATUS_HIDE );
		if ( 1 > hidenumber ) return 0;

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

		// 伏せられたカードのrnd番目のカードをオープン
		int cardnum = 0;
		for ( int i = 0; i < statuses.length; i++ ) {
			if ( STATUS_HIDE == statuses[ i ] ) {
				--rnd;			
				if ( 0 == rnd ) {
					// 状態を"オープンの状態"に変更
					statuses[ i ] = STATUS_OPEN;
					// カード番号を代入
					cardnum = cards[ i ];
					//記憶を登録
					memory[ i ] = cardnum;
					break;
				}
			}
		}

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


	// 記憶したカード番号で隠されているカードをオープン
	private static boolean openMemoryCard( int cardnum )
	{
		for ( int i = 0; i < statuses.length; i++ ) {
			if ( STATUS_HIDE == statuses[ i ] ) {
				if ( cardnum == memory[ i ] ) {
					// 状態を"オープンの状態"に変更
					statuses[ i ] = STATUS_OPEN;
					return true;
				}
			}
		}

		return false;
	}


	// "オープン状態"の2枚のカード番号が同じかを判定	
	private static boolean isPair()
	{
		int number, cardnum;

		number = 0;
		cardnum = 0;
		for ( int i = 0; i < statuses.length; i++ ) {
			if ( STATUS_OPEN == statuses[ i ] ) {
				++ number;
				if ( 1 == number ) {
					// 1枚目
					cardnum = cards[ i ]; 
				}
				else {
					// 2枚目
					if ( cardnum == cards[ i ] ) {
						return true;
					}
					break;
				}
			}
		}

		return false;
	}


	// 状態の変更(旧状態→新状態)
	private static void replaceStatus( int oldStatus, int newStatus )
	{
		for ( int i = 0; i < statuses.length; i++ ) {
			if ( oldStatus == statuses[ i ] )
				statuses[ i ] = newStatus;
		}
	}
	

	// メイン
	public static void main( String[] args ) {
		// カードの初期化
		initCards();

		// 状態の初期化
		initStatuses();

		// 記憶の初期化
		initMemory();

		// 神経衰弱本体
		// 無限ループを作成(ループを抜ける条件をなし)
		for ( int turn = 1; ; ++ turn ) {
			// ターン番号の出力
			System.out.println( "ターン:" + turn );

			// カードを出力(オープン前の状態)
			outputCards();

			// カードをランダムに1枚オープン
			int cardnum1 = openCard();

			// 記憶しているカードがあればそのカードをオープン
			if ( !openMemoryCard( cardnum1 ) ) {
				// カードをランダムに1枚オープン
				int cardnum2 = openCard();
			}
			else {
				System.out.println( "記憶からカードをオープン!" );
			}

			// カードを出力(オープン後の状態)
			outputCards();

			// オープンしているカードがペアかどうか判定
			if ( isPair() )
				replaceStatus( STATUS_OPEN, STATUS_PAIR );
			else
				replaceStatus( STATUS_OPEN, STATUS_HIDE );

			// 全てペアになったらループを抜ける
			if ( 52 == getStatusNumber( STATUS_PAIR ) )
				break;
		}

		// カードの最終結果を出力
		System.out.println( "最終結果" );
		outputCards();
	}
}

このソースについての記事はこちら「神経衰弱」です。

 

■新着情報

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

■広告

 

 

 

 

Topへ