在'之前的预期标识符('令牌

时间:2014-12-17 00:28:43

标签: c

请帮帮我。我找不到什么是错的。其中一个括号在if语句中有问题,但我找不到它。

26错误:'('token

之前的预期标识符
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 20
#define COLS 20

int main();

int i, j, direction, x, y;
char board[ROWS][COLS];

srand ((unsigned) time(NULL));

for(i=0; i < ROWS; i++)
 for(j=0; j < COLS; j++)
    board[i][j] = '.';

x = rand() % 20;
y = rand() % 20;
board[x][y] = '*';

direction = rand() % 8;


    if (board[x][y+1] != '.') && (board[x+1][y] != '.') && (board[x-1][y] != '.') && (board[x][y-1] != '.')
     && (board[x+1][y+1] != '.') && (board[x-1][y+1] != '.') && (board[x+1][y-1] != '.') && (board[x-1][y-1] != '.')
    break;
    switch (direction) {
    case 0: if (board[x][y+1] == '.'){
    y++;
    break; }
    case 1: if (board[x+1][y] == '.'){
    x++;
    break; }
    case 2: if (board [x-1][y] == '.'){
    x--;
    break; }
    case 3: if (board[x][y-1] == '.'){
    y--;
    break;}
    case 4: if (board[x+1][y+1] == '.'){
    x++;
    y++;
    break;}
    case 5: if (board[x-1][y+1] == '.'){
    x--;
    y++;
    break;}
    case 6: if (board[x+1][y-1] == '.'){
    x++;
    y--;
    break;}
    case 7: if (board[x-1][y-1] == '.'){
    x--;
    y--;
    break;}
    }

    for(i=0; i < ROWS; i++){
     for(j=0; j < COLS; j++)
        printf("%2d", board[i][j]);
        printf("\n");
   }
   return 0;
}

我想创建一个大小为20 * 20的数组,然后用点打印在屏幕上。然后我将随机选择一个坐标并在rand定义的坐标中打印一个'*'图标。我想移动数组中的*。我试着写它,但我不知道它是否会起作用。

4 个答案:

答案 0 :(得分:2)

你似乎错过了很多'{'和'}'(特别是在主循环上?)。如果它们之后只有一行,那么你并不总是需要将它们放在循环和语句中,但这是一个很好的编码实践,它可以帮助你更快地找到你的问题。如果仍然无效,我建议您这样做并编辑您的答案。

答案 1 :(得分:1)

if (board[x][y+1] != '.') && (board[x+1][y] != '.') && (board[x-1][y] != '.') && (board[x][y-1] != '.')
 && (board[x+1][y+1] != '.') && (board[x-1][y+1] != '.') && (board[x+1][y-1] != '.') && (board[x-1][y-1] != '.')

应该是

if ((board[x][y+1] != '.') && (board[x+1][y] != '.') && (board[x-1][y] != '.') && (board[x][y-1] != '.')
 && (board[x+1][y+1] != '.') && (board[x-1][y+1] != '.') && (board[x+1][y-1] != '.') && (board[x-1][y-1] != '.'))

您需要附上所有这些条件。

虽然有条件执行的唯一声明是紧随其下的break

答案 2 :(得分:1)

编译错误来自:

if (board[x][y+1] != '.') &&

if的正确语法是:

if ( condition )
    statement;

如果你有多个测试,那么你需要将它们全部组合成一个条件;在这种情况下:

if ( (board[x][y+1] != '.') && (board[x+1][y] != '.') /* && ... */ )
    break;

在这种情况下,我建议在{ }周围使用break;,即使它只是一个语句,因为它是如此之大if。< / p>

然而,这个测试实际上是不必要的。您正在测试switch中测试的相同条件,因此没有必要对它们进行两次测试。您可以完全删除if

switch内,break;语句应位于if块之外。无论您是否找到匹配的.,您都不想进入下一个案例。

答案 3 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 20
#define COLS 20

int main(void)
{
    int i, j, direction, x, y;
    char board[ROWS][COLS];

    srand ((unsigned) time(NULL));

    for(i=0; i < ROWS; i++)
        for(j=0; j < COLS; j++)
                board[i][j] = '.';

    x = rand() % 20;
    y = rand() % 20;
    board[x][y] = '*';

    direction = rand() % 8;


        if ((board[x][y+1] != '.') && (board[x+1][y] != '.') && (board[x-1][y] != '.') && (board[x][y-1] != '.') && (board[x+1][y+1] != '.') && (board[x-1][y+1] != '.') && (board[x+1][y-1] != '.') && (board[x-1][y-1] != '.')) 
            return;

    switch (direction) {
            case 0: if (board[x][y+1] == '.')
                    y++;
                break; 
            case 1: if (board[x+1][y] == '.')
                x++;
                break; 
            case 2: if (board [x-1][y] == '.')
                    x--;
                break; 
            case 3: if (board[x][y-1] == '.')
                    y--;
                break;
            case 4: if (board[x+1][y+1] == '.'){
                    x++;
                    y++;
            }
                break;
            case 5: if (board[x-1][y+1] == '.'){
                    x--;
                    y++;
            }
                break;
            case 6: if (board[x+1][y-1] == '.'){
                    x++;
                    y--;
            }
                break;
            case 7: if (board[x-1][y-1] == '.'){
                    x--;
                    y--;
            }
                break;
        }

        for(i=0; i < ROWS; i++) {
            for(j=0; j < COLS; j++)
                printf("%2d", board[i][j]);

        printf("\n");
    }

    return 0;
}

如上所述 - 您没有对if语句加倍。另外,一个单独的休息声明并没有做任何事情。你的意思是返回(退出)?