一担挑游戏---模拟人机对弈——C语言
模拟人机对弈--------“一担挑游戏”
简单设计计算机模拟棋盘对弈。其中棋盘左上角坐标为(1,1),右下角坐标为(3,3)。游戏规则如下:
计算机移动时,使用相应函数扫描棋盘矩阵,寻找未占单元:发现空单元后,置为“O”,未发现时,报告平局后退出。
轮到对弈者时,使用相应函数要求对弈者回答想把“X”放在哪里。
谁先三点一线了,则报告谁胜出。
计算机与对弈者每下一步棋都会使用相应位置变为“O”和“X”,便于在屏上显示矩阵。
需求分析
该程序模拟人机对弈,具有极大的趣味性。
全程序主要模块包括“设计棋盘格式模块”“玩家移动棋子模块”,“计算机移动棋子模块”以及“判断胜负模块”。“移动棋子模块”模块的难点在于判断人或计算机在棋盘上选择的位置是否合法(包括选择的位置在不在棋盘上及所选择的位置是否为空),“判断胜负模块”的难点在于判断八个“三点一线”内容是否一致,及判断平局。
三、总体设计
四、详细设计
1,主函数流程图
2,各功能模块设计
棋盘设计模块流程图
该模块首先设置一个3X3的循环,将棋盘的每一个单元定义为空。在程序运行的第一步,主程序调用该模块功能,对棋盘进行初始化。
玩家移动棋子模块
该模块首先选择放置棋子的位置(i,j),之后行变量i减一,列变量j减一。如果该位置为空,则将该单元内容定义为“X”;如果该位置不为空,则返回错误信息并重新运行该模块函数,让人重新选择放置棋子的位置。
计算机移动棋子模块
该模块首先设置3X3的循环,从(1,1)开始,依次判断每一个单元是否为空。为空时,则将该位置定义为“O”;若不为空,则继续运行。当移动至(3,3),即行变量i与列变量j乘积为9时,若该单元依然不为空,则判定该局比赛结果为平局
(4)判断胜负模块
”
该模块首先设置3X3的循环,依次判断每行,每列以及左斜列,右斜列的内容是否相同。不相同时,返回至主函数;若相同,则将变量result定义为相同的内容。最后,根据结果显示谁赢。
五、(1)程序代码
#include "stdio.h"
#include "stdlib.h"
void init_qipan();
void player_move();
void computer_move();
void disp();
char check();
int main(void)
{
char done;
done=' ';
init_qipan();
do
{
disp();
player_move();
done=check();
if(done!=' ')
break;
computer_move();
done=check();
}
while(done==' ');
if(done=='X')
printf("You won!\n");
else
printf("You lost! \n");
disp();
getchar();
return 0;
}
char qipan[3][3];
void init_qipan(void)
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
qipan[i][j]=' ';
}
void player_move(void)
{
int x,y;
printf("It's your turn:");
scanf("%d%*c%d",&x,&y);
x--;y--;
if(qipan[x][y]!=' ')
{
printf("Error, try again.\n");
player_move();
}
else qipan[x][y]='X';
}
void computer_move(void)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(qipan[i][j]==' ')
break;
if(qipan[i][j]==' ')
break;
}
if(i*j==9)
{
printf("pingju\n");
exit(0);
}
else
qipan[i][j]='0';
}
void disp(void)
{
int t;
for(t=0;t<3;t++)
{