五子棋课程设计.docx
《五子棋课程设计.docx》由会员分享,可在线阅读,更多相关《五子棋课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
五子棋课程设计
摘要
C语言是一种面向对象的语言,尽管在当前,可视化语言发展迅速,普及很快,但c语言作为一种基础的语言,它的优势依然存在,甚至有时它是不可替代的,特别是和硬件接口技术相联系的软件。
五子棋游戏是一种简单的大众的游戏,也是一款棋类益智游戏程序,自计算机实现以来,深受广大电脑玩家的喜爱。
本程序可以实现人人对战,操作采用键盘上的相关键控制棋子的上下左右移动,由特定键控制下棋。
游戏开始后,黑、白双方轮流下棋,程序会根据双方下棋的先后顺序自动显示不同颜色的棋子,提示当前下棋的棋手,任何一方由五子连成一线时,游戏结束,结束时会显示对战双方胜负情况。
关键词:
面向对象语言;c语言;五子棋游戏
Abstract
Isanobject-orientedlanguage,Clanguage,thoughinthecurrentrapiddevelopmentofthevisuallanguage,spreadquickly,buttheClanguageasafoundationoflanguage,itsadvantagesstillexists,evensometimesitisirreplaceable,especiallyassociatedwithsoftwareandhardwareinterfacetechnology.Gobanggameisasimplegame,isalsoapuzzlegameslikechessprogram,sincethecomputerimplementation,wasdeeplylovedbyvastcomputerplayer.Against,thisprocedurecanrealizeeveryoneoperateusingthekeyboardonthepiecesoftheupanddownorsokeycontrolmovement,controlledbythespecifickeytoplaychess.Atthestartofthegame,blackandwhitebothsidestaketurnstoplaychess,theprogramwillautomaticallyaccordingtotheorderofplaychessbothsidesshowpiecesofdifferentcolorsandpromptsthechessplayer,eitherbyabitalconnectaline,thegameends,theendwillshowcaseagainstthetwosides.
Keywords:
Object-orientedlanguage;clanguage;Gobanggame
1概述
1.1开发背景
随着计算机技术和互联网的飞速发展,游戏软件是当今世界发展最迅速,最有影响力,最有潜力与活力的领域之一。电脑游戏的出现为人们提供了新的娱乐平台,丰富了人们的业余生活。
因此与游戏有关的软件深受广大青少年的喜爱。
随着近几年来软件技术的不断进步、不断发展,软件游戏的操作要求越来越简单,大多数游戏普通人学几分钟就能会玩,甚至连老年人也慢慢爱上了它。
第二次世界大战以后,电子计算机技术得到了突飞猛进的发展。在众多国家中美国的计算机技术发展最为迅速。
1946年2月,世界上第一台电子数字计算机(ENIAC)在美国宾夕法尼亚大学建造完成。
ENIAC机的问世,表明了电子数字计算机时代的到来,具有划时代的伟大意义,是科学技术发展史上的重大里程碑。
我国也不落后,在1956年研制成功国产计算机的。
1958年和1959年我国先后自主研制成功国产小型和大型电子管计算机。
后来出现了集成电路和大规模集成电路,使电子子计算机一代一代实现更新,性能越来越高,计算速度越来越快,硬件方面的不断发展促使了软件技术也迅速发展。
在美国,集中了许多计算机软件的设计人才,他们工作之余,时常喜爱编一种能与人斗智的“游戏”,以此来锻炼编程的能力。这种“游戏”花样繁多,但其特点都是利用计算机软件事先设计好的“分析”、“判断”能力反过来与人较量。由于不断修改更新,使计算机的“智力”水平与人难分高低。到了90年代,游戏软件已经为世界各国的人使用,所谓游戏软件通常是指用各种程序和动画效果相结合起来的软件产品,我们称之为"游戏软件"。
目前,在网络上我们经常看到的大型3D网络游戏和WEBGAME网页游戏等都是通过用"3DMAX、MAYA、FLASH、等动画软件和JAVA、C++、VB、等程序语言相结合而开发出来的,所以叫游戏软件。
其中BLACKISLAND和Blizzard.这两个强大的游戏制作组对游戏软件的发展起到了巨大的带动作用,还有中国的洛河工作室在国内也起到了巨大作用,他们让很多很多人喜欢上了游戏软件,打开了这个市场。
如今游戏软件产业已经受到了广泛的关注,它年轻有潜力而且吸引人,让人们日益丰富的生活需求得以满足。
而五子棋游戏的诞生更是吸引着不同年龄段的人群,无论男女老少都可以玩,都喜欢玩,而当前微型计算机已经是在广大人群中流行着,用电脑来下五子棋更是一种时尚。
现在网络上出现了各种各样的五子棋软件,有大师级的、新手级的等等。
所有这些都满足了不同人群的需要,所以当前五子棋越来越被许多人所熟悉。
目前的五子棋程序的发展也非常快,从最初的双人发展到人机(有AI),然后到现在的网络对战,已经受到越来越多人的喜爱和重视。
1.2课题意义
人类社会经历了五千多年的农业文明时代,又经历了三百多年的工业文明时代。
经过漫长时间的发展,人类文明取得的不可想象的进步,人也变的越来越聪明了。
人类之所以变得聪明,是因为我们人类一直不断地再实践中思考,在思考中实践。
五子棋不仅能增强思维能力,提高记忆力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
五子棋游戏不但容易上手,而且它区别于别的游戏,它不但能使人娱乐,而且能使人的头脑变得更加聪明。
而五子棋对战有两种模式:
一.人机对战;二.双人对战。
这些给人无限乐趣的用途正是人工智能的杰作。
正因为这样它鼓励着人们对它不断研究,这在很大程度上促进了人工智能的发展,反过来人工智能的理论和技术上的突破能够使五子棋程序更完美、更受欢迎!
同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,随时地玩上五子棋,这已经不再是梦想了。
五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。
随着互联网络的不断普及,越来越多的人可以在网络上就能够与他人下五子棋了。
1.3人工智能介绍
人类的自然智能伴随着人类活动时时处处都存在。
人类的许多活动,如解题、下猜谜、讨论、编制计划和编程,甚至驾车、骑车等,都需要智能。
如果机器能够完成这些任务,那么就可以认为机器已经具有某种程度的“人工智能”。
正因为这样积累了很多与人工智能有关的知识。
在一次历史性的聚会中人工智能诞生了。
为使计算机变得更“聪明”,或者说是计算机具有智能,1965年夏季,在美国达特莫斯大学举行了一次为期两个月的夏季学术研讨会。
10位来自美国数学、神经学、心理学、信息科学和计算机科学方面的杰出年轻科学家,在一起共同学习和探讨了用机器模拟人类智能的有关问题,并且麦卡锡提议正式采用了“人工智能AI(ArtificialIntelligence)”这一术语。
从而,一个以研究如何用机器来模拟人类智能的新兴学科--人工智能诞生了。
人工智能(ArtificialIntelligence),英文缩写为AI。
它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
人工智能的发展给五子棋赋予了新的生命。
随着对人工智能的不断研究,计算机博弈也得到了飞速发展。
机器博弈被认为是人工智能领域最具挑战性的研究方向之一。
国际象棋的计算机博弈已经有了很长的历史,并且经历了一场波澜壮阔的"搏杀","深蓝"计算机的胜利也给人类留下了难以忘怀的记忆。
经过30多年的研究,人工智能在现实生活中得到了不少瞩目的成果,而这些成果已经建立了一些具有一定“智能”的AI系统,例如专家系统、定理证明系统、集成电路设计与分析系统、自然语言翻译系统、智能信息检索系统、疾病诊断系统等。
除了这重要的成果之外,还有大受人们欢迎的“智能系统”,比如现在在网络上出现的网络游戏、围棋、象棋、五子棋游戏程序等等,这些都是人工智能的成果,它们极大地改变了人们的生活、给人类带来了快乐。
1.4设计目的
虽然五子棋游戏的开发已经到了人工智能,但我们可以通过简单地编程设计出五子棋游戏,通过游戏过程增加编程的兴趣,提高编程水平。
编制该程序我对以下的知识点进行的巩固和掌握:
1.数组元素为结构体的数组应用。
2.全局变量应用。
3.按键的处理。
4.数组元素与蛇、食物的对应关系。
5.图形方式等等。
加深对所学知识的理解与掌握,增强自己对所学知识解决实际问题的能力,为以后的程序开发打下基础。
2总体设计
五子棋的游戏规则对我们大家来说都很很清楚的。
只要某一方的棋子在一条直线上,棋子数先达到五或以上,则该方为胜者。
本组的五子棋小游戏程序实现了两个人对战的简单步骤和一些简单规则,能判断双方的输赢。
当一方的棋子数先达到五或以上的,则能判断这方为胜者。
而且能判别,当棋盘上的某一个位置有棋子时,能判断这个位置不能再落子了。
当某一方胜利了时可以选择是否再继续玩游戏。
在游戏还没有分出胜负时,也可以退出游戏。
进入游戏一方可以用“W”,“S”,“A”,“D”,“Z”分别来控制上下左右的方向和落子,则另一方则用“O”,“L”,“I”,“P”和空格来分别控制上下左右的方向和落子。
2.1需求分析
2.1.1游戏需求
(1)画出棋盘的大小;
(2)画棋子并确定棋子的大小;
(3)判断键盘输入哪个键执行操作;
(4)玩家轮流下棋;
(5)判断赢家。
2.1.2功能模块
●初始化模块
●下棋操作模块
●判断胜负模块
●帮助模块
图2.1功能模块图
3详细设计
3.1各函数的说明
main()主函数
voiddrawqipan()画棋盘
voidmovegb()移动光标
voidluozi()下棋子
voidjudgewin()判断输赢
voidsystem()系统函数
3.1.1main()主函数
按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。
棋盘状态用数组intp[N][N]N=20,初值为0,表示空格。
函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。
3.1.2voiddrawqipan()画棋盘
背景颜色设为绿色,建立坐标voidgotoxy(intx,inty)/*建立坐标函数*/
{
COORDc;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
voiddrawqipan()/*建立棋盘*/
{
inti,j;
for(i=0;i{
for(j=0;j{
p[i][j]=0;q[i][j]='o';
printf("十");
}
printf("\n");
}
3.1.3voidjudgewin()判断输赢
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:
黑方获胜),否则继续落子。
3.1.4voidluozi()下棋子
这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:
(1) 按E键程序可以随时结束。
(2) 按上下左右光标键,则改变棋子移动的坐标值。
(3) 按空格键后判断:
1)如落子的位置已经有棋则无效,继续按键。
2)如落子位置是空格,可以将棋子落入格内,voidluozi(charpress)当statict=0;/*代表坐标交叉点有无棋子的状态*/
3)如果棋子变化后,棋盘已下满了棋子,则游戏结束。
显示平局信息。
4) 重复上述步骤,直到游戏结束。
3.2函数调用图
main
Luozi()
Drawqipan()
System()
图3.1函数的调用图
3.3各函数功能图
voidmovegb()
图3.2移动光标的函数流程图
Movelouzi()
图3.3下棋子的函数流程图
Voiddrawqipan()
图3.4画棋盘的函数流程图
Voidjudgewin()
图3.5判断胜负的函数流程图
4调试分析
所谓程序调试,是指对程序的查错和排错。
调试程序一般应经过以下几个步骤。
1.人工检查,即静态检查
在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。
这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多处错误。
而这一步骤往往容易被忽视。
有的用户总希望把一切推给计算机系统去做,但这样就会多占用机器时间。
2.上机调试,即动态检查
在人工(静态)检查无误后,才可以上机调试。
通过上机发现的错误称之为动态检查。
在编译时,系统会给出语法错误的信息(包括哪一行有错以及错误类型),用户可以根据提示的信息具体找出程序中出错之处并进行修改。
应当注意的是:
有时提示的出错行并不是真正出错的行,如果在提示出错的行上找不到错误的话,应当到上一行再找。
另外,有时提示出错的类型并非绝对准确,由于出错的情况繁多而且各种错误互有关联,因此要善于分析,找出真正的错误,而不要死抱住提示的出错信息不放,钻牛角尖。
如果系统提示的出错信息多,应当从上到下逐一改正。
有时显示出一大片错误信息往往使人感到问题严重,无从下手。
其实可能只有一两个错误。
例如,对所用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。
这时只要加上一个变量定义,那么所有错误就都消除了。
3.运行程序,试验数据
在改正语法错误(包括“错误”error和“警告”warning)后,程序经过链接(link)就得到可执行的目标程序。
运行程序,输入程序所需数据,就可得到运行结果。
应当对运行结果作分析,看它是否符合要求。
有的初学者看到输出运行结果就认为没问题了,不作认真分析,这是危险的。
4.1调试目的
为了是五子棋程序的正常使用,所以进行必要的测试,保证用户使用的可靠性,同时也可以完善五子棋程序自身的不足。
4.2调试与测试结果
4.2.1初始效果
图4.1初使界面图
4.2.2游戏界面
图4.2游戏过程图
4.2.3可以中途退出
图4.3退出游戏图
5结论
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
经过这次课程设计,我发现原来要想学好C语言,必须要掌握好书上的基本知识,懂得各个语句的用法,我明白了学习C语言的重要性。
而且通过这次课设我学到了许多在课本上学不到的东西,我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次
课程设计之后,一定把以前所学过的知识重新温故。
编辑游戏这在一前我都以为是要遥不可及,但现在通过这次五子棋的设计我明白了,并不是如此,只要团队合作也可以搞定,我多学了许多的以前课上没有的知识,在这次上也有了解。
通过课程设计,我们对《C语言》这门课程有了更深一步的了解。
它是计算机程序设计的重要理论技术基础,在我们计算机专业的学习中占据着十分重要的地位。
同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。
因为我们学习知识就是为了实践。
而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。
参考文献
[1]王连相.C/C++程序设计.武汉大学出版社,2011
[2]谭浩强.C语言程序设计(第二版)学习指导.清华大学出版社,2000
[3]郭有强.C语言程序设计.清华大学出版社,2009
[4]郭翠英.C语言课程设计案例精编.中国水利水电出版社,2004
[5]李丽娟.C语言程序设计教程.人民邮电出版社,2006
[6]杨莉、龚文建.C语言程序设计实训指导教程.华中科技大学出版社,2009
[7]张小东,郑红珍.C语言程序设计与应用.人民邮电出版社,2009
[8]李丹程,刘莹,那俊.C语言程序设计案例实践.清华大学出版社,2009
[9]武雅丽,王永玲,解亚利.C语言程序设计.清华大学出版社,2007
[10]梁海英、李淑梅、白文秀、侯锟.C语言程序设计.清华大学出版社,2013
致谢
在这次五子棋程序设计中,我得到了杨书鸿老师的认真指导和帮助,同时也感谢我的同伴刘建军同学,因为他才提高了我设计进度和效率。
我和刘建军同学共同完成这次课程设计,在程序设计过程中难免会遇到各种问题,谢谢杨老师的耐心指导,谢谢同伴的包容,在这次课程设计中我感觉我有了很大的提高,我相信自己以后会做得更好。
通过本次设计,我的知识领域得到了进一步扩展,专业技能进一步提高,同时增强了分析和解决实际问题的综合能力。
附录
程序源代码
#include
#include
#include
#defineplay1up'w'
#defineplay1down's'
#defineplay1left'a'
#defineplay1right'd'
#defineplay2up'o'
#defineplay2down'l'
#defineplay2left'i'
#defineplay2right'p'
#defineplay1lq'z'
#defineplay2lq''
#defineN20
#defineplaynext'q'
#defineexit'e'
intm=1;
intp[N][N];/*记录棋盘落子情况*/
charq[N][N];/*记录棋盘交叉点棋子种类*/
structzuobiao
{intx;inty;}weizhi;
voidgotoxy(intx,inty)/*建立坐标函数*/
{
COORDc;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
voiddrawqipan()/*建立棋盘*/
{
inti,j;
for(i=0;i{
for(j=0;j{
p[i][j]=0;q[i][j]='o';
printf("十");
}
printf("\n");
}
}
voidmovegb(charpress)/*光标的移动*/
{
switch(press)
{
caseplay1up:
if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weizhi.y=19;break;/*玩家1光标向下移动*/
caseplay1down:
if(weizhi.y<20)weizhi.y++;if(weizhi.y>19)weizhi.y=0;break;/*玩家1光标向上移动*/
caseplay1left:
if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)weizhi.x=19;break;/*玩家1光标向左移动*/
caseplay1right:
if(weizhi.x<20)weizhi.x++;if(weizhi.x>19)weizhi.x=0;break;/*玩家1光标向右移动*/
caseplay2up:
if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weizhi.y=19;break;/*玩家2光标向上移动*/
caseplay2down:
if(weizhi.y<20)weizhi.y++;if(weizhi.y>19)weizhi.y=0;break;/*玩家2光标向下移动*/
caseplay2left:
if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)weizhi.x=19;break;/*玩家2光标向左移动*/
caseplay2right:
if(weizhi.x<20)weizhi.x++;if(weizhi.x>19)weizhi.x=0;break;/*玩家2光标向右移动*/
}
gotoxy(2*weizhi.x,weizhi.y);
}
voidluozi(charpress)
{
statict=0;/*代表坐标交叉点有无棋子的状态*/
if(press==play1lq)
if(t==0&&p[weizhi.x][weizhi.y]==0)
{
printf("●");gotoxy(2*weizhi.x,weizhi.y);
q[weizhi.x][weizhi.y]=press;
p[weizhi.x][weizhi.y]=1;t=1;
}
if(press==play2lq)
if(t==1&&p[weizhi.x][weizhi.y]==0)
{
printf("○");gotoxy(2*weizhi.x,weizhi.y);
q[weizhi.x][weizhi.y]=pre