如何解决使用堆栈为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 举报,一经查实,本站将立刻删除。