【问题标题】:C Chomp questions?C Chomp 问题?
【发布时间】:2013-11-05 16:27:23
【问题描述】:

我正在尝试创建游戏 Chomp。我已经完成了一半,但是卡住了。

游戏将有 5 种不同的功能。不允许使用指针和结构。

这就是我已经走了多远,我一直在努力解决一些问题,但我不知道如何自己解决这些问题,所以我想我可以在这里得到一些帮助。

BUG

a) 如果你先输入 2 2 然后输入 2 1 会说这个位置已经被吃掉了,即使这是一个完全有效的吃饭姿势。而不是检查位置是否是 != 'O' 我应该检查它是否是 == 'O',但这也行不通,因为在 check_move() 循环行和 col 不会总是 O...

b) 如果您输入的位置不在矩阵内(即20 20),则会出现行错误。我不明白为什么。当然我只想显示一个错误,而不是两个。

c)如果你输入一个已经被吃掉的位置,你会得到多次错误“已经被吃掉!”,因为循环是循环的打印几次。

问题

a)玩家 1玩家 2 之间切换的最佳方式是什么?我想过每次玩家进行有效移动时都会增加 +1 的 int。然后我会检查 int 的值是奇数还是偶数。奇数 = 玩家 1,偶数 = 玩家 2,反之亦然。但这行不通,因为我不允许拥有比目前更多的全局变量。而且我只能从一个函数返回一个值 (check_move())。

#include <stdio.h>

int height    =  4;
int width     = 10;
char matrix[4][10];


void initialize()
{
    for(int row = 0; row < height; row++)
        for(int col = 0; col < width; col++)
            matrix[row][col] = 'O';         
}



void print_board()
{
    printf("\n\n");

    for(int row = 0; row < height; row++)
    {
        for(int col = 0; col < width; col++)
        {
            printf("%c", matrix[row][col]);
        }
        printf("\n");
    }   
    printf("\n\n");
}



void get_move(int player, int input[])
{
    printf("Player %d, make your move: ", player);
    scanf("%d %d", &input[0], &input[1]);
}



int check_move(int position[])
{
    int row     = position[0];
    int col     = position[1];
    int status  =           1;

    if(row <= height  &&  col <= width)
    {
        for(row; row <= height; row++)
        {
            for(col; col <= width; col++)
            {
                // Checks if position already has been eaten
                if(matrix[row-1][col-1] != 'O')
                {
                    printf("Already eaten!\n");
                    status = 0; 
                }

            }
        }       
    }


    else if(row >= height  ||  col >= width)
    {
        printf("Your move must be inside the matrix!\n");
        status = 0;
    }

    return status;
}



void update_board(int x, int y)
{

    for(int xi = x; xi <= 10; ++xi)
    {
        for(int yi = y; yi <= 10; ++yi)
            matrix[xi-1][yi-1] = ' ';       
    }

}



int main(void)
{

    int player = 1;
    int position[2]; 

    initialize();
    print_board();

    while(1){

        get_move(player, position);

        check_move(position);


        while(check_move(position) != 1)
        {
            printf("Try again!\n\n");        
            get_move(player, position);
        }

        update_board(position[0], position[1]);

        print_board();

    }

    getchar();
    getchar();
    getchar();


    return 0;
}

【问题讨论】:

    标签: c


    【解决方案1】:

    错误 a 和 c:

    你的check_move函数有问题,你应该只测试所打的位置是否被吃掉,其他位置的状态不相关:

    int check_move(int pos[])
    {
        if(pos[0] < 1 || pos[0] > height  ||  pos[1] < 1 || pos[1] > width)
        {
            printf("Your move must be inside the matrix!\n");
            return 0;
        }
    
        if(matrix[ pos[0] - 1 ][ pos[1] - 1 ] != 'O' ) {
            printf("Already eaten!\n");
            return 0; 
        }
    
        return 1;
    }
    

    错误 b:

    您收到两次错误消息,因为您在 main 中调用了两次 check_move

    check_move(position);
    while(check_move(position) != 1)
    

    只需删除无用的第一次调用check_move()

    问题一:

    您可以通过更新 main 中的变量 player 在玩家之间切换:

    player = (player + 1) % maxNumberOfPlayer;
    

    这将从0 变为maxNumberOfPlayer - 1,因此您可以使用printf("Player %d, make your move: ", player + 1); 以获得更用户友好的输出。另外,如果maxNumberOfPlayer = 2player = (player + 1) % 2; 等价于player = !player

    【讨论】:

    • 谢谢!我无法让玩家号码工作。它始终保持为 0。main 包含 int player = 1;player = (player + 1) % 2get_move() 包含 printf("Player %d, make your move: ", player + 1);
    • @user2952320 您应该将其初始化为 0 而不是 1 并且仅在循环之外。如果你确实打印player + 1,我看不出它如何打印0
    • 我将它初始化为 0,它一直只打印 Player 2。
    • 我将它初始化为 0,它一直只打印 Player 2。
    【解决方案2】:

    main 中,在你的 while 循环中添加:

    player = !player;
    

    这将在 0 和 1 之间切换 player

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多