1、2. 初步学习和使用图形库;3. 通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后 的学习打下坚实的基础;4. 初步了解C语言游戏编程,在此次程序设计过程中掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础1.3 课程设计的要求1. 编写程序代码,调试所写程序使其能够正确运行;2能进行基本的五子棋操作,有图形界面,能够用鼠标操作; 3. 能够实现玩家对战与人机对战。1.4 课程设计的开发环境Win10操作系统下的软件开发工具Code:Blocks与Visual Studio 2017 ,使用EGE图形库进行开发。2 功能描述2.1 初始界面1. 设计了缤纷绚丽的初始界
2、面,充分的吸引的玩家的眼球,激发玩家的游玩欲望;2. 运行程序经过“EGE”启动动画后进入首页,玩家在菜单栏中通过鼠标选择进入“人机对抗”与“玩家对战”游戏模式;3. 选择一个模式后切换至相应游戏界面,根据提示信息开始游戏;4. 色彩分明的菜单栏与大小适中的选项框的设计,再结合鼠标操控,玩家使用起来方便快捷;5. 在右下角表明了班级与姓名,方便程序的交流。2.2 人机对战1. 应用来源于网络上“关于五子棋的人机博弈算法”中最出名同时也是应用最广泛的“flat技术”“打分机制”“棋型判断和禁手判断”和“AI算法”,根据设计者说明的引导,将算法移植了进来,使得电脑方具有相当的智慧;2. 游戏界面的
3、棋盘旁边设计有“棋子计数板”,方便玩家结合以考虑棋盘上的形势;3. 游戏界面使用木色为背景,让玩家操作起来更具真实感;4. 当有一方胜出后,会在游戏界面底部分别显示“恭喜您取得了胜利!”与“您输了!请再接再厉!”来提醒玩家游戏结束;5. 当游戏结束后,玩家可以点击“返回首页”以返回主菜单来继续下面的游戏。2.3 玩家对战1. 进入游戏界面后显示提示信息“您已进入玩家对战 白方先手 请落子以开始游戏”;2. 使用鼠标轮流落点,操作简单方便;3. 左上角显示“模式:玩家对面”,提醒玩家当前模式信息;4. 和 人机对抗 一样具有“计数板”、“游戏输赢提醒”和“返回首页”等功能,在此不再赘述。3 程序
4、实现3.1界面设计1.首页界面界面包括几个窗体,第一个窗体是首页,首页使用EGE的图形绘制功能绘制了一系列填充了不同鲜艳颜色的长方形,包括游戏标题栏,模式菜单栏,游戏模式选择框以及备注框;使用EGE中的文字打印功能显示出游戏标题,模式选项,装饰语言以及作者信息;并结合EGE中获取鼠标点击的坐标信息的函数设计了模式选择函数,是用户可以通过点击界面上的选项区域来进入与之相应的游戏模式,操作简单方便。此部分主要通过void ShouYe()函数与void moshixuanze()函数实现,下面是这两个函数的代码与相应注释。void ShouYe()/首页界面 whitewin=0; blackwi
5、n=0; memset(placeblack,0,sizeof(placeblack); memset(placewhite,0,sizeof(placewhite); xuanze1=0; xuanze2=0; initgraph(800,600);/初始化画幅 setbkcolor(EGERGB(0xEE, 0x82, 0xEE);/设置背景颜色 setfillcolor(EGERGB(0xAD, 0xFF, 0x2F);/标题栏 bar(0, 0, 800,150); setcolor(EGERGB(255, 69, 0);/文字颜色 setbkmode(TRANSPARENT);/文字
6、填充透明化 setfont(100, 43, 华文琥珀);/(字体高度,字体宽度(为0即为自适应),字形),幼圆字体 outtextxy(15, 20, 寒假作业:五子棋/在坐标为 (10,20) 显示“寒假作业:五子棋” /设置装饰文字 setcolor(EGERGB(0, 255, 255);/蓝 setfont(100, 0, 华文行楷 rectprintf(50,200,150,500,休nn闲 setcolor(EGERGB(0, 255, 0);/绿 rectprintf(650,200,750,500,益nn智 /设置菜单栏 setfillcolor(EGERGB(0x80, 0
7、x80, 0x80); bar(200,150,600,600); setcolor(EGERGB(0xFF, 0xFF, 0x00);/金色 setfont(35, 0, 隶书 outtextxy(225,155,请点击以选择游戏模式 /第一个选择框 setfillcolor(EGERGB(139, 0, 139); bar(250, 250, 550,350); setcolor(EGERGB(255, 255, 0); setfont(70, 0, rectprintf(260, 260, 550,350,人机对抗 /第二个选择框 setfillcolor(EGERGB(255, 0,
8、0); bar(250, 400, 550,500); setcolor(EGERGB(0, 191, 255); rectprintf(260, 410, 550,500,玩家对战 /备注栏 setfillcolor(EGERGB(235, 206, 250); bar(300, 550, 800,600); setcolor(EGERGB(0, 0, 0); setfont(40, 0, 方正舒体 rectprintf(300,550,800,600,2018届电信卓越班 王悦天void moshixuanze()/鼠标选择菜单 /用鼠标选择 for ( ; is_run(); delay
9、_fps(60) while (mousemsg() msg = getmouse(); if(msg.is_left()&msg.x=250&msg.x=550&msg.y=250) cleardevice(); xuanze1=1; break; =400&=500) xuanze1=2; if(xuanze1=1) PVC(); else if(xuanze1=2) PVP();2. 棋盘绘制使用EGE中的图形绘制函数,结合C+里的for循环函数,用直线绘制棋盘。直线是由端点绘制的,每个点都有坐标,通过循环改变每次的端点坐标,从而绘制出15*15的棋盘,代码如下setbkcolor(EG
10、ERGB(222, 184, 135); setcolor(BLACK); for(int i=60;i510;i+=30) line(i,60,i,480); for(int j=60;j=hismaxscore,则进攻,下我方形势最大值mymaxscore对应的位置;如果有多个mymaxscore相等,则下这几个对应位置上hismaxscore最大的位置。否则,防守,下敌方形势最大值hismaxscore对应的位置。如果有多个hismaxscore相等,则下这几个对应位置上mymaxscore最大的位置。2、打分方法(1)在棋盘空位置上预添加要判断放的棋子(2)取出以空位置为中心的4个方向
11、(上,下,左,右),每个方向以该位置为中心两边各取4个格子信息。(3)四个方向都判断其棋型,是否连五,活四,冲四,活三,眠三,活二,眠二等中的一种(4)最后综合四个方向的棋型,对该位置进行打分。使用网络上经典的打分机制进行计算,下面为打分机制的简单介绍;各棋型实际分数与相应代码实现应篇幅过长且网络上多见,并非此次编程的重点,所以此处省略相应展示。4 软件展望因本人编程水平限制与假期时间有限,程序中存在一些漏洞,同时也有一些想实现而未完善的功能,特在此列出;1.人机对战中默认为电脑先手,希望可以增加先手选择的功能;2.首页界面未设置直接退出的选项;3. 游戏不可中途暂停,也不能断点存档续接,等待
12、进一步的完善;4.在游戏过程中点击返回首页选项无效;5. 对局中未设置悔棋功能;6. 输赢信息希望可以设计为弹窗弹出;7.对局中未考虑禁手规则。5 收获心得对于本次的假期作业的课程设计,我有着很深的体会,历时20天的思考、学习与写代码,从初次接触图形库到应用它做出一个有模有样的小程序,我收获颇多,可以说是满载而归。首先我要感谢我的C语言程序设计的代课老师,正是因为他布置的此次意义非凡的寒假作业,我才能有机会接触到这么多有用的知识,他讲课的方式很不一样,使得我每次上他的课都格外的认真。他总是给我们仔细的讲解各个知识点,然后给我们提供其他的练习题,让我们下了课以后有目的的自己学习。还要感谢那些把程序的设计思路与代码放在网上的各个前辈,正是有他们的指引,我才能一步步探索和完成此次作业。此次作业也让我了解到游戏编程的困难与不易,让我对广大程序员又多了一层敬意。当然,这也激发我拼搏向上与努力奋斗的信念,我不懂的知识仍然浩如烟海,我需要脚踏实地,步步为营地继续攀登!总之,感谢那些在我成长路上帮助我的所有人们!我将继续努力,奋勇向前!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1