[解決済み] C++と多次元配列を使ったチックタックトー【終了しました
2022-02-12 20:53:37
質問内容
皆さん、ありがとうございました!プログラミングは初めてで、不器用な私ですが、よろしくお願いします。動作するようになりました! ゲームオーバーのチェックに使うforループや、盤面の設定に使うカウンタなど、コードにいくつか問題がありました。しかし、最終的なコードにはバグがないようです。コンソールに、2人が一緒に遊べるようなラベル付きのマスがプリントアウトされるのです。今、とても幸せです。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool over = false;
void print_board(char board[3][3])
{
cout<<"\n------------------\n";
cout<<"\n "<<board[0][0]<<" | "<<board[0][1]<< " | "<<board[0][2];
cout<<"\n------------------\n";
cout<<"\n "<<board[1][0]<<" | "<<board[1][1]<< " | "<<board[1][2];
cout<<"\n------------------\n";
cout<<"\n "<<board[2][0]<<" | "<<board[2][1]<< " | "<<board[2][2];
cout<<"\n------------------\n";
}
bool checkForCorrectMove (char board[3][3], int choice, bool player1Turn)
{
int xCor;
int yCor;
xCor = ((choice + 2) / 3) - 1;
yCor = (choice - 1) % 3;
if (((board[xCor][yCor]) != 'X') && ((board[xCor][yCor]) != 'O'))
{
if (player1Turn)
board[xCor][yCor] = 'X';
if (!player1Turn)
board[xCor][yCor] = 'O';
return true;
}
else
return false;
}
bool checkRow(char board[3][3])
{
for (int i = 0; i<3; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
{
return true;
}
}
return false;
}
bool checkColumn (char board[3][3])
{
for (int i = 0; i<3; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
{
return true;
}
}
return false;
}
bool checkForWin (char board[3][3])
{
bool win = false;
bool line_win = false;
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
win = true;
return win;
}
if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]))
{
win = true;
return win;
}
if (checkColumn(board) || checkRow (board))
{
win = true;
return win;
}
return win;
}
int main()
{
cout << "Welcome to Tic Tac Toe!\n";
int choice;
int boardcounter = 1;
bool isOkayToMove = true;
bool player1Turn = true;
char board[3][3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
board[i][j] = boardcounter + '0';
boardcounter++;
}
}
print_board(board);
do {
if (player1Turn)
{
cout <<"\n\nPlayer 1, please enter a number that corresponds to an open space: ";
}
else
{
cout <<"\n\nPlayer 2, please enter a number that corresponds to an open space: ";
}
cin>>choice;
isOkayToMove = checkForCorrectMove(board, choice, player1Turn);
if (isOkayToMove)
{
over = checkForWin(board);
print_board(board);
player1Turn = !player1Turn;
}
else
{
cout <<"\n\nYou have attempted to move into a space that is already occupied, please try again.";
print_board(board);
}
}
while (over == false);
cout <<"\n\nCongratulations!";
player1Turn = !player1Turn;
if (player1Turn)
cout<<" Player 1 has won!";
else
cout<<" Player 2 has won!";
}
C++でチックタックトーのゲームを作ろうとしているのですが、苦戦しています。以前にも質問されたことがあると思いますが、私の具体的なコード(C++を勉強中です)の何が問題なのか、他の人の例を見てもなかなかわからないのです。以下がそのコードです。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool over = false;
void print_board(char board[3][3])
{
cout<<"\n------------------\n";
cout<<"\n "<<board[0][0]<<" | "<<board[0][1]<< " | "<<board[0][2];
cout<<"\n------------------\n";
cout<<"\n "<<board[1][0]<<" | "<<board[1][1]<< " | "<<board[1][2];
cout<<"\n------------------\n";
cout<<"\n "<<board[2][0]<<" | "<<board[2][1]<< " | "<<board[2][2];
cout<<"\n------------------\n";
}
bool checkForCorrectMove (char board[][3], int choice, bool player1Turn)
{
int xCor;
int yCor;
switch(choice)
{
case 1: xCor = 0, yCor = 0;
case 2: xCor = 0, yCor = 1;
case 3: xCor = 0, yCor = 2;
case 4: xCor = 1, yCor = 0;
case 5: xCor = 1, yCor = 1;
case 6: xCor = 1, yCor = 2;
case 7: xCor = 2, yCor = 0;
case 8: xCor = 2, yCor = 1;
case 9: xCor = 2, yCor = 2;
}
if (((board[xCor][yCor]) != 'X') && ((board[xCor][yCor]) != 'O'))
{
if (player1Turn)
board[xCor][yCor] = 'X';
if (!player1Turn)
board[xCor][yCor] = 'O';
return true;
}
else
return false;
}
bool checkForWin (char board[][3])
{
bool win = false;
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
{
win = true;
}
else if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]))
{
win = true;
}
for (int i = 0; i<3; i++)
{
for (int j = 0; i < 3; j++)
{
if (board[i][j] != board [i][0]);
win = false;
}
}
for (int i = 0; i<3; i++)
{
for (int j = 0; i < 3; j++)
{
if (board[i][j] != board [0][j]);
win = false;
}
}
return win;
}
int main()
{
cout << "Welcome to Tic Tac Toe!\n";
int choice;
int boardcounter = 1;
bool isOkayToMove = true;
bool player1Turn = true;
char board[3][3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
board[i][j] = (char) boardcounter;
boardcounter++;
}
}
print_board(board);
do {
if (player1Turn)
{
cout <<"\n\nPlayer 1, please enter a number that corresponds to an open space: ";
}
else
{
cout <<"\n\nPlayer 2, please enter a number that corresponds to an open space: ";
}
cin>>choice;
switch(choice);
isOkayToMove = checkForCorrectMove(board, choice, player1Turn);
if (isOkayToMove)
{
print_board(board);
over = checkForWin(board);
player1Turn = !player1Turn;
}
else
{
cout <<"\n\nYou have attempted to move into a space that is already occupied, please try again.";
print_board(board);
}
}
while (over == false);
cout <<"\n\nCongratulations!";
if (player1Turn)
cout<<" Player 1 has won!";
else
cout<<" Player 2 has won!";
}
解決方法は?
私が発見した問題です。
int boardcounter = 1;
//...
for (int j = 0; j < 3; j++)
{
board[i][j] = (char) boardcounter;
boardcounter++;
}
問題は、キャストの
(char)
は変換されません。
int
変数から
テキスト
を表現します。 キャストは実際に整数をより小さなサイズの整数型変数に変換します。
数字を文字に変換する方法は、次のようにたくさんあります。
snprintf
,
tostring
および
ostringstream
.
0〜9の数字という限られた範囲なので、これで済んでしまうかもしれません。
board[row][column] = '0' + boardcounter;
あなたのコードを見直して、整数が変換されている他の場所を見つけることをお勧めします。
char
で、適宜変更してください。
ちなみに、ほとんどの三目並べゲームでは、「'」、「X」、「O」を値として使用します。
関連
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] "お知らせ 未定義変数"、"Notice: Notice: 未定義のインデックス", "Notice:未定義のインデックス", "Notice."。PHPを使用した「未定義のオフセット
-
[解決済み] C#の多次元配列と配列の配列の違いは何ですか?
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] 配列のベクトルを扱う正しい方法