五子棋游戏C语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五子棋游戏程序设计(C语言实现)
一、设计任务与目标
设计两个人对战的五子棋游戏,游戏开始界面是显示游戏的规则,然后让用户输入命令以确定游戏是否开始,如果用户确定开始,那么要显示棋盘,接下来到了最重要的几步,两个玩家交替落子,当连续五个棋子在一条直线上时,一方赢棋,游戏结束。其中,有些问题就是平时基本的输入输出问题,例如:游戏规则,可以直接打印。棋盘的显示也是一般的图形输出问题,但是稍微复杂一些。需要改进的地方和达到的目标是:
1、游戏的初始界面显示的是游戏规则,当玩家确定开始的时候要清除界面来显示棋盘。
2、棋盘和棋子的显示,界面(棋子和棋盘)容易分辨,这要从颜色和图形上加以区分。
3、要求一方用‘W’(上)、‘S’(下)、‘A’(左)、‘D’(右),另一方用‘↑’、‘↓’、‘←’、‘→’来移动光标,再分别用‘Z’和‘空格’键确定落子。
4、当一方走棋时,另一方的按键应该设置为无效。
5、游戏进行时打印提示信息,当一方赢棋后,要显示赢棋的字符,并询问玩家是否继续开始。
6、可以随时退出游戏或重新开始游戏。
二、方案设计与论证
首先设置游戏的初始界面,采用白色背景和红色前景,这可以调用‘conio.h’库函数实现打印游戏规则。询问玩家是不是开始游戏,通过选择Y\N来确定。其中会遇到这样的问题:当玩家输入的不是‘Y(y)’或者‘N(n)’时应该怎么办呢?如果采用scanf函数来接收命令,这样会显示一个不满足要求的字符,于是可以用getch函数来接收命令,判断输入的字符是否为‘Y(y)’和‘N(n)’,如果是再显示出来。为了界面的简洁,进入游戏前先清除屏幕,调用‘system()’函数来实现。
然后打印棋盘,可以把背景设置为湖蓝色,这样棋盘和棋子更容易分辨。游戏开始后棋盘用黑色显示,这样易于区分。具体的思路是:由于棋盘是网格状的,所以选择一个基本图形字符串‘十’,通过循环打印而构成一张大图。
接下来确定落子的位置,这需要通过改变光标的位置来实现,考虑到是在vc6.0环境下编译文件,c语言中的有些库函数并不支持,所以选择了’gotoxy()’函数并结合‘window.h’下的函数,通过键盘按键控制达到光标移动功能。定义一个二维数组来记录棋子落点数据,当棋盘上的某一个位置有棋子时,能判断这个位置不能再落子了。因为游戏设置的是两个玩家操作不同的按键来控制的,所以当一方走棋时,另一方的按键要设置成无效,采用的办法是过滤接收的字符。例如,当玩家一走棋时,只有当输入的字符为‘W’、‘A’、‘S’、‘D’、‘Z’、‘Q’、‘Esc’时,才响应,而‘↑’、‘↓’、‘←’、‘→’、‘空格’以及其他字符则不响应。
最后是判断输赢。根据五子棋规则,如果连续的五个相同颜色的棋子在一条直线上就算赢。于是用代码实现时,就确定了基本的思路:利用for循环来遍历棋盘上的落点。这里有四种情况,分别是从左往右,从上往下,从左下往右上,从左上往右下,判断是否有五子连续在一直线上,并且连续五个位置记录的数据相等时就打赢某一方赢了。要重新开始就输入‘Q’。
三、程序框图或流程图,程序清单与调用关系
程序清单:
程序调用关系:
程序流程图:
void movegb() luozi()
V oid drawqipan() void judgewin() i=1,j=1
i<20
j<20 是是否
i++
否
j++
输出‘十’
结束
否
棋子数小于
五
棋子为
黑棋
传来棋子数
棋手1赢
棋手2赢
结束
是
是
否
int StartGame()
四、全部源程序清单
#include
#include
#include
#define play1up 'w'
#define play1down 's'
#define play1left 'a'
#define play1right 'd'
#define play2up 72
#define play2down 80
#define play2left 75
#define play2right 77
#define play1lq 'z'
#define play2lq ' '
#define N 20
#define playnext 'q'
#define exit 27
int m=1; /*游戏循环控制*/
int count=1; /*回合计数器*/
int t=0; /*代表坐标交叉点有无棋子的状态*/
int flag=1; /*输赢标志符*/
int p[N][N]; /*记录棋盘落子情况*/
char q[N][N]; /*记录棋盘交叉点棋子种类*/
struct zuobiao /*坐标位置*/
{
int x;
int y;
}weizhi;
//------------------
void gotoxy(int x, int y) /*建立坐标函数*/
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
//-------------------
void drawqipan()/*建立棋盘*/
{
int i,j;
for(i=0;i { for(j=0;j { p[i][j]=0;q[i][j]='o'; printf("╋"); } printf("\n"); } } //-------------------- void movegb(char press)/*光标的移动*/ { switch(press) { case play1up:if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weizhi.y=19;break;/*玩家1光标向下移动*/ case play1down:if(weizhi.y<20)weizhi.y++;if(weizhi.y>19)weizhi.y=0;break;/*玩家1光标向上移动*/ case play1left:if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)weizhi.x=19;break;/*玩家1光