터미널/콘솔을 통해 재생되는 tic tac toe 프로그램을 작성 중입니다. 플레이어 1 또는 2가이긴 후에 사용자가 다시 재생할 수있는 선택권을 부여합니다. 1 = 다시 재생하십시오. , 2를 종료하십시오. 그러나, 2를 입력하면 나던 작업을 종료스위치 케이스를 사용하여 C++ 프로그램이 종료되지 않음
//tie check, replay, use pointer notation
#include <iostream>
using namespace std;
void initialize(char [][3]);
void player1(char [][3]);
void player2(char [][3]);
void display(char [][3]);
char check(char [3][3]);
int main()
{
char board[3][3];
char end = '*';
int row1, column1, row2,column2;
bool replay = true;
//replay loop
do
{
//set board to *
initialize(board);
//game loop
display(board);
do
{
//player 1 turn
player1(board);
//check if player 1 won
end = check(board);
if(end != '*')
{
int input;
/* winner!*/
cout << "Player 1 Won!\n";
do
{
cout << "Play Again?\n1.Yes\n2.No\nEnter 1 or 2: ";
cin >> input;
if (input > 2 || input < 1)
cout << "Invalid Option\n";
}while(input > 2 || input < 1);
switch (input)
{
case '1':
replay = true;
break;
case '2':
cout << "Thank you for playing.\n";
exit(0);
break;
}
}
//player 2 turn
player2(board);
//check if player 2 won
end = check(board);
if (end == 'O')
{
int input;
/* winner!*/
cout << "Player 2 Won!\n";
do
{
cout << "Play Again?\n1.Yes\n2.No\nEnter 1 or 2: ";
cin >> input;
if (input > 2 || input < 1)
cout << "Invalid Option\n";
}while(input > 2 || input < 1);
switch (input)
{
case '1':
replay = true;
break;
case '2':
cout << "Thank you for playing.\n";
exit(0);
break;
}
}
}while (end == '*');
}while (replay == true);
return 0;
}
void initialize(char array[][3])
{
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 3;j++)
array[i][j] = '*';
}
cout << "New Game\n";
}
void player1(char array[][3])
{
int row1, column1;
cout << "Player 1\nRow: ";
cin >> row1;
while (row1 < 0 || row1 > 2)
{
cout << "Enter a number between 0 and 2 for Row:: ";
cin >> row1;
}
cout << "Column: ";
cin >> column1;
while (column1 < 0 || column1 > 2)
{
cout << "Enter a number between 0 and 2 for Column: ";
cin >> column1;
}
if (array[row1][column1] == '*')
array[row1][column1] = 'X';
else
{
cout << "Space Occupied\n";
player1(array);
}
display(array);
}
void player2(char array[][3])
{
int row2,column2;
cout << "Player 2\nRow: ";
cin >> row2;
while (row2 < 0 || row2 > 2)
{
cout << "Enter a number between 0 and 2 for Row: ";
cin >> row2;
}
cout << "Column: ";
cin >> column2;
while (column2 < 0 || column2 > 2)
{
cout << "Enter a number between 0 and 2 for Column: ";
cin >> column2;
}
if (array[row2][column2] == '*')
array[row2][column2] = 'O';
else
{
cout << "Space Occupied\n";
player2(array);
}
display(array);
}
void display(char array[][3])
{
for (int x = 0;x < 3;x++)
{
for (int y = 0;y < 3;y++)
cout << array[x][y] << " ";
cout << endl;
}
}
char check(char array[3][3])
{
int i;
/* check rows */
for(i=0; i<3; i++)
if(array[i][0] == array[i][1] && array[i][0] == array[i][2])
return array[i][0];
/* check columns */
for(i=0; i<3; i++)
if(array[0][i] == array[1][i] && array[0][i] == array[2][i])
return array[0][i];
/* test diagonals */
if(array[0][0] == array[1][1] && array[1][1] == array[2][2])
return array[0][0];
if(array[0][2] == array[1][1] && array[1][1] == array[2][0])
return array[0][2];
return '*';
}
코드가 냄새를 가지고 이상한. 'player1'과'player2' 함수는 본질적으로 동일합니다 ... 그들을 합칠 방법을 찾으십시오. – mpen
그래 ... 나는 그 진부함에 꽤 아파. 복제 된 코드를 통합하면 버그 및 코드 업데이트가 줄어들 것이라고 새로운 사람에게 설명 할 수 있습니다. 나는 항상 "냄새"라는 단어를 사용하는 "냄새"라고 생각합니다. –
마찬가지로, 승리 조건을 확인하는 코드는 플레이어간에 복제됩니다. 플레이어 특정 코드를 플레이어 번호를 사용하는 함수로 이동시키는 간단한 리팩터링을 사용하면 훨씬 간단하고 유지 관리가 쉬워집니다. – ceo