




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言实现简易的三子棋小游戏本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下
1.基本流程
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子并打印棋盘
5.电脑落子并打印棋盘
6.判定胜负关系(输,赢,平局)
2.配置运行环境
本次游戏用到三个文件,两个源文件test.c,game.c,一个头game.h。其中,game.c,game.h可以称作一个游戏模块,为什么要这样做呢?因为多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,也使得代码的可读性提高。
3.代码过程
3.1菜单界面选择开始或者退出游戏
intmain()
test();
return0;
}
打印菜单
voidmenu()
printf("******************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("******************\n");
}
选择数字,1代表玩游戏,0代表退出游戏
voidtest()
intinput=0;
do
{
menu();
printf("请选择:
scanf("%d",input);
switch(input)
{
case1:
printf("玩游戏\n");//游戏
break;
case0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
}
3.2.创建棋盘并初始化。
用一个二维数组创建一个3*3的棋盘。
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
charboard[ROW][COL]={0};
#defineROW3
#defineCOL3
在game.c中初始化棋盘
voidInitBoard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
board[i][j]='';
}
}
}
3.3打印棋盘。
在game.c中实现打印棋盘
voidDisplayboard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
//打印数据
intj=0;
for(j=0;jcol;j++)
{
printf("%c",board[i][j]);
if(jcol-1)
printf("|");
}
printf("\n");
//打印分割的行
if(irow-1)
{
for(j=0;jcol;j++)
{
printf("---");
if(jcol-1)
{
printf("|");
}
}
printf("\n");
}
}
}
棋盘的搭建的本质是留出一片空间,玩家或者电脑在棋盘上进行操作。每一行和每一列都要设置分割线进行区分,才能完成打印。
4.玩家落子并打印棋盘
在game.c中实现对棋盘上空位的判断,防止一个位置多次下棋,并且显示出空位给玩家下棋,之后打印出新的棋盘。
voidplayer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("玩家下棋\n");
while(1)
{
printf("请输入坐标:
scanf("%d%d",x,
//下棋
if(x=1x=rowy=1y=col)
{
if(board[x-1][y-1]=='')
{
board[x-1][y-1]='*';
break;
}
else
printf("该坐标已被占用,请重新输入\n");
}
else
{
printf("数字输入非法,请重新输入\n");
}
}
}
5.电脑落子并打印棋盘
玩家选择一个位置打印后,电脑通过rand()函数产生一个在限定范围内的的随机值,并产生一个随机坐标并在相应坐标打印一个字符(电脑下棋过程),滞后打印新的棋盘。注意:rand函数使用之前要调用一个srand函数。
同样也是在game.c文件中实现。
voidcomputer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("电脑下棋\n");
while(1)
{
x=rand()%row;
//0~2
y=rand()%col;
//0~2
if(board[x][y]=='')
{
board[x][y]='#';
break;
}
}
}
6.判定胜负关系(输,赢,平局)
在玩家与电脑多次落子之后,产生最终的结果,这时候对结果进行分析,相同的3个字符相连(行列对角线)即为胜利,如果棋盘已满但双方都没有完成三个字符相连即为平局。
创建一个is_win函数用它的返回值来表示游戏结果
玩家赢:*
电脑赢:#
平局:E
继续:C
charis_win(charboard[ROW][COL],introw,intcol)
//判断行
inti=0;
for(i=0;irow;i++)
{
if(board[i][0]==board[i][1]board[i][1]==board[i][2]board[i][1]!='')
returnboard[i][1];
}
//判断列
for(i=0;icol;i++)
{
if(board[0][i]==board[1][i]board[1][i]==board[2][i]board[1][i]!='')
returnboard[1][i];
}
//判断对角线
if(board[0][0]==board[1][1]board[1][1]==board[2][2]board[1][1]!='')
returnboard[1][1];
if(board[0][2]==board[1][1]board[1][1]==board[2][0]board[1][1]!='')
returnboard[1][1];
//判断平局
if(is_full(board,row,col)==1)
return'E';
//继续
return'C';
}
每一次玩家与电脑落子后都要进行判断
//判断输赢的代码
char
ret=0;
ret=is_win(board,ROW,COL);
if(ret!='C')
break;
}
在下棋的过程中,还要时时刻刻判断棋盘有没有满。
intis_full(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
if(board[i][j]=='')
return0;//没满
}
}
return1;//(满了)
}
7.整体代码展示
7.1test.c
#includestdio.h
#include"game.h"
voidmenu()
printf("******************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("******************\n");
voidgame()
char
ret=0;
charboard[ROW][COL]={0};
//初始化棋盘为全空格
InitBoard(board,ROW,COL);
//打印棋盘
Displayboard(board,ROW,COL);
while(1)
{
//玩家下棋
player_move(board,ROW,COL);
Displayboard(board,ROW,COL);
//判断输赢
ret=is_win(board,ROW,COL);
if(ret!='C')
{
break;
}
//电脑下棋
随机下棋
computer_move(board,ROW,COL);
Displayboard(board,ROW,COL);
ret=is_win(board,ROW,COL);
if(ret!='C')
{
break;
}
}
if(ret=='*')
{
printf("玩家赢了\n");
}
elseif(ret=='#')
{
printf("电脑赢了\n");
}
else
printf("平局\n");
//什么情况,游戏就结束了
//玩家赢-'*'
//电脑赢-'#'
//平局
-'E'
//继续
-'C'
voidtest()
srand((unsignedint)time(NULL));
intinput=0;
do
{
menu();
printf("请选择:
scanf("%d",input);
switch(input)
{
case1:
game();//游戏
break;
case0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
intmain()
test();
return0;
}
7.2game.c
//初始化棋盘
voidInitBoard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
board[i][j]='';
}
}
//打印棋盘
voidDisplayboard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
//打印数据
intj=0;
for(j=0;jcol;j++)
{
printf("%c",board[i][j]);
if(jcol-1)
printf("|");
}
printf("\n");
//打印分割的行
if(irow-1)
{
for(j=0;jcol;j++)
{
printf("---");
if(jcol-1)
{
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
voidplayer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("玩家下棋\n");
while(1)
{
printf("请输入坐标:
scanf("%d%d",x,
//下棋
if(x=1x=rowy=1y=col)
{
if(board[x-1][y-1]=='')
{
board[x-1][y-1]='*';
break;
}
else
printf("该坐标已被占用,请重新输入\n");
}
else
{
printf("数字输入非法,请重新输入\n");
}
}
//电脑下棋
voidcomputer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("电脑下棋\n");
while(1)
{
x=rand()%row;
//0~2
y=rand()%col;
//0~2
if(board[x][y]=='')
{
board[x][y]='#';
break;
}
}
//判断棋盘有没有满
intis_full(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
if(board[i][j]=='')
return0;//没满
}
}
return1;//(满了)
//判断输赢
charis_win(charboard[ROW][COL],introw,intcol)
//判断行
inti=0;
for(i=0;irow;i++)
{
if(board[i][0]==board[i][1]board[i][1]==board[i][2]board[i][1]!='')
returnboard[i][1];
}
//判断列
for(i=0;icol;i++)
{
if(board[0][i]==board[1][i]board[
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高级网络测试题及答案
- 按揭贷款协议书
- 如何通过数据分析提升品牌策略计划
- 行政管理公共关系活动策划题及答案
- 画板采购合同
- 采购信息整合协议
- 策划机构外包合同
- 车辆维护及出险声明协议
- 股权融资协议
- 公共关系沟通技巧试题及答案
- 小学综合实践《我们的传统节日》说课稿
- 《蚁群算法》课件
- 关于厂房的出售知识讲座
- 新课标下识字教学的方法与实践
- 【瑞幸咖啡财务分析报告(附财务报表)5300字(论文)】
- 基于深度学习的语音分离技术研究
- JGT475-2015 建筑幕墙用硅酮结构密封胶
- 机械工业出版社2020《人工智能导论》课程同步PPT课件第4章 搜索算法
- 【中小企业财务管理存在的问题及对策分析-以A公司为例5100字(论文)】
- 说专业-物流管理专业
- 茶楼组织架构及人员配置方案
评论
0/150
提交评论