基于 EGE 图形库
五子棋游戏
实验报告
2018 届电信卓越班
U201811462
王悦天
目录
1 课程设计............................................................................................................................................... 3
1.1 课程设计的背景........................................................................................................................... 3
1.2 课程设计的目的........................................................................................................................... 3
1.3 课程设计的要求........................................................................................................................... 3
1.4 课程设计的开发环境................................................................................................................... 4
2 功能描述..............................................................................................................................................4
2.1 初始界面........................................................................................................................................ 4
2.2 人机对战....................................................................................................................................... 4
2.3 玩家对战........................................................................................................................................5
3 程序实现...............................................................................................................................................5
3.1 界面设计.........................................................................................................................................5
3.2 人机博弈........................................................................................................................................9
4 软件展望.............................................................................................................................................10
5 收获心得............................................................................................................................................. 10
2
1 课程设计
1.1 课程设计的背景
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早
在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋
有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有
“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝
台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横
各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋
类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当
时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演
变成围棋并在炎黄子孙后代中遍及开来。在古代,五子棋棋具虽然与围棋相类同,
但是下法却是完全不同的。正如《辞海》中所言,五子棋是“棋类游戏,棋具与围
棋相同,两人对局,轮流下子,先将五子连成一行者为胜”。
传统五子棋棋子分为黑白两色,棋盘为 15×15,棋子放置于棋盘线交叉点上。
因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人
的时候也能体验五子棋的乐趣。因此我们设计了一款兼具人机对战与玩家对战功能
的五子棋游戏。
1.2 课程设计的目的
1. 加深对 C 语言数据类型,运算,语句结构及其程序设计的基本方法理解和掌
握;
2. 初步学习和使用图形库;
3. 通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后
的学习打下坚实的基础;
4. 初步了解 C 语言游戏编程,在此次程序设计过程中掌握五子棋游戏开发的基本
原理,从而为以后的程序开发奠定基础
1.3 课程设计的要求
1. 编写程序代码,调试所写程序使其能够正确运行;
2.能进行基本的五子棋操作,有图形界面,能够用鼠标操作;
3
3. 能够实现玩家对战与人机对战。
1.4 课程设计的开发环境
Win10 操作系统下的软件开发工具 Code:Blocks 与 Visual Studio 2017 ,使
用 EGE 图形库进行开发。
2 功能描述
2.1 初始界面
1. 设计了缤纷绚丽的初始界面,充分的吸引的玩家的眼球,激发玩家的游玩
欲望;
2. 运行程序经过“EGE”启动动画后进入首页,玩家在菜单栏中通过鼠标选择
进入“人机对抗”与“玩家对战”游戏模式;
3. 选择一个模式后切换至相应游戏界面,根据提示信息开始游戏;
4. 色彩分明的菜单栏与大小适中的选项框的设计,再结合鼠标操控,玩家使
用起来方便快捷;
5. 在右下角表明了班级与姓名,方便程序的交流。
2.2 人机对战
1. 应用来源于网络上“关于五子棋的人机博弈算法”中最出名同时也是应用
最广泛的“flat 技术”“打分机制”“棋型判断和禁手判断”和“AI 算
法”,根据设计者说明的引导,将算法移植了进来,使得电脑方具有相当
的智慧;
2. 游戏界面的棋盘旁边设计有“棋子计数板”,方便玩家结合以考虑棋盘上
的形势;
3. 游戏界面使用木色为背景,让玩家操作起来更具真实感;
4. 当有一方胜出后,会在游戏界面底部分别显示“恭喜您取得了胜利!”与
“您输了!请再接再厉!”来提醒玩家游戏结束;
5. 当游戏结束后,玩家可以点击“返回首页”以返回主菜单来继续下面的游
戏。
4
2.3 玩家对战
1. 进入游戏界面后显示提示信息“您已进入玩家对战 白方先手 请落子以开始
游戏”;
2. 使用鼠标轮流落点,操作简单方便;
3. 左上角显示“模式:玩家对面”,提醒玩家当前模式信息;
4. 和 人机对抗 一样具有“计数板”、“游戏输赢提醒”和“返回首页”等功
能,在此不再赘述。
3 程序实现
3.1 界面设计
1.首页界面
界面包括几个窗体,第一个窗体是首页,首页使用 EGE 的图形绘制功能绘
制了一系列填充了不同鲜艳颜色的长方形,包括游戏标题栏,模式菜单栏,游
戏模式选择框以及备注框;使用 EGE 中的文字打印功能显示出游戏标题,模式
选项,装饰语言以及作者信息;并结合 EGE 中获取鼠标点击的坐标信息的函数
设计了模式选择函数,是用户可以通过点击界面上的选项区域来进入与之相应
的游戏模式,操作简单方便。
此部分主要通过 void ShouYe()函数与 void moshixuanze()函数实现,
下面是这两个函数的代码与相应注释。
void ShouYe()//首页界面
{
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));//设置背景颜色
5
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, "华文行楷");
6
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 届电信卓越班
王悦天");
}
void moshixuanze()//鼠标选择菜单
{
//用鼠标选择
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();
}
else if(xuanze1==2)
{
PVP();
7
}
}
2. 棋盘绘制
使用 EGE 中的图形绘制函数,结合 C++里的 for 循环函数,用直线绘制
棋盘。直线是由端点绘制的,每个点都有坐标,通过循环改变每次的端点坐标,
从而绘制出 15*15 的棋盘,代码如下
setbkcolor(EGERGB(222, 184, 135));//设置背景颜色
setcolor(BLACK);
for(int i=60;i<510;i+=30)
{
line(i,60,i,480);
}
for(int j=60;j<510;j+=30)
{
line(60,j,480,j);
}
3. 棋子生成
通过对鼠标点击坐标的处理运算,在棋盘的落点上通过图形绘制画出相应的黑色或白
色的圆形来实现棋子的生成。下面是在游戏界面函数中的棋子生成部分。
for(int i=60;i<=480;i++)//绘制棋子
{
for(int j=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);
}
}
8