我一直在尝试用C编写一个井字游戏,除非我遇到了一些我不明白的错误。我知道这仍然需要一些工作但是现在我只想在添加之前运行程序。有人能帮我吗?这是我的代码:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
int board[3][3] = {
{0, 0, 0},
{0, 0, 0},
{0, 0, 0}
};
int main (void)
{
int const user1 = 1;
int const user2 = 2;
char move[10];
while (! all_locations_filled()) {
printf("User-1, please enter your move:");
scanf("%s", move[10]);
if(valid_location(move[10]))
mark_location(user1, move[10]);
display_board(board[3][3]);
else if(won_the_game(user1)
printf("Congratulations User-1, You Won the Game!");
break;
else
printf("Invalid Move");
printf("User-2, please enter your move:");
scanf("%s", move[10]);
if(valid_location(move[10]))
mark_location(user2, move[10]);
display_board();
else if(won_the_game(user2)
printf("Congratulations User-2, You Won the Game!");
break;
else
printf("Invalid Move");
return 0;
}
bool valid_location(char str[10]) {
int strcmp(x, y);
if (strcmp(str[10], "upperLeft") == 0 || strcmp(str[10], "up") == 0 || strcmp(str[10], "upperRight") == 0 || strcmp(str[10], "left") == 0 || strcmp(str[10], "center") == 0 || strcmp(str[10], "right") == 0 || strcmp(str[10], "lowerLeft") == 0 || strcmp(str[10], "down") == 0 || strcmp(str[10], "lowerRight") == 0)
return true;
}
void mark_location(int userU, char str[10]) {
int strcmp(x, y);
if (strcmp(str[10], "upperLeft") == 0)
board[0][0] = userU;
else if (strcmp(str[10], "up") == 0)
board[0][1] = userU;
else if (strcmp(str[10], "upperRight") == 0)
board[0][2] = userU;
else if (strcmp(str[10], "left") == 0)
board[1][0] = userU;
else if (strcmp(str[10], "center") == 0)
board[1][1] = userU;
else if (strcmp(str[10], "right") == 0)
board[1][2] = userU;
else if (strcmp(str[10], "lowerLeft") == 0)
board[2][0] = userU;
else if (strcmp(str[10], "down") == 0)
board[2][1] = userU;
else if (strcmp(str[10], "lowerRight") == 0)
board [2][2] = userU;
}
char display_board(int array[][]) {
int i, j;
for (i=0; i<3; ++i)
for (j=0; j<3; ++j)
if (array[i][j] == 0)
print("-");
else if (array[i][j] == 1)
print("x");
else if (array[i][j] == 2)
print("o");
}
void all_locations_filled() {
int i, j;
for (i=0; i<3; ++i)
for (j=0; j<3; ++j)
if board[i][j] == 0
return false;
return true;
}
bool won_the_game(userU) {
int i, j;
if (board[0][j] == userU)
return true;
else if (board[1][j] == userU)
return true;
else if (board[2][j] == userU)
return true;
else if (board[i][0] == userU)
return true;
else if (board[i][1] == userU)
return true;
else if (board[i][2] == userU)
return true;
else
return false;
}
以下是编译器给我的错误:
tictactoe.c: In function ‘main’:
tictactoe.c:19: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
tictactoe.c:24: error: expected expression before ‘else’
tictactoe.c:115: error: expected declaration or statement at end of input
tictactoe.c:115: error: expected declaration or statement at end of input
答案 0 :(得分:2)
if(valid_location(move[10]))
mark_location(user1, move[10]);
display_board(board[3][3]);
你必须使用&#34; {&#34;和&#34;}&#34;因为你有2行。
答案 1 :(得分:1)
move
语句中使用move[10]
代替scanf
,以及将其传递给函数时。 move
指的是数组,move[10]
只表示该数组中的第10个位置。{}
块中的代码周围放置大括号if / else
,如果它们不只是一行代码(或者最好总是,但这是样式问题。)答案 2 :(得分:1)
我发现了一些错误......
scanf("%s", move[10]);
你想在这做什么?如果要读取字符串,请使用
scanf("%s", move );
如果您只想在数组的第10个位置读取一个字符,请使用
scanf("%c", &move[9] );
请注意,您的数组被声明为move [10],因此它的位置从move [0]移动到[9]。位置移动[10]无效。
下面:
if(valid_location(move[10]))
mark_location(user1, move[10]);
display_board(board[3][3]);
else if(won_the_game(user1)
printf("Congratulations User-1, You Won the Game!");
break;
else
printf("Invalid Move");
你可能意味着:
if(valid_location(move[10]))
{
mark_location(user1, move[10]);
display_board(board[3][3]);
}
else if(won_the_game(user1)
{
printf("Congratulations User-1, You Won the Game!");
break;
}
else
printf("Invalid Move");
在这里:
void all_locations_filled() {
int i, j;
for (i=0; i<3; ++i)
for (j=0; j<3; ++j)
if board[i][j] == 0
return false;
return true;
}
你忘记了“if”中的()。它应该是:
if (board[i][j] == 0)
此外,您必须在调用之前声明您的函数。因此,在main之前声明de函数。
您不必在那里实现它,只需声明。例如:
void all_locations_filled();
int main (void)
{
...
}
在最后一个函数中:
bool won_the_game(userU)
你必须定义“userU”的类型。
你也忘记在主结束时关闭括号“}”。
答案 3 :(得分:0)
您正在尝试扫描整数,但scanf参数需要一个字符串(char数组)。请尝试%d
而不是%s
。这是十进制数的Formatstring。
答案 4 :(得分:0)
如果您想在if之后放置多条指令,则应在{}
中关闭它。
否则,编译器认为只有第一个是条件状态,其余的应该完成。
答案 5 :(得分:0)
scanf("%s", move);
不是scanf("%s", move[10]);
if(valid_location(move))
不是if(valid_location(move[10]))
mark_location(user1, move);
不是mark_location(user1, move[10]);
if (strcmp(str, "upperLeft") == 0)
不是if (strcmp(str[10], "upperLeft") == 0)
等。等
在每次使用数组后,通过放置方括号,不在C中执行数组。你基本上在两种情况下使用方括号,你在声明数组,在这种情况下括号包含数组的大小,你正在访问数组的元素,在这种情况下括号包含索引。
您可能不希望听到这个,但您的代码还有很多其他问题。您可能需要阅读一本书,并开始更简单。
答案 6 :(得分:0)
在处理完编译器错误后,您可能需要查看函数won_the_game,它正在读取未初始化的变量i和j,并且可能会给您“访问冲突”错误,因为i和j可能超出范围
另外你的逻辑是错误的,因为显然你只是占据一个位置就不会赢。