模拟人机对弈--------“一担挑游戏”
简单设计计算机模拟棋盘对弈。其中棋盘左上角坐标为(1,1),右下角坐标为(3,3)。游戏规则如下:
(1) 计算机移动时,使用相应函数扫描棋盘矩阵,寻找未占单元:发现空单元后,置为“O”,未发现时,报告平局后退出。
(2) 轮到对弈者时,使用相应函数要求对弈者回答想把“X”放在哪里。
(3) 谁先三点一线了,则报告谁胜出。
(4) 计算机与对弈者每下一步棋都会使用相应位置变为“O”和“X”,便于在屏上显示矩阵。
一、 需求分析
该程序模拟人机对弈,具有极大的趣味性。
全程序主要模块包括“设计棋盘格式模块”“玩家移动棋子模块”,“计算机移动棋子模块”以及“判断胜负模块”。“移动棋子模块”模块的难点在于判断人或计算机在棋盘上选择的位置是否合法(包括选择的位置在不在棋盘上及所选择的位置是否为空),“判断胜负模块”的难点在于判断八个“三点一线”内容是否一致,及判断平局。
三、总体设计
一担挑游戏
设计棋盘格式模块
玩家移动棋子模块
计算机移动棋子模块
判断胜负模块
输出比赛结果
四、详细设计
1,主函数流程图
三点一线?
计算机下棋
玩家下棋
制作棋盘
输出比赛结果
2,各功能模块设计
(1) 棋盘设计模块流程图
将棋盘的每一格定义为空
开 始
由位置(1,1)起,至位置(3,3)
棋盘每格之间显示 “ | ”
开 始
已显示至第三行吗?
换行,显示“ -|-|- ”
换 行
该模块首先设置一个3X3的循环,将棋盘的每一个单元定义为空。在程序运行的第一步,主程序调用该模块功能,对棋盘进行初始化。
(2) 玩家移动棋子模块
开 始
选择放置棋子的位置(i,j)
行变量i减一,列变量j减一
该位置为空吗?
错误,重新选择
该位置定义为X
该模块首先选择放置棋子的位置(i,j),之后行变量i减一,列变量j减一。如果该位置为空,则将该单元内容定义为“X”;如果该位置不为空,则返回错误信息并重新运行该模块函数,让人重新选择放置棋子的位置。
(3) 计算机移动棋子模块
由位置(1,1)起判断
开 始
该位置为空吗?
该局比赛结果为平局
行变量i与列变量j分别加一
该位置定义为O
退 出
i与j乘积为9吗?
该模块首先设置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("Its 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++)
{
printf("%c|%c|%c ",qipan[t][0],qipan[t][1],qipan[t][2]);
if(t!=2)
printf("\n-|-|-\n");
}
printf("\n");
}
char check(void)
{
int i;
for(i=0;i<3;i++)
if(qipan[i][0]==qipan[i][1]&&qipan[i][0]==qipan[i][2])
return qipan[i][0];
for(i=0;i<3;i++)
if(qipan[0][i]==qipan[1][i]&&qipan[0][i]==qipan[2][i])
return qipan[0][i];
for(i=0;i<3;i++)
if(qipan[0][0]==qipan[1][1]&&qipan[0][0]==qipan[2][2])
return qipan[0][0];
for(i=0;i<3;i++)
if(qipan[0][2]==qipan[1][1]&&qipan[1][1]==qipan[2][0])
return qipan[0][2];
return ;
}
(2)程序运行截图
初始化棋盘,显示棋盘格式
人选择棋子位置,但是必须在3X3的范围内。否则,显示错误并且重新选择。
人机继续对奕,直到判断三点一线,输出比赛结果
展开阅读全文