C++ で三目並べゲームを作成する
次の例は、このインタラクティブな 2 プレイヤー三目並べゲームを作成するための基本を示しています。 C++ を使用してプログラミングするためのシンプルで簡単なアプローチを紹介し、新しいデジタル形式で友達と子供時代の挑戦を追体験するための十分に文書化されたソース コードを提供します。次のコードを見てみましょう。
例: 2D 配列を使用しない基本的なコンソールベースの三目並べ
この例では、2D 配列、関数、および if-else 条件を使用して、C++ で三目並べゲームを作成します。このゲームでは、2 人のプレイヤーが順番に手を入力し、勝敗をチェックしてゲームの状態を決定します。次のコードを参照してください。
#include
名前空間 std を使用する ;
空所 ドローボード ( チャー ボード [ 3 】 [ 3 】 ) ;
ブール値はMoveValid ( チャー ボード [ 3 】 [ 3 】 、 整数 行 、 整数 コル ) ;
bool はボードフルです ( チャー ボード [ 3 】 [ 3 】 ) ;
チャー チェック勝者 ( チャー ボード [ 3 】 [ 3 】 ) ;
整数 主要 ( ) {
チャー ボード [ 3 】 [ 3 】 = { { 「」 、 「」 、 「」 } 、 { 「」 、 「」 、 「」 } 、 { 「」 、 「」 、 「」 } } ;
整数 行 、 コル ;
チャー 現在のプレーヤー = 'バツ' ;
その間 ( 真実 ) {
ドローボード ( ボード ) ;
コート << 「プレイヤー」 << 現在のプレーヤー << ' の番です。行 (1-3) と列 (1-3) を入力してください: ' ;
食べる >> 行 >> コル ;
行 --;
コル --;
もし ( isMoveValid ( ボード 、 行 、 コル ) ) {
ボード [ 行 】 [ コル 】 = 現在のプレーヤー ;
チャー 勝者 = チェック勝者 ( ボード ) ;
もし ( 勝者 != 「」 ) {
ドローボード ( ボード ) ;
コート << 「プレイヤー」 << 勝者 << 』が優勝です! \n 」 ;
壊す ;
}
もし ( ボードフルです ( ボード ) ) {
ドローボード ( ボード ) ;
コート << 'それは引き分けです! \n 」 ;
壊す ;
}
現在のプレーヤー = ( 現在のプレーヤー == 'バツ' ) ? 「お」 : 'バツ' ;
} それ以外 {
コート << 「無効な移動です。他のセルを選択してください。 \n 」 ;
} }
戻る 0 ;
}
空所 ドローボード ( チャー ボード [ 3 】 [ 3 】 ) {
コート << 「b| \t 1 \t | \t 2 \t | \t 3 \t | \n 」 ;
コート << 「______________________ \n 」 ;
のために ( 整数 メートル = 0 ; メートル < 3 ; メートル ++ ) {
コート << メートル + 1 << '| ' ;
のために ( 整数 t = 0 ; t < 3 ; t ++ ) {
コート << 「」 << ボード [ メートル 】 [ t 】 ;
もし ( t < 2 ) コート << 」 \t | \t 」 ;
}
コート << 」 \t | \n 」 ;
もし ( メートル < 2 ) コート << 「______________________ \n 」 ;
}
コート << 」 \n 」 ; }
ブール値はMoveValid ( チャー ボード [ 3 】 [ 3 】 、 整数 行 、 整数 コル ) {
戻る ( 行 >= 0 && 行 < 3 && コル >= 0 && コル < 3 && ボード [ 行 】 [ コル 】 == 「」 ) ;
}
bool はボードフルです ( チャー ボード [ 3 】 [ 3 】 ) {
のために ( 整数 メートル = 0 ; メートル < 3 ; メートル ++ ) {
のために ( 整数 t = 0 ; t < 3 ; t ++ ) {
もし ( ボード [ メートル 】 [ t 】 == 「」 ) {
戻る 間違い ;
} } }
戻る 真実 ; }
チャー チェック勝者 ( チャー ボード [ 3 】 [ 3 】 ) {
のために ( 整数 メートル = 0 ; メートル < 3 ; メートル ++ ) {
もし ( ボード [ メートル 】 [ 0 】 == ボード [ メートル 】 [ 1 】 && ボード [ メートル 】 [ 1 】 == ボード [ メートル 】 [ 2 】 && ボード [ メートル 】 [ 0 】 != 「」 ) {
戻る ボード [ メートル 】 [ 0 】 ;
}
もし ( ボード [ 0 】 [ メートル 】 == ボード [ 1 】 [ メートル 】 && ボード [ 1 】 [ メートル 】 == ボード [ 2 】 [ メートル 】 && ボード [ 0 】 [ メートル 】 != 「」 ) {
戻る ボード [ 0 】 [ メートル 】 ;
} }
もし ( ボード [ 0 】 [ 0 】 == ボード [ 1 】 [ 1 】 && ボード [ 1 】 [ 1 】 == ボード [ 2 】 [ 2 】 && ボード [ 0 】 [ 0 】 != 「」 ) {
戻る ボード [ 0 】 [ 0 】 ;
}
もし ( ボード [ 0 】 [ 2 】 == ボード [ 1 】 [ 1 】 && ボード [ 1 】 [ 1 】 == ボード [ 2 】 [ 0 】 && ボード [ 0 】 [ 2 】 != 「」 ) {
戻る ボード [ 0 】 [ 2 】 ;
}
戻る 「」 ;
}
その機能の内訳は次のとおりです。
「#include
このプログラムには、drawBoard()、isMoveValid()、isBoardFull()、および checkWinner() という 4 つの関数プロトタイプがあります。関数宣言は関数プロトタイプと呼ばれます。プログラム内ではmain関数の後に来ますが、これを利用します。メイン関数には、プレイヤーのターンと動きを管理するためのゲーム ループとロジックが含まれています。 main 関数内で、ゲーム ボードがスペースで初期化されます。
チャー ボード [ 3 】 [ 3 】 = { { 「」 、 「」 、 「」 } 、 { 「」 、 「」 、 「」 } 、 { 「」 、 「」 、 「」 } } ;
この後、プレーヤーの移動入力を保存するために 2 つの row 変数とcol 変数が定義されます。 「char currentPlayer = 'X';」 「X」プレーヤーが先攻であると定義します。
ここで、while (真) ゲーム ループが開始され、勝者または引き分けになるまで実行されます。この「while」ループは「drawBoard();」を呼び出します。ボードを表示します。コンソールにボードを表示した後、ユーザーは次のコード ステートメントでマークするセルを選択するように求められます。
コート << 「プレイヤー」 << 現在のプレーヤー << ' の番です。行と列 (1 ~ 3) を入力してください: ' ;
プレイヤーは「cin>>row>>col;」で自分の手を入力します。
マークするセルを選択すると、プログラムはまず入力の有効性を検証し、isMoveValid() 関数を呼び出してセルがまだ入力されていないことを確認します。
ボード [ 行 】 [ コル 】 = 現在のプレーヤー ;このステートメントにより、プレイヤーのマークがボードに配置されます。
チャー 勝者 = チェック勝者 ( ボード ) ;もし ( 勝者 != 「」 ) {
ドローボード ( ボード ) ;
コート << 「プレイヤー」 << 勝者 << 「勝ちます! \n 」 ;
これらのステートメントは、プレイヤーがボード上のエントリにマークを付けるたびに勝者をチェックします。勝者がいる場合は勝者の名前が発表され、プログラムはゲーム ループを終了します。
もし ( ボードフルです ( ボード ) ) {このステートメントは同点かどうかをチェックします。同点条件は、ボードがいっぱいで勝者がいない場合に発生します。この場合、「引き分けだ!」画面に印刷されます。
現在のプレーヤー = ( 現在のプレーヤー == 'バツ' ) ? 「お」 : 'バツ' ;このステートメントにより、プレイヤーが切り替わり、すべてのプレイヤーに自分のターンをプレイする機会が与えられます。
コート << 「無効な移動です。他のセルを選択してください。 \n 」 ;移動が無効な場合、ユーザーは再入力して他のセルを選択するように求められます。
「main」関数の後に、以前に宣言された関数プロトタイプの関数定義が開始されます。ここで定義されている最初の関数は、三目並べボードをコンソールに描画するために使用されるdrawBoard()です。 drawBoard() 関数は、グリッド線を含むボードの現在の状態を出力します。
ここで定義されている次の関数は isMoveValid() です。この関数は、ボード内と空のセルの両方で移動が許可されるかどうかを決定するために使用されます。 isBoardFull() 関数は、ボードがまだいっぱいかどうかを確認するために使用されます。これは、勝者がいない場合の同点の状況の条件です。 isBoardFull() は、ボード上のすべてのポジションが埋まっているかどうかをチェックします。つまり、勝者がいない場合は引き分けであることを示します。勝者がいる場合は、checkWinner() 関数を使用して確認できます。 checkWinner() は、同じプレーヤーのマーク (「X」または「O」) の潜在的な勝ちラインをすべてチェックし、見つかった場合は勝ったプレーヤーのマークを返し、まだ勝者がいない場合はスペース文字「 」を返します。以下はプログラムの出力です。各プレイヤーのすべてのターンが表示されます。
まず、ボードはクリアです。プレーヤー「X」は、マークするセルを選択するように求められます。ここで、プレイヤー「X」は 2 と 2 を入力します。2 行 2 列のセルがマークされます。以下のマーク付きのボードを参照してください。
今度はプレイヤーOの番です。プレーヤーは、マークするセルを選択するように求められます。プレイヤー「O」は行に 1、列に 1 を選択します。次の出力スニペットに示すように、選択したセルはプレーヤー「O」としてマークされます。
各プレイヤーのすべてのターンは同じパターンに従います。プレイヤー X の番になり、プレイヤーは行に 1、列に 2 を選択します。次の出力スナップショットを参照してください。
今度はプレイヤー「O」の番です。プレイヤーは行に 1 を選択し、列に 3 を選択します。
次のターンは再びプレイヤー「X」になります。プレイヤーは行に 3 を、列に 1 を選択します。
プレイヤー「O」は行に 3 を選択し、列に 2 を選択します。
プレイヤー「X」は 2 行目、3 列目を選択します。
プレイヤー「O」は 2 行目と 1 列目を選択します。
プレイヤー「X」は今回は 3 行 3 列目を選択します。
どのプレイヤーも縦、横、斜めにラインを作ることができなかったので引き分けです。選択された入力配列には勝者がありません。
全体として、このコードは、ゲームの状態とユーザー入力の処理を担当するメイン ゲーム ループと、ボードを描画し、動きを検証し、ボード全体をチェックし、勝者がいるかどうかを判断するために使用されるいくつかのユーティリティ関数で構成されています。 。
結論
C++ を使用して三目並べゲームを開発することは、プログラミング スキルを強化するための優れた実践的な演習です。この記事では、C++ で三目並べを作成する方法を正確に説明しています。この記事で提供されるステップバイステップのガイダンスには、読者がゲームの仕組み、ユーザー操作、効率的なコード構造を理解できるように、2D 配列、関数、if-else 条件が含まれています。コードの詳細なウォークスルーと、中核となるゲームプレイに重要な関数の説明により、読者は C++ プログラミングの実践と単純なゲーム開発の複雑さの両方について貴重な洞察を得ることができます。