
《C语言程序设计》
题目黑白棋游戏
一、内容
黑白棋
黑白棋是一种两人对弈的纯策略型棋类游戏,黑白棋棋子分为黑白两色,棋盘为1919,
棋子放置于棋盘线交叉点上或网格中。两人对局,各执一色,轮流下一子,先将横、竖或斜
线的5个同色棋子连成不间断的一排者为胜。
本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前
让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子
时时可见,并且人用输入坐标的操作模式,摆放棋子。
以下简析本程序流程::如表1所示,表中当前落子点坐标为(X,Y),i=X-4,j=Y-4,
由获胜条件可以知,通过判断(X,Y)上、下、左、右、斜上、斜下八个方向上是否有
连续的5个子即可得出是否获胜结果。在游戏开始时,将棋盘初始化,即将棋盘抽
象为一个19*19的数组,数组中每个元素设为某一指定初始值(如8)。1P落子时,
将数组内相应坐标处元素赋值为0;2P落子时,将数组内相应坐标处元素赋值为1。
当(X,Y)上、下、左、右、斜上、斜下八个方向某5个连续的子所对应杂糅 的数组中元
素之和等于0时,1P获胜;当(X,Y)上、下、左、右、斜上、斜下八个方向某5个
连续的子所对应的数组中元素之和等于5时,2P获胜。棋盘上的所有格子都被占满
时,必有181个1P棋子和180个2P棋子,此时对应数组中所有项之和为180,并
且游戏过程中对应数组中所有项之和只可能在这种状况下为180,所以可以用这一
条件判断是否和棋。
i,ji+1,j
i,j+1
X,Y
二、上机环境
操作系统:WindowsXP
开发工具:VC6.0
三、函数调用关系图
图1
四、各函数功能说明
1.main()主函数
(intm,intl)判断输赢界面
intState()显示每次落子结果及棋盘设计
4.p1win()玩家1赢的界面
5.p2win()玩家2赢的界面
()和棋界面
lp()帮助界面
artGame()初始化及指令输入
main
显示初始界面
选择
选择1,调用
void
StartGame()
选择2,调用
voidhelp()
选择3
返回原界面
五、流程图
六、程序运行效果图
1.运行界面
2.选择帮助界面
图4
3.开始游戏界面
图5
2.获胜界面
图6
3.某方认输界面
图7
七、总结
通过对各子程序的设计与优化,本程序完成了五子棋软件的主体的设计与制作,基本
达到了使用五子棋软件的核心要求。然而程序还有一些不足之处,首先,程序在判断胜负后
无法显示第五枚棋子,输入五子连环的第五个棋子坐标之后直接跳出了重新开始的界面,这
是由程序的显示原理造成的;其次,程序的界面过于简陋,而申请说明怎么写 且坐标输入操作也不利于玩家
使用。
在调试过程中,发现每当1P在最外圈落子时,系统即可弹出1P获胜的结果,这是由于
win函数中是通过对落子点及其周围的若干点求和来判断是否获胜的。当1P在最外圈落子
时,棋盘外的点被程序当做0处理,加上落子时被赋值为0的一点,正好满足1P获胜的条
件,故而引发错误。改进方法:将用于判断输赢的数组a由原来的19*19改为21*21,并将
第0、20行及第0、20列中所有元素赋值为6;再将被这四组元素包围的一个19*19的区间
对应到棋盘上的19*19格,即可解决原有问题。在调试的过程中,还发现原有模块中的按键
操作过于复杂,综合兼容性考虑,舍弃原有的光标操作模式,改用输入坐标的操作模式,这
样做从某种程度上降低了程序的可操作性,但提高了程序的可实现性与兼容性。
这次的《计算机程序设计(C)》是计算机科学与技术、网络工程、软件工程专业的重要实践
性课程。程序实习培养了我分析问题和解决问题的能力,而且提供了一个既动手又动脑,独
立实践的机会。使我初步学会了利用C语言编制程序以解决一般实际应用问题,使我分析问
题和解决问题的能力得以提高,从而提高了我对程序设计、程序调试及项目开发的能力。为
后续课程奠定了必要的实践基础。
通过这次程序的实习,我在下述方面的能力得到了锻炼:
1.进一步巩固、加深了所学《计算机程序设计(C)》的基本理论知识,理论联系实际,进一
步让我的综合分析问题,解决问题的能力得以提高。
2.熟练掌握了C语言的基本语法,基本可以灵活运用各种数据类型。
3.对于给定的设计题目,会进行分析,理清思路,并会给出相应的程序流程图。
4.掌握了在开发环境下调试程序的方法和修改程序的能力。
八、参考文献
[1]黑白棋[EB]./view/
[2]湛为芳《C语言程序设计技术》清华大学出版社,2006
九、程序清单
#include
#贴对联的讲究
include
#include
#defineN19
intwin(intm,intl);
voidprintState();
p1win();
p2win();
heqi();
voidhelp();
voidStartGame();
inti,j,k,size=N,isBlack=1,a[N+2][N+2],z;
charstate[N][N],x,y,temp[10],c;
voidStartGame()
/*初始化及指令输入*/
{intm,n,w;
for(i=0;i
{for(j=0;j
{state[i][j]='_';
a[i][j]=6;
}
}
printState();
while(1)
{
printf("nt请%s方下子:",isBlack?"黑":"白");
scanf("%s",temp);
if(!strcmp(temp,"OUT"))
{
return;
}
if(!strcmp(temp,"BACK"招聘启事范文 ))
/*悔棋*/
{
i=x-'A';
j=y-'A';
state[i][j]='_';
printState();
isBlack=!isBlack;continue;
}
if(!strcmp(temp,"LOSE"))
/*认输*/
{printf("nt%s方认输,%s方胜!nn",isBlack?"
黑":"白",isB客家娘酒的做法 lack?"白":"黑");
return;
}
x=temp[0];
y=temp[1];
if(x<'A'||x>'S'||y<'A'||y>'S')
/*避免下面相减的数组越界。*/
{printf("t输入有误,请输入属于
口令。n");continue;
}
i=x-'A';
j=y-'A';
if(state[i][j]!='_')
{printf("t提示:该位置已经有子,请重新指定
坐标!");continue;
}
c=isBlack?'#':'*';
z=isBlack?0:1;
state[i][j]=c;
a[i+1][j+1]=z;
m=i+1;
n=j+1;
w=win(m,n);
if(!w)
{printState();
isBlack=!isBlack;
}
el
{return;
}
}
}
Intwin(intm,intl)
/*判断输赢*/
{intsum1,sum2,sum3,sum4,sum=1,n,i,j,X,Y,w;
w=0;X=m;Y=l;
for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2)
{sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3]
[Y]+a[i+4][Y];
sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i
+4][j+4];
sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j
+4];
sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+
3][j+5+n]+a[i+4][j+4+n];
if(sum1==5||sum2==5||sum3==5||sum崇左旅游景点 4==5)
{p2win();
w=1;
}
if
(sum1==0||sum2==0||sum3==0||sum4==0)
{p1win();
w=1;
}
}
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum++;
if(sum==177)
{heqi();
w=1;
}
returnw;
}
voidprintState()/*
显示每次落子结果及棋盘设计*/
{charp='A';
system("cls");
printf("t棋盘如下:nn");
printf("t");
for(i=0;i
{if(i==0)
printf("");
printf("%c",p+i);
}
printf("nt");
for(i=0;i
{printf("%c",p+i);
for(j=0;j
{printf("%c",state[i][j]);
}
printf("%cnt",p+i);
}
printf("");
for(i=0;i
{if(i==0)
printf("");
printf("%c",p+i);
}
printf("n");
}
heqi()
/*和棋界面*/
{printf("和棋");
printf("你们水平一样哟!!!!!");
return1;
}
p1win()
/*玩家1获胜界面*/
{printf("玩家1获胜,恭喜你哟!!!!!!");
return1;
}
p2win()
/*玩家2获胜界面*/
{printf("玩家2获胜,恭喜你哟!!!!!!");
return1;
}
voidhelp()
/*帮助*/
{system("cls");
printf("t本程序采用19*19的游戏格式nn");
printf("t输入格子的坐标下子:先横坐标后纵
坐标。比如输入:GGnn");
printf("t在游戏期间你可以通过输入OUT(退回
主菜单)、BACK(悔棋)、LOSE(认输)nn");
}
intmain()
/*主函数*/
{system("colorB1");
while(1)
{printf("nt-----C课程设计作业:黑白棋
-----nn");
printf("tt1.开始游戏n");
printf("tt2.帮助n");
printf("tt3.退出n");
printf("nt请选择:");
scanf("%d",&i);
switch(i)
{ca1:StartGame();break;
ca2:help();break;
ca3:return0;
default:printf("t请重新选择n");break;
}
}
}
本文发布于:2023-03-20 11:06:35,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1679281596151630.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:黑白五子棋比赛.doc
本文 PDF 下载地址:黑白五子棋比赛.pdf
| 留言与评论(共有 0 条评论) |