一担挑游戏 c语言,一担挑游戏---模拟人机对弈——C语言.doc

本文详细介绍了如何设计和实现一个3x3棋盘的人机对弈游戏,称为“一担挑”。游戏规则、主要模块(棋盘初始化、玩家移动、计算机移动和胜负判断)和程序代码都进行了阐述。玩家和计算机轮流在棋盘上下棋,直至出现三点一线或平局。程序通过检查行、列和对角线来确定胜者。
摘要由CSDN通过智能技术生成

模拟人机对弈--------“一担挑游戏”

简单设计计算机模拟棋盘对弈。其中棋盘左上角坐标为(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的范围内。否则,显示错误并且重新选择。

人机继续对奕,直到判断三点一线,输出比赛结果

展开阅读全文

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值