我正在尝试为 Tic Tac Toe 游戏制作一个条件检查器,以在玩家获胜时宣布。我创建了如下所示的函数。但是,当我调用它并尝试应用获胜条件时,什么也没有发生。我知道这是一个乏味的功能,但我对如何使其有效和高效感到困惑。
功能:
int checker_o(char aray[3][3]){
if(aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void map(char a[3][3]){
int row, column;
for(row=0;row<3;row++){
for(column=0;column<3;column++){
printf ("%c ", a[row][column]);
}
printf("\n \n \n \n \n");
}
}
float getRand() {
return ((rand() / (RAND_MAX+1.0))*8)+1;
}
int control(int ui, int kb){
if (kb=='b'){
ui--;
}
if(kb=='c' && 0<ui &&ui<4){
ui+=5;
}
else{
if(kb=='c' && 3<ui &&ui<7){
ui--;
}
else{
if(kb=='c' && 6<ui &&ui<10){
ui-=7;
}
}
}
return ui;
}
int checker_o(char aray[3][3]){
if(aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
system("cls");
printf("Player 'O' Wins!");
getchar();
return 0;
}
}
int checker_x(char aray[3][3]){
if(aray[0][0]=='X'&& aray[0][1]=='X'&& aray[0][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[1][0]=='X'&& aray[1][1]=='X' && aray[1][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[2][0]=='X'&& aray[2][1]=='X'&& aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='X'&& aray[1][0]=='X' && aray[2][0]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][1]=='X'&& aray[1][1]=='X' && aray[2][1]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='X'&& aray[1][2]=='X' && aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][0]=='X'&& aray[1][1]=='X' && aray[2][2]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
if(aray[0][2]=='X'&& aray[1][1]=='X' && aray[2][0]=='X'){
system("cls");
printf("Player 'X' Wins!");
getchar();
return 0;
}
}
int main(){
int r,c,ui,cntr,cntr2,ran,g,x;
char kb, aray[3][3]={{'.','.','.'},{'.','.','.'},{'.','.','.'}};
srand( time(NULL) );
getRand();
map(aray);
printf("Which keyboard method would u prefer? \n \n \n");
printf("(a)\t \t (b)\t \t (c)\n \n easy \t \t mobile \t #Pad \n \n 0 1 2 \t \t 1 2 3 \t \t 7 8 9\n \n");
printf(" 3 4 5 \t \t 4 5 6 \t \t 4 5 6 \n \n 6 7 8 \t \t 7 8 9 \t \t 1 2 3 \n \n \n");
scanf("%c", &kb);
system("cls");
map(aray);
do{
printf("Your Move! \n \n");
scanf("%i", &ui);
ui=control(ui,kb);
r=ui/3;
c=ui%3;
if(aray[r][c]=='X'|| aray[r][c]=='O'){
printf("'X/O' Already exists there \n");
getchar();
getchar();
return 0;
}
else{
aray[r][c]='X';
system("cls");
map(aray);
checker_x(aray);
}
ran=getRand();
g=ran/3;
x=ran%3;
if(aray[g][x]=='.'){
aray[g][x]='O';
system("cls");
map(aray);
}else{
do{
ran=getRand();
g=ran/3;
x=ran%3;
}while (aray[g][x]!='.');
aray[g][x]='O';
system("cls");
map(aray);
checker_o(aray);
}
} while (checker_x(aray)!=1 || checker_o(aray)!=1);
getchar();
}
最佳答案
毕竟 if 语句你需要放置语句
return 0;
否则函数有未定义的行为。
另外你在这个语句中有一个错字
if (aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
^^^
必须有
if (aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
^^^
考虑到这段代码
system("cls");
printf("Player 'O' Wins!");
getchar();
return 1;
是重复的。
您可以重写函数,使该代码片段在函数中只出现一次。
例如
const size_t N = 3;
int winner = 0;
for ( size_t i = 0; !winner && i < N; i++ )
{
size_t j = 0;
while ( aray[i][j] == 'O' && j < N ) j++;
winner = j == N;
}
//...
if ( winner )
{
system("cls");
printf("Player 'O' Wins!");
getchar();
}
return winner;
您可以为要检查的字符再引入一个参数。最好不要在程序中使用魔数(Magic Number)和其他文字。给它们起有意义的名字。
考虑到最好使用英文单词 array
而不是 aray
。
关于c - 这是一个有效的 Tic Tac Toe 获胜条件检查器功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33322919/