微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用堆栈为C中的Connect 4游戏创建undo'function'

如何解决使用堆栈为C中的Connect 4游戏创建undo'function'

这是我第一次在此网站上提问,所以我在做什么或做错任何事情时深表歉意。

我目前正在用C语言开发一个connect 4游戏,我在板上使用char 2d数组,该数组具有与堆栈相同的结构。板上装有''。因此,我目前正在尝试创建一个功能”,用户可以在其中使用堆栈撤消之前的操作。堆栈包含用户输入以供其输入的列号。所以我遍历行,而column变量等于堆栈的顶部。然后,如果它等于相应的玩家部分(X或O),但不等于'',则项目设置为''。

    void Turn(struct stack *s,int turn,int row,int column,int gameOver)
{
    int j = 0,flag = 0;
    char piece[2] = {'X','O'};
    
    printf("\nEnter '0' to save and go back to the main menu.\n");
    
    if(turn == 0)
        printf("Player 1\nEnter column no.:\n");
    else
        printf("Player 2\nEnter column no.:\n");
    
    scanf("%i",&j);
    if(j == 0)
    {           
        MainMenu(s,turn);
    }
    if(j == 8)
    {
        pop(s);
        j = s->array[s->top];
        while(flag == 0)
        {   
            if(turn == 1)
                turn = 0;
            else
                 turn = 1;
                 
            for(int i = 0; i < row; ++i)
            {
                if(s->board[i][j] != ' ' && s->board[i][j] == piece[turn])
                {
                    s->board[i][j] = ' ';
                    flag = 1;
                }
            }
        }
        Game(s,turn,row,column);
    }
    else
        push(s,j);
        DropPiece(s,column,j,gameOver,piece);
}

现在,它可以在数组的底部行正常工作,但只能运行一次,而在较高行中的任何内容都将进入无限循环。这就是我感到困惑的地方,我不知道为什么它会进入无限循环。虽然,我不能说我最擅长调试,尤其是在C语言方面。

另外,在任何人提到之前,我确实意识到并非我的所有代码都能正常工作(我相信winningmove函数),我只是专注于使撤消功能正常工作。

在此先感谢您提供任何建议或帮助,以下是整个代码

#include <stdio.h>

void MainMenu(struct stack *s,int turn);
void PrintBoard(struct stack *s,int column);
void Turn(struct stack *s,int gameOver);
void DropPiece(struct stack *s,int choice,int gameOver,char piece[2]);
void PopulateBoard(struct stack *s,int column);
int WinningMove(struct stack *s,char piece[2],int turn);

int gameOver = 0;

struct stack
{
    char** board;
    int array[70];
    int top;
};

void init_stack(struct stack *s)
{
    s->top = -1;
}

void push(struct stack *s,int item)
{
    if(s->top == 70-1)
    {
        printf("Stack is full. Can't undo");
        return;
    }
    s->top++;
    s->array[s->top] = item;
}

void *pop(struct stack *s)
{
    int *data;
    if(s->top == -1)
    {
        printf("Stack is empty\n");
        return NULL;
    }
    data = &s-> array[s->top];
    s->top--;
    return data;
}

int main()
{
    struct stack s;
    int turn = 0;
    
    init_stack(&s);
    MainMenu(&s,turn);
}

void Game(struct stack *s,int column)
{
    while(gameOver == 0)
    {
        PrintBoard(s,column);
        Turn(s,gameOver);
    }
}

void MainMenu(struct stack *s,int turn)
{
    int choice,row = 6,column = 7;
    
    system("cls");
    
    printf("-----------------------------\n"
           "----------MAIN MENU----------\n"
           "-----------------------------\n"
           "(1)6x7 Board\n"
           "(2)8x7 Board\n"
           "(3)10x7 Board\n"
           "(4)Load PrevIoUs Game\n"
           "(0)Exit\n"
           "Please enter your choice:\n");
    
    scanf("%d",&choice);
    
    switch(choice)
    {
        case 1:
            PopulateBoard(s,column);
            Game(s,column);
            break;
            
        case 2:
            break;
            
        case 3:
            break;
            
        case 4:
            break;
            
        case 0:
            system("cls");
            exit(0);
            break;
    }
}

void PrintBoard(struct stack *s,int column)
{
    system("cls");
    printf("\n");
    for(int i = 0; i < row; i++)
    {
        for(int j = 0; j < column; j++)
        {
            printf("+---");
        }
        printf("+\n"
               "|");
              
        for(int j = 0; j < column; j++)
        {
            printf(" %c |",s->board[i][j]);
        }
        printf("\n");
    }
    
    for(int j = 0; j < column; j++)
        {
            printf("+---");
        }
        printf("+\n");
    
    for(int j = 0; j < column; j++)
        {
            printf("  %i ",j+1);
        }
}

void PopulateBoard(struct stack *s,int column)
{
    s->board = (char **)malloc(row*sizeof(char *));
    
    for(int i = 0; i < row; i++)
        s->board[i] = (char *)malloc(column*sizeof(char *));
    
    for(int i = 0; i < row; i++)
        for(int j = 0; j < column; j++)
            s->board[i][j] = ' ';
}

void Turn(struct stack *s,piece);
}

void DropPiece(struct stack *s,char piece[2])
{
    if(choice <= column && choice > 0)
    {
        choice--;
        
        for(int i = row - 1; i < row; i--)
        {
            if(s->board[i][choice] == ' ')
            {
                s->board[i][choice] = piece[turn];
                WinningMove(s,piece,turn);
                
                if(turn == 0)
                    turn = 1;
                else
                    turn = 0;
                
                Game(s,column);
            }
            else if(i == 0 && s->board[i][choice] != ' ')
            {
                printf("\nColumn is full\n");
                Turn(s,gameOver);
            }
        }
    }
}

int WinningMove(struct stack *s,int turn)
{
    //Vertical Check
    for(int i = 0; i < row-3; i++)
        for(int j = 0; j < column; j++)
            if(s->board[i][j] != ' ' && s->board[i][j] == piece[turn] && s->board[i][j] == s->board[i+1][j]
                && s->board[i][j] == s->board[i+2][j] && s->board[i][j] == s->board[i+3][j])
            {
                gameOver = 1;
                return gameOver;
            }
    //Horizontal check
    for(int i = 0; i < row; i++)
        for(int j = 0; j < column-3; j++)
            if(s->board[i][j] != ' ' && s->board[i][j] == piece[turn] && s->board[i][j] == s->board[i][j+1]
                && s->board[i][j] == s->board[i][j+2] && s->board[i][j] == s->board[i][j+3])
            {
                gameOver = 1;
                return gameOver;
            }
    //Positive diagonal check
    for(int i=0; i < row-3; i++)
        for(int j = 0; j < column-3; j++)
            if(s->board[i][j] != ' ' && s->board[i][j] == piece[turn] && s->board[i][j] == s->board[i+1][j+1] 
                && s->board[i][j] == s->board[i+2][j+2] && s->board[i][j] == s->board[i+3][j+3])
            {
                gameOver = 1;
                return gameOver;
            }
    //negative diagonal check   
    for(int i=3; i < row; i++)
        for(int j = 0; j < column-3; j++)
            if(s->board[i][j] != ' ' && s->board[i][j] == piece[turn] && s->board[i][j] == s->board[i-1][j+1]   
                && s->board[i][j] == s->board[i-2][j+2] && s->board[i][j] == s->board[i-3][j+3])
            {
                gameOver = 1;
                return gameOver;
            }
    
    return gameOver;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。