Tic-Tac-Toe游戏中的错误

时间:2012-01-15 19:56:19

标签: c

我一直在尝试用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

7 个答案:

答案 0 :(得分:2)

 if(valid_location(move[10]))
        mark_location(user1, move[10]);
        display_board(board[3][3]);

你必须使用&#34; {&#34;和&#34;}&#34;因为你有2行。

答案 1 :(得分:1)

  1. move语句中使用move[10]代替scanf,以及将其传递给函数时。 move指的是数组,move[10]只表示该数组中的第10个位置。
  2. {}块中的代码周围放置大括号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可能超出范围

另外你的逻辑是错误的,因为显然你只是占据一个位置就不会赢。