基于EGE图形库五子棋游戏实验报告.docx
《基于EGE图形库五子棋游戏实验报告.docx》由会员分享,可在线阅读,更多相关《基于EGE图形库五子棋游戏实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
基于EGE图形库五子棋游戏实验报告
基于EGE图形库
五子棋游戏实验报告
1课程设计
1.1课程设计的背景
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:
“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。
”李善注引三国魏邯郸淳《艺经》中曰:
“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。
这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。
因而规则简单的五子棋也可能出自当时,并是用石子作棋子。
亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。
正如《辞海》中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜”。
传统五子棋棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。
因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人的时候也能体验五子棋的乐趣。
因此我们设计了一款兼具人机对战与玩家对战功能的五子棋游戏。
1.2课程设计的目的
1.加深对C语言数据类型,运算,语句结构及其程序设计的基本方法理解和掌握;
2.初步学习和使用图形库;
3.通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后
的学习打下坚实的基础;
4.初步了解C语言游戏编程,在此次程序设计过程中掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础
1.3课程设计的要求
1.编写程序代码,调试所写程序使其能够正确运行;
2.能进行基本的五子棋操作,有图形界面,能够用鼠标操作;
3.能够实现玩家对战与人机对战。
1.4课程设计的开发环境
Win10操作系统下的软件开发工具Code:
Blocks与VisualStudio2017,使用EGE图形库进行开发。
2功能描述
2.1初始界面
1.设计了缤纷绚丽的初始界面,充分的吸引的玩家的眼球,激发玩家的游玩欲望;
2.运行程序经过“EGE”启动动画后进入首页,玩家在菜单栏中通过鼠标选择进入“人机对抗”与“玩家对战”游戏模式;
3.选择一个模式后切换至相应游戏界面,根据提示信息开始游戏;
4.色彩分明的菜单栏与大小适中的选项框的设计,再结合鼠标操控,玩家使用起来方便快捷;
5.在右下角表明了班级与姓名,方便程序的交流。
2.2人机对战
1.应用来源于网络上“关于五子棋的人机博弈算法”中最出名同时也是应用最广泛的“flat技术”“打分机制”“棋型判断和禁手判断”和“AI算法”,根据设计者说明的引导,将算法移植了进来,使得电脑方具有相当的智慧;
2.游戏界面的棋盘旁边设计有“棋子计数板”,方便玩家结合以考虑棋盘上的形势;
3.游戏界面使用木色为背景,让玩家操作起来更具真实感;
4.当有一方胜出后,会在游戏界面底部分别显示“恭喜您取得了胜利!
”与“您输了!
请再接再厉!
”来提醒玩家游戏结束;
5.当游戏结束后,玩家可以点击“返回首页”以返回主菜单来继续下面的游戏。
2.3玩家对战
1.进入游戏界面后显示提示信息“您已进入玩家对战白方先手请落子以开始游戏”;
2.使用鼠标轮流落点,操作简单方便;
3.左上角显示“模式:
玩家对面”,提醒玩家当前模式信息;
4.和人机对抗一样具有“计数板”、“游戏输赢提醒”和“返回首页”等功能,在此不再赘述。
3程序实现
3.1界面设计
1.首页界面
界面包括几个窗体,第一个窗体是首页,首页使用EGE的图形绘制功能绘制了一系列填充了不同鲜艳颜色的长方形,包括游戏标题栏,模式菜单栏,游戏模式选择框以及备注框;使用EGE中的文字打印功能显示出游戏标题,模式选项,装饰语言以及作者信息;并结合EGE中获取鼠标点击的坐标信息的函数设计了模式选择函数,是用户可以通过点击界面上的选项区域来进入与之相应的游戏模式,操作简单方便。
此部分主要通过voidShouYe()函数与voidmoshixuanze()函数实现,下面是这两个函数的代码与相应注释。
voidShouYe()//首页界面
{
whitewin=0;
blackwin=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);//文字填充透明化
setfont(100,43,"华文琥珀");//(字体高度,字体宽度(为0即为自适应),字形),幼圆字体
outtextxy(15,20,"寒假作业:
五子棋");//在坐标为(10,20)显示“寒假作业:
五子棋”
//设置装饰文字
setbkmode(TRANSPARENT);
setcolor(EGERGB(0,255,255));//蓝
setfont(100,0,"华文行楷");
rectprintf(50,200,150,500,"休\n\n闲");
setbkmode(TRANSPARENT);
setcolor(EGERGB(0,255,0));//绿
setfont(100,0,"华文行楷");
rectprintf(650,200,750,500,"益\n\n智");
//设置菜单栏
setfillcolor(EGERGB(0x80,0x80,0x80));
bar(200,150,600,600);
setbkmode(TRANSPARENT);
setcolor(EGERGB(0xFF,0xFF,0x00));//金色
setfont(35,0,"隶书");
outtextxy(225,155,"请点击以选择游戏模式");
//第一个选择框
setfillcolor(EGERGB(139,0,139));
bar(250,250,550,350);
setbkmode(TRANSPARENT);
setcolor(EGERGB(255,255,0));
setfont(70,0,"华文行楷");
rectprintf(260,260,550,350,"人机对抗");
//第二个选择框
setfillcolor(EGERGB(255,0,0));
bar(250,400,550,500);
setbkmode(TRANSPARENT);
setcolor(EGERGB(0,191,255));
setfont(70,0,"华文行楷");
rectprintf(260,410,550,500,"玩家对战");
//备注栏
setfillcolor(EGERGB(235,206,250));
bar(300,550,800,600);
setcolor(EGERGB(0,0,0));
setbkmode(TRANSPARENT);
setfont(40,0,"方正舒体");
rectprintf(300,550,800,600,"2018届电信卓越班王悦天");
}
voidmoshixuanze()//鼠标选择菜单
{
//用鼠标选择
for(;is_run();delay_fps(60))
{
while(mousemsg())
{
msg=getmouse();
}
if(msg.is_left()&&msg.x>=250&&msg.x<=550&&msg.y<=350&&msg.y>=250)
{
cleardevice();
xuanze1=1;
break;
}
if(msg.is_left()&&msg.x>=250&&msg.x<=550&&msg.y>=400&&msg.y<=500)
{
cleardevice();
xuanze1=2;
break;
}
}
if(xuanze1==1)
{
PVC();
}
elseif(xuanze1==2)
{
PVP();
}
}
2.棋盘绘制
使用EGE中的图形绘制函数,结合C++里的for循环函数,用直线绘制棋盘。
直线是由端点绘制的,每个点都有坐标,通过循环改变每次的端点坐标,从而绘制出15*15的棋盘,代码如下
setbkcolor(EGERGB(222,184,135));//设置背景颜色
setcolor(BLACK);
for(inti=60;i<510;i+=30)
{
line(i,60,i,480);
}
for(intj=60;j<510;j+=30)
{
line(60,j,480,j);
}
3.棋子生成
通过对鼠标点击坐标的处理运算,在棋盘的落点上通过图形绘制画出相应的黑色或白色的圆形来实现棋子的生成。
下面是在游戏界面函数中的棋子生成部分。
for(inti=60;i<=480;i++)//绘制棋子
{
for(intj=60;j<=480;j++)
{
if(placewhite[i][j])
{
setcolor(EGERGB(255,255,255));
setfillcolor(EGERGB(255,255,255));
fillellipse(i,j,15,15);
}
if(placeblack[i][j])
{
setcolor(EGERGB(0,0,0));
setfillcolor(EGERGB(0,0,0));
fillellipse(i,j,15,15);
}
}
3.2人机博弈
打分机制
1、打分思路
(1)先对整个棋盘形势进行打分,存在两个矩阵(二维数组)上
(2)一个为我方的形势分数,一个为敌方的形势分数
(3)找出我方形势分数的最大值mymaxscore及其对应的位置,找出敌方形势的最大值hismaxscore及其对应的位置。
(4)判断是进攻还是防守:
如果mymaxscore>=hismaxscore,则进攻,下我方形势最大值mymaxscore对应的位置;如果有多个mymaxscore相等,则下这几个对应位置上hismaxscore最大的位置。
否则,防守,下敌方形势最大值hismaxscore对应的位置。
如果有多个hismaxscore相等,则下这几个对应位置上mymaxscore最大的位置。
2、打分方法
(1)在棋盘空位置上预添加要判断放的棋子
(2)取出以空位置为中心的4个方向(上,下,左,右),每个方向以该位置为中心两边各取4个格子信息。
(3)四个方向都判断其棋型,是否连五,活四,冲四,活三,眠三,活二,眠二等中的一种
(4)最后综合四个方向的棋型,对该位置进行打分。
使用网络上经典的打分机制进行计算,下面为打分机制的简单介绍;
各棋型实际分数与相应代码实现应篇幅过长且网络上多见,并非此次编程的重点,所以此处省略相应展示。
4软件展望
因本人编程水平限制与假期时间有限,程序中存在一些漏洞,同时也有一些想实现而未完善的功能,特在此列出;
1.人机对战中默认为电脑先手,希望可以增加先手选择的功能;
2.首页界面未设置直接退出的选项;
3.游戏不可中途暂停,也不能断点存档续接,等待进一步的完善;
4.在游戏过程中点击返回首页选项无效;
5.对局中未设置悔棋功能;
6.输赢信息希望可以设计为弹窗弹出;
7.对局中未考虑禁手规则。
5收获心得
对于本次的假期作业的课程设计,我有着很深的体会,历时20天的思考、学习与写代码,从初次接触图形库到应用它做出一个有模有样的小程序,我收获颇多,可以说是满载而归。
首先我要感谢我的C语言程序设计的代课老师,正是因为他布置的此次意义非凡的寒假作业,我才能有机会接触到这么多有用的知识,他讲课的方式很不一样,使得我每次上他的课都格外的认真。
他总是给我们仔细的讲解各个知识点,然后给我们提供其他的练习题,让我们下了课以后有目的的自己学习。
还要感谢那些把程序的设计思路与代码放在网上的各个前辈,正是有他们的指引,我才能一步步探索和完成此次作业。
此次作业也让我了解到游戏编程的困难与不易,让我对广大程序员又多了一层敬意。
当然,这也激发我拼搏向上与努力奋斗的信念,我不懂的知识仍然浩如烟海,我需要脚踏实地,步步为营地继续攀登!
总之,感谢那些在我成长路上帮助我的所有人们!
我将继续努力,奋勇向前!