#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//#define ROW 3
//#define COL 3
int ROW = 3;
int COL = 3;
int is_full(char board[ROW][COL],int ROW,int COL)
{
int i = 0;
for(i=0; i<ROW; i++)
{
int j = 0;
for(j=0; j<COL; j++)
{
if(board[i][j]==' ')
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL],int ROW,int COL)
{
int i = 0;
for(i=0; i<ROW; i++)
{
if(board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for(i=0; i<COL; i++)
{
if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
if(board[0][0] == board[1][1] && board[1][1] == board[2][2] &&board[1][1] != ' ')
{
return board[1][1];
}
if(board[0][2] == board[1][1] && board[1][1] && board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
if(is_full(board,ROW,COL)==1)
{
return 'Q';
}
return 'c';
}
void computer(char board[ROW][COL],int ROW,int COL)
{
printf("电脑下棋\n");
while(1)
{
int x = rand()%ROW;
int y = rand()%COL;
if(board[x][y]==' ')
{
board[x][y] = '#';
break;
}
}
}
void player(char board[ROW][COL],int ROW,int COL)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
while(1)
{
printf("请输入坐标:\n");
scanf("%d %d",&x,&y);
if(x>=1&&x<=ROW&&y>=0&&y<=COL)
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("坐标已被占用,请重新输入\n");
}
}
else
{
printf("坐标输入有误,请重新输入\n");
}
}
}
void print(char board[ROW][COL], int ROW, int COL)
{
int i = 0;
for(i=0; i<ROW; i++)
{
int j = 0;
for(j=0; j<COL; j++)
{
printf(" %c",board[i][j]);
if(j<COL-1)
printf("|");
}
printf("\n");
if(i<ROW-1)
{
for(j=0; j<COL; j++)
{
printf("---");
}
}
printf("\n");
}
}
void Createboard(char board[ROW][COL],int ROW,int COL)
{
int i = 0;
for(i=0; i<ROW; i++)
{
int j = 0;
for(j=0; j<COL; j++)
{
board[i][j] = ' ';
}
}
}
void game()
{
char ret;
char board[ROW][COL];
//初始化棋盘
Createboard(board,ROW,COL);
//打印棋盘
print(board,ROW,COL);
while(1)
{
//玩家下棋
player(board,ROW,COL);
//打印棋盘
print(board,ROW,COL);
// char ret;
ret = is_win(board,ROW,COL);
if(ret!='c')
{
break;
}
//电脑下棋
computer(board,ROW,COL);
//打印棋盘
print(board,ROW,COL);
ret = is_win(board,ROW,COL);
if(ret!='c')
{
break;
}
}
if(ret == '*')
{
//system("cls");
printf("玩家赢!\n");
}
else if(ret == '#')
{
//system("cls");
printf("电脑赢\n");
}
else if(ret == 'Q')
{
//system("cls");
printf("平局\n");
}
}
void menu()
{
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d",&input);
switch(input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
设计思路
1.先从main函数进入,然后进入test函数,test函数一开始定义了整形变量input用于玩家做选择,do…while循环打印菜单,input作为循环的条件,menu函数实现了对菜单的打印,再循环内部用switch进行判断,如果玩家选择有误的话就会循环打印菜单,如果选择1,就跳转到game函数内部,进行对游戏的实现,如果选择0,根据while后面括号里的判断,循环结束。
2.游戏部分实现的过程是,首先考虑玩家在下棋之前棋盘的位置应该置与空格代替,即是棋盘初始化的部分,首先得先定义数组,因为玩家下棋的棋子是要存储在数组当中的,接下来调用了creatboard函数进行棋盘初始化,该函数传参的时候,将二维数组的首地址,以及行和列传进去,函数内部通过两组循环实现对数组的整体初始化,将内容都初始化为空格。
3.接下来就是棋盘的打印,棋盘的打印用了print函数,该函数内部同样是两组循环,除了打印初始化后的数组后,按照最初棋盘设想,打印棋盘的分割线。
4.接下来就是玩家下棋的过程,玩家下棋同样写进函数里,定义了两个变量x和y分别代表玩家下进去的两个坐标,但是要注意几种情况,一是玩家输入的坐标超出了棋盘的范围,这时候就要对玩家做相应的友好提示,所以用if else语句来判断玩家的输入是否合法,第二在玩家输入的坐标没有超出棋盘范围的情况下,同样要判断玩家输入的坐标是否是空值,这点是为了保证玩家的输入与棋盘上已经存在的值不出现冲突,所以要嵌套一个if语句,同样判断部分要考虑玩家不知道数组的下标是0开始的,所以要-1的操作。
5.电脑下棋的过程就是在函数内部,用rand函数生成随机数,调用函数,必须在之前调用srand函数,该函数只用调用一次,所以写在了test里面,并调用了time函数,接下来有一点需要说明的是电脑下棋的时候将两个坐标都取模了行和列,规定死了它们范围,注意这部一定要放在循环里面目的是如果电脑生成了随机值,就下一部#,如果电脑生成的随机值处有值了不符合情况的话,就重新生成,刚开始我把这两个随机值的生成放在了外部,结果出现了问题。
6.在上述过程完成后就还需要一个判断输赢的机制,Is_win函数是用来判断输赢情况的,任意一方出现三子相连的情况就有赢家产生。
7.is_full函数是为了判断平局才设置的函数,目的是为了遍历整个数组,看是否出现空值,如果数组全都填满了元素的话,就说明只能出现平局的情况。
8.game函数中的while循环是为了让玩家下棋和电脑下棋一直进行下去,直到有赢家产生。

3821

被折叠的 条评论
为什么被折叠?



