五子棋游戏C语言.docx
- 文档编号:17741490
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:31
- 大小:64.50KB
五子棋游戏C语言.docx
《五子棋游戏C语言.docx》由会员分享,可在线阅读,更多相关《五子棋游戏C语言.docx(31页珍藏版)》请在冰点文库上搜索。
五子棋游戏C语言
五子棋(C语言)
摘要
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
早在“尧造围棋”之前,可能民间就已有五子棋游戏。
发展于日本,流行于欧美。
五子连珠棋五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
Abstracts
Gobangisakindofrightastwopurestrategytypechessgame,isoriginatedfromtheancientChinesetraditionalblackwhitekindofone.Longbefore\"YaoZaogo\",maybethefolkhasgobanggame.DevelopmentinJapan,popularinEuropeandtheUnitedStates.Arowchessgobangeasier,foryoungandold,andfun,fascinating;Cannotonlyenhancethinkingability,improveintelligence,andhighinphilosophy,helpstocultivateone'smoralityraisesagender.
Gobangcannotonlyenhancethinkingability,improveintelligence,andhighinphilosophy,helpstocultivateone'smoralityraisesagender.Gobanghasobviouscharacteristicsofmodernleisure\"short,flat,fast\",andhasaprofoundknowledgeofclassicalphilosophy\"YinandYangyi\";Ithasthecharacteristicsofeasytolearn,areverypopularamongthepeople,andprofoundskillsandahighlevelofinternationalcompetition;It'schessculturesourceYuanLiulong,havethemysteriousOrientalandwesternintuitive;Boththeconceptof\"field\",alsohasa\"dot\"connection.ItisthepointofcommunicationbetweenChineseandwesternculture,itisthecrystallizationofancientandmodernphilosophy.
目录
1.前言1
2.功能描述2
3.总体设计3
3.1功能模块设计3
3.1.1游戏执行主流程3
3.1.2游戏界面预览3
3.1.3游戏棋子控制5
3.1.5游戏胜负判断7
3.1.6游戏帮助7
3.2数据结构设计7
4.程序实现12
4.1源码分析12
4.1.1程序预处理12
4.1.2主函数main()16
4.1.3初始化界面21
4.1.4时钟中断处理22
4.1.5游戏胜负的显示24
4.1.7游戏棋子的显示和清除29
4.1.8游戏结果操作判断处理34
4.2运行结果40
4.2.1游戏初始状态40
4.2.2游戏进行状态41
5.结论42
6.程序附录
致谢43
参考文献44
1.前言
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
早在“尧造围棋”之前,可能民间就已有五子棋游戏。
发展于日本,流行于欧美。
五子连珠棋五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
C语言则是目前国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具备强大的功能而受到编程人员的普遍青睐。
它既适合作为系统描述语言,也可以用来编写系统软件,还可以来编写应用软件。
用C语言来编写俄罗斯方块这个游戏有较大优势:
C语言具有各种各样的数据类型,并引入了指针概念,使得程序效率更高;C语言还包含很广泛的运算符;另外C语言具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断能力也比较强大。
选择此论文题是旨在训练基本编程能力和游戏开发技巧,熟悉C语言图形模式下的编程。
本程序中涉及结构体、数组、时钟中断及绘图等方面的知识。
通过本程序的训练,能对C语言有一个更深刻的了解,掌握五子棋游戏开发的基本原理,为将来开发出高质量的游戏软件打下坚实的基础。
2.功能描述
如图2.1所示,本游戏主要实现一下几种功能:
图2.1五子棋游戏功能描述图
(1)初始化模块。
进入程序后按提示操作游戏。
(2)下棋操作模块。
按1进入游戏UPDOWNLIGHTRIGHT为方向操作键,空格为落子键
(3)判断胜负模块。
玩家游戏过程中,一方达到获胜条件后系统自动判定胜负,并进入主界面,重新开始下轮游戏。
(4)帮助模块,帮助玩家了解游戏操作等功能。
3.总体设计
3.1功能模块设计
3.1.1游戏执行主流程
本五子棋游戏执行主流程图3.1所示。
在判断键值时,有判断五子是否练成
一线,玩家是否获胜的判断
图3.1游戏执行主流程图
3.1.2游戏棋子控制
(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;
(2)画出棋盘的大小;
(3)画棋子并确定棋子的大小;
(4)判断键盘输入哪个键执行操作;
(5)玩家P1先落棋;
(6)玩家轮流下棋;
(7)判断赢家。
这是此游戏开发的重点和难点部分。
下面分别较少左移、右移、下移、上移及胜负判断的实现。
棋盘设计为18×18格,初始状态光标在棋盘的中央,玩家1先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。
当游戏一方胜利后显示胜利信息。
从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。
这样程序的主要工作是接收棋手按键操作,棋手用Up、Down、Left、Right控制光标移动,空格键表示落子。
一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。
落子成功后,马上判断以该位置为中心的八个方向:
上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。
如果想退出游戏,可以按Esc键
3.1.3游戏帮助
实现比较简单,使用outtextxy()函数实现。
3.2函数功能描述
1.定义全局变量
1.intstatus[N][N];/*定义的数组,表示棋盘某点的状态(棋手1或棋手2)*/
2.intstep_x,step_y;/*行走的坐标,即每一步光标移动的距离*/
3.intkey;/*获取按下的键盘的键*/
4.intflag;/*玩家标志,当flag=0时,表示该点无棋子,flag=1表示玩家1的棋子,flag=2表示玩家2的棋子*/
2.Main()主函数
按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。
棋盘状态用数组intstatus[19][19],初值为0,表示空格。
函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。
3.DrawBoard()画棋盘函数
背景颜色设为蓝色,从坐标(100,100)开始每隔20个单位用黄色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。
画线函数line()的参数为线的起点和终点坐标,注意要计算正确。
函数setfillstyle()可以设置填充模式和填充颜色,circle(x,y,8)以x和y为圆心画圆(这里半径为8),用它表示棋子。
4.ResultCheck(intx,inty)判断是否胜出函数
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:
红方获胜),否则继续落子。
5.Done()执行下棋函数
这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:
(1) 按Esc键程序可以随时结束。
(2) 按上下左右光标键,则改变棋子移动的坐标值。
(3) 按空格键后判断:
1)如落子的位置已经有棋则无效,继续按键。
2)如落子位置是空格,可以将棋子落入格内,调用ResultCheck(intx,inty)函数。
3)如果棋子变化后,棋盘已下满了棋子,则游戏结束。
显示平局信息。
(4) 重复上述步骤,直到游戏结束。
6.图形功能函数
以下函数原形都在graphics.h中。
(1)registerbgidriver():
(2)initgraph(int*driver,int*mode,char*path):
用于初始化图形系统,并装入相应的图形驱动器。
该函数把由driver所指向的图形驱动器代码装入内存。
如果图形驱动器未装入内存,图形函数将不能操作。
图形函数所用的屏显模式由mode所指向的整数值确定。
最后,图形驱动器的路径是由path所指向的字符串给出。
如果没有指定路径,就在当前工作路径上寻找。
(3)rectangle(intleft,inttop,intright,intbottom):
函数rectangle()用当前画出由坐标left,top及right,bottom所定义的矩形。
(4)setcolor(intcolor):
把当前画线颜色设置为color所指定的颜色。
(5)closegraph():
该函数使图形状态失效,并且释放用于保存图形驱动器和字体的系统内存。
当你的程序既用到图形输出又用到非图形输出时,应该用此函数。
该函数还把系统屏显模式返回到调用initgragh()前的状态。
3.3数据结构定义
4.程序实现
4.1.程序预处理
包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。
/*加载头文件*/
#include
#include
#include
#include
/*编译预处理,定义按键码*/
#defineLEFT0x4b00/*向左*/
#defineRIGHT0x4d00/*向右*/
#defineDOWN0x5000/*向下*/
#defineUP0x4800/*向上*/
/*若想在游戏中途退出,可按Esc键*/
#defineESC0x011b/*退出键*/
/*SPACE键表示落子*/
#defineSPACE0x3920/*落子键*
/*定义常量*/
/*设置偏移量,即定义每一步光标移动的距离*/
#defineOFFSET20
#defineOFFSET_x4
#defineOFFSET_y3
/*定义棋盘数组大小,即棋盘的大小,这里为18x18格*/
#defineN19
/*移动的方向*/
#defineLEFT0x4b00/*向左*/
#defineRIGHT0x4d00/*向右*/
#defineDOWN0x5000/*向下*/
#defineUP0x4800/*向上*/
zi=-1;//竖向
for(i=x,j=y;i>=0&&chip[i][j]==p;i--)zi++;
for(i=x,j=y;i if(zi>=5)returnp; zi=-1;//横向 for(i=x,j=y;j>=0&&chip[i][j]==p;j--)zi++; for(i=x,j=y;j if(zi>=5)returnp; zi=-1;//'\'斜向 for(i=x,j=y;i>=0&&j>=0&&chip[i][j]==p;i--,j--)zi++; for(i=x,j=y;i if(zi>=5)returnp; zi=-1;//'/'斜向 for(i=x,j=y;i>=0&&j for(i=x,j=y;i if(zi>=5)returnp; return0; } /*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的圆形*/ /*定义全局变量*/ intpingju(){ inti,j; for(i=0;i for(j=0;j if(chip[i][j]==0)return0; } } return1; } voidxianshou(){ intxian; step=0; if(language==49)printf("\t\t\t按1●方先手\n\t\t\t按2○方先手\n"); elseprintf("\t\t\tpress1tolet●ontheoffensive\n\t\t\tpress2tolet○ontheoffensive\n"); while (1){ xian=getch(); if(xian==49){player=1;break;} elseif(xian==50){player=0;break;} else{ if(language==49)printf("\t\t\t输入有误,请重新输入.\r"); elseprintf("\t\t\tInputerror,pleasetryagain.\r"); } } } voidKeyPress(intn){//按键动作 switch(n){ case72: //光标上移 if(site.y<=0)site.y=ChessCol-1; elsesite.y--; gotoxy(site.x,site.y); break; case80: //光标下移 if(site.y>=ChessCol-1)site.y=0; elsesite.y++; gotoxy(site.x,site.y); break; case75: //光标左移 if(site.x<=0)site.x=ChessRow-1; elsesite.x--; gotoxy(site.x,site.y); break; case77: //光标右移 if(site.x>=ChessRow-1)site.x=0; elsesite.x++; gotoxy(site.x,site.y); break; case32: //空格落子并判定胜负 luozi(); winner=check(site.x,site.y); break; 4.1.2主函数main() Main()函数主要是实现了对整个程序的运行控制,以及相关功能模块的调用。 voidgotoxy(intx,inty){ COORDcursor;//cursor为结构体COORD的变量,存储光标坐标 cursor.X=2*x; cursor.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cursor);//修改光标位置 } voidDrawChessBoard(){//绘制棋盘及光标位置初始化 voidChangePlayer(){//更换玩家 chip[site.x][site.y]=player+1;//2为黑子落点,1为白子落点 if(player)player=0;//变为白子 elseplayer=1;//变为黑子 } voidluozi(){//玩家落子 if(chip[site.x][site.y]==0){ step++; CurrentSite[step].x=site.x; CurrentSite[step].y=site.y; if(player){ ChangePlayer(); printf("●"); } else{ ChangePlayer(); printf("○"); } gotoxy(site.x,site.y); } } voidhuiqi(){//悔棋 if(step==0); 4.1.3改变玩家 玩家进行游戏时,需要对游戏界面进行初始化工作。 此代码被main()函数调用。 主要进行的工作如下: ChangePlayer(); chip[site.x][site.y]=0; gotoxy(CurrentSite[step].x,CurrentSite[step].y); chip[CurrentSite[step].x][CurrentSite[step].y]=0; if(CurrentSite[step].x==0){ if(CurrentSite[step].y==0)printf("┏"); elseif(CurrentSite[step].y==ChessCol-1)printf("┗"); elseprintf("┣"); } elseif(CurrentSite[step].x==ChessRow-1){ if(CurrentSite[step].y==0)printf("┓"); elseif(CurrentSite[step].y==ChessCol-1)printf("┛"); elseprintf("┫"); } elseif(CurrentSite[step].y==0)printf("┳"); elseif(CurrentSite[step].y==ChessCol-1)printf("┻"); elseprintf("╋"); site.x=CurrentSite[step].x,site.y=CurrentSite[step].y; step--; gotoxy(site.x,site.y); } } 4.1.4胜负及帮助显示 帮助提示 voidhelp2(intlanguage){//游戏结束帮助 if(language==49){ printf("你想要再玩一次吗? \n"); printf("按n键退出游戏.\n"); printf("按其它任意键继续玩."); } else{ printf("Doyouwanttoplayagain? \n"); printf("Pressntoexitgame.\n"); printf("Pressanyotherkeytoplayagain."); } } voidgame(){ help(language); 胜负判断 while (1){ xianshou(); DrawChessBoard(); press=getch(); while (1){ KeyPress(press); if(winner! =0){ gotoxy(0,ChessCol); if(winner==2){ if(language==49) printf("执●的一方获胜! \n"); else printf("Thesideof●win! \n"); } else{ if(language==49) printf("执○的一方获胜! \n"); else printf("Thesideof○win! \n"); } } else{ if(pingju()){ gotoxy(0,ChessCol); if(language==49) printf("\t平局\n"); else printf("\tAdraw! \n"); } else{ press=getch(); continue; } } 4.1.5切换背景 help2(language); press=getch(); if(press=='n'||press=='N') exit(0); else{ winner=0; system("cls"); break; } } } } intmain(void){ system("color9f");//9蓝色背景f亮白色前景 chooselanguage(); game(); return0; } 4.2运行结果 4.2.1游戏初始状态 当用户刚进入游戏时,如图4.2所示。 按1进入游戏。 用户可使用键盘左移键、右移键、上移键和下移键,分别进行左移、右移、旋转和下落操作。 用户可按ESC键退出游戏。 图4.2游戏初始状态 4.2.2游戏进行状态 图4.3为游戏进行状态 图4.3游戏进行状态 5.结论 本文介绍了五子棋游戏的设计思路及其编程实现。 重点介绍各功能模块的设计原理和数据结构的实现。 通过本论文程序的编写和开发,进一步的提高了自己的基本编程能力和游戏开发技巧,熟悉了C语言图形模式下的编程。 深入的理解了程序中有关结构体、数组、时钟中断及绘图等方面的知识。 通过本程序的训练,使我对C语言有了一个更能深刻的了解。 本文的程序设计借鉴了参考书籍和互联网上相关程序的设计思想,在此对相关网站的源代码提供者表示衷心的感谢。 由于时间、经验及水平的原因,论文中难免有不足之处。 许多问题往往都不是只有一种解决方法,本游戏的开发也是如此,可以对此程序进行优化和功能完善或者使用不同方法来实现某些功能,以达到学以致用的目的。 程序附录 #include #inc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 游戏 语言
![提示](https://static.bingdoc.com/images/bang_tan.gif)