五子棋游戏的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
摘要 (1)
关键词 (1)
Abstract (1)
Key word (1)
1 引言 (1)
1.1 概述 (1)
1.2 开发平台 (2)
1.2.1开发环境 (2)
1.2.2 运行环境 (2)
2 开发设计 (2)
2.1 概要设计 (2)
2.1.1流程图 (2)
2.1.2 功能分析 (3)
2.2 详细设计 (3)
3 功能测试及运行效果 (7)
3.1 游戏主页面 (8)
3.2 结论 (10)
3.3 几点补充说明 (10)
4总结 (10)
致谢 (10)
参考文献 (10)
五子棋游戏的设计与实现
网络工程专业学生候成飞
指导教师吴俊华
摘要:如今,通过对玩过游戏同学的调查,由于五子棋游戏其规则简单,非常富有趣味性和消遣性,该游戏深受同学们的喜欢。

该程序主要使用当前优秀的开发工具VC++编程设计了一个简单的双人对弈的五子棋游戏。

主要介绍了开发环境Microsoft Visual C++ 6.0。

程序中主要包含了五子棋程序的棋盘初始化、游戏规则、胜负法判断方。

希望给喜欢玩五子棋游戏的玩家带来一个不一样的娱乐体验和便利的五子棋游戏平台。

关键词:五子棋初始化规则 Microsoft Visual C++ 6.0
Design and implementation of Gobang game
student Majoring in Network Engineering houchengfei
Tutor Wu Junhua
Abstract:Nowadays, the majority of students like playing the Gobang game through my extensive survey. The reason why students like it is that the game's rule is simply ,extremely rich interesting and recreational. This game mainly applied the Visual C++ program to design one two person to under gobang single plane game. The program introduced the development environment of Microsoft Visual C++ 6.0 and contained the initialization ,the game rule and the judgment method of win or lose of this game. I sincerely hope that this program could bring a different feeling and convenient game plane to the person who like the Gobang game.
Key word: Gobang ;Initialization;Rule;Microsoft Visual C++ 6.0
1引言
计算机已经深入到人们日常工作和生活的方方面面,各程序软件也逐渐进入大众的视野,并开始影响人们的工作生活,与计算机相关的产业进入快速发展期。

近年来,随着网络的发展,游戏成为许多人关注的焦点。

与传统的影音产业一样,游戏产业也是娱乐行业的一个重要组成部分信息产业部正加强软件产品研发投入,鼓励开发和推广有自主知识产权的相关软件产品和网络游戏机,保障未成年人思想道德建设的良好的网络信息环境。

中国人称五子棋为“连五子”或“连珠”,也许是源于史书中“日月如合璧,五星如连珠”。

不同语言、地区的人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊。

程序开发选用功能强大的Microsoft Visual C++开发工具,兼容性好、占资源少、打开快、编绎快、生成的文件短小精悍,目前还有不少公司用它,一代经典。

1.1概述
Microsoft Visual C++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。

它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。

它以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。

比如,它允许用户进行远程调试,单步执行等。

还有允许用户在调试期间重新编译被修改
的代码,而不必重新启动正在调试的程序。

其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。

这些特征明显缩短程式编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

1.2开发平台
1.2.1开发环境
Microsoft visual C++(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI 等编程语言。

VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WIndows API)、三维动画DirectX API,Microsoft .NET框架。

1.2.2运行环境
能够正常使用的Windows XP或Windows7,对系统配置的要求不是很高,中等的电脑配置都可以很好的运行了,当然高配置效果会更好。

安装了Microsoft visual C++编程环境,并能正常使用,就能够正常运行。

2开发设计
2.1概要设计
2.1.1流程图
图2-1设计流程图
2.1.2功能分析
程序设计简洁得体,布局合理,五子棋游戏的基本功能齐全。

根据窗口菜单中的文字提示,用户可以很容易的开始五子棋游戏。

游戏模式为人机对弈。

进入该模式后默认的为电脑先下,后玩家在落棋子。

游戏中人机对弈中电脑能够实现每一步都通过计算最佳落子位置,然后做出相应的操作,玩家要赢有难度!
程序有很好的退出关闭功能。

程序编程规范,具有良好的编程风格。

2.2详细设计
(1)程序中创建了一个CMyChessDlg类,通过OnInitDiog函数来实现对棋盘的初始化,建立一个[15*15]的棋盘。

该棋盘的界面通过调用已经存入程序中图片来设置一个友好的游戏界面,通过VC++程序实现对游戏界面的合理调整绘制,得到如图所示的界面如图2-2所示。

图2-2 棋盘界面
具体实现代码如下:
BOOL CMyChessDlg::OnInitDialog()
{ CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{ CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
}
if (!strAboutMenu.IsEmpty())
{ pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
fivechess.m_board.LoadBitmap(IDB_CHESSBOARD);/四幅图的设置
fivechess.m_blackchess.LoadBitmap(IDB_BLACKCHESS);/四幅图的设置fivechess.m_whitechess.LoadBitmap(IDB_WHITECHESS);/四幅图的设置fivechess.m_black.LoadBitmap(IDB_BLACK); //四幅图的设置fivechess.Reset();
return TRUE;
}
⑵第二步再实现如何设置白棋(电脑)和黑棋(玩家)的下法,默认的为电脑先落子,玩家再落子,已经有棋子的地方是不能重复落子的。

玩家点击下棋的位置选择,代码如下:
if (fivechess.m_begin==false) //如果已经需要落子的地方已经有棋子,则返回return;
if (fivechess.m_winner!=0)//如果已经有玩家赢了,则返回
return ;
if(point.x>=5 && point.x<=529 &&point.y>=5 && point.y<=529)//判断落子的位置{ x=(int)(point.x-23)/35;
y=(int)(point.y-23)/35;
if(point.x-23-x*35 >= 17)
x++;
if(point.y-23-y*35 >= 17)
y++;
if (fivechess.m_currBoard[x][y]==0) //如果该位置无落子
{ if (fivechess.m_chess==-1)
fivechess.GetInput(x,y);
}
else
{ MessageBox("请从新输入棋子!");
return;
}
Reflesh(); :
}
电脑后通过准确的判定,是四子相连、三子相连、两子相连还是一个棋子,得出最佳落子位置,再执行落子操作!判断棋子个数的关键代码如下:
for (step=1; step<=5; step++)
{ switch(searchtype)
{ case 0:xstep=step;ystep=0;break;//横向搜索
case 1:xstep=0,ystep=-step;break;//竖向搜索
case 2:xstep=-step;ystep=-step;break;//从左上右下方向搜索
case 3:xstep=step;ystep=-step;break;//从右上左下方向搜索
}
if(x+xstep<=15 && y+ystep>=0) //如果落子超出范围
{ if(b[x+xstep][y+ystep]==-chess)
{ bounHead = step;
break;
}
else if(b[x+xstep][y+ystep]==chess && break1==false)
{ contiNum1++;
chessNum++;
}
else if(b[x+xstep][y+ystep]==chess)
chessNum++;
else
break1 = true;
}
else
{ bounHead++;
break;
}
}
通过对玩家落子情况的统计,得到危险等级数并给分,最后判定下棋位置,判断危险等级及给分的代码实现如下:
long FiveChess::MarkOne(int chess,int x, int y, int b[][LINES])
{ long mark=0;//分数
//对当前下子点对棋盘b造成的影响进行评分
//横向扫描得到评分
mark += (Search(chess,x,y,b,3)+Search(-chess,x,y,b,0))/10;
//竖向扫描得到评分
mark += (Search(chess,x,y,b,3)+Search(-chess,x,y,b,1))/10;
//左上到右下方向扫描得到评分
mark += (Search(chess,x,y,b,3)+Search(-chess,x,y,b,2))/10;
//从右上到左下方向描得到评分
mark += (Search(chess,x,y,b,3)+Search(-chess,x,y,b,3))/10;
while (m_step != 1)
{ int tempboard[LINES][LINES];
for (int x=0; x<LINES; x++)
for (int y=0; y<LINES; y++)
{ if(b[x][y] == 0)
{ CopyBoard(tempboard,b);
tempboard[x][y] = -chess;
mark -= MarkOne(-chess,x,y,tempboard);
}
}
m_step++;
}
return mark;
}
long FiveChess::GiveScore(int type, int contiNum, int chessNum)
{ switch(contiNum)
{ case 1:return 5*type+chessNum*1;//活1,单活1给5分,双活1给10分
case 2:return 50*type+chessNum*10;//活2,单活2给50分,双活2给100分
case 3:return 500*type+chessNum*100;//活3,单活3给500分,双活3给1000分case 4:return 5000*type+chessNum*1000;//活4,单活4给5000分,双活4给10000 default:return 5000000;//活5以上。

}
}
(4)得到危险等级及其根据得分情况,电脑决定落子位置,具体实现落子代码如下:void FiveChess::ComputerPlay(int chess)
{ int x,y;
int tempboard[LINES][LINES];
for (x=0; x<LINES; x++)
for (y=0; y<LINES; y++)
if (m_currBoard[x][y] == 0)
{ m_step = 1;
CopyBoard(tempboard,m_currBoard);
m_markboard[x][y] = MarkOne(chess,x,y,tempboard);
}
long imaxMark;
bool bfirstMark=false;
for (x=0; x<LINES; x++)
{ for (y=0; y<LINES; y++)
{ if (m_currBoard[x][y] == 0)
{ if(bfirstMark == false)
{ imaxMark = m_markboard[x][y];
bfirstMark = true;
}
else if(imaxMark < m_markboard[x][y])
{ imaxMark = m_markboard[x][y];
m_xbest = x;
m_ybest= y;
}
}
}
}
m_xlast2=m_xbest;
m_ylast2=m_ybest;
m_currBoard[m_xbest][m_ybest] = chess;
}
⑸下棋后在FiveChess类中通过WhoWin函数实现输赢判断,只有相同颜色的棋子横竖斜连起来为5个才结束,再通过判断棋子的颜色可确定谁赢谁输,具体实现代码如下:int FiveChess::WhoWin()
{ int templateboard[LINES][LINES];
CopyBoard(templateboard,m_currBoard);
for (int i=0;i<LINES;i++)
for (int j=0;j<LINES;j++)
if (templateboard[i][j]==m_chess)
for (int searchtype=0;searchtype<4;searchtype++)
{ if(Search(m_chess,i,j,templateboard,searchtype)==5000000)
if (m_chess==-1)
return 1;
else
return 2;
return 0;
}
if (fivechess.m_winner==1)
MessageBox("恭喜你!下次可就没这么好运气了!");
if (fivechess.m_winner==2)
MessageBox("不要泄气,需要努力呀!");
(6)然后根据主函数的要求一步步实现游戏,游戏玩完后,可以按ESc退出即可。

3功能测试及运行效果
3.1游戏主页面
图3-1 空棋盘
进入游戏界面的空棋盘如图3-1所示。

点击最左上角菜单中“游戏”,选中“开始”,就开始人机对弈的五子棋游戏,默认的为计算机先落子,计算机使用白色棋子。

得到的界面如图3-2所示。

开始下棋后,计算机和玩家先后落子,只有当颜色相同的棋子横竖斜联成五个时才结束,最后根据棋子的颜色判断谁输谁赢,图3-3就是玩家与计算机对弈的一种情况。

图3-2 计算机先落白子图3-3 与计算机对弈
结束时根据棋子的颜色判断输赢情况,得到相应的输出的对话框,如下图3-4所示。

图3-4 计算机对游戏结果的提示
3.2结论
程序运行正常,各项功能正常,整个系统达到预期目的。

不足之处:程序计算落子边界控制做得不够好,有待改善。

3.3几点补充说明
1)考虑到程序的执行效率,人机对弈算法只对玩家的棋子进行了一步的推测。

2)计算机在落子时选取的是最佳的落子位置,所以如果玩家需要开动脑筋考虑清楚该在哪里落子,不然难有机会获胜!
3)人机对弈这个算法的开销很大,每一步落子都会考虑棋盘布局,又考虑对手的落子,从而达到步步为营的目的。

4)程序还有很多地方需要完善,例如:人机对弈边界处理不是很好,有待完善;还可以开发为网络对战游戏及完善游戏相关功能。

4总结
作为一名学生,特别是网络工程专业的程序编程学生,在系统的学习了一些编程语言之后,更加觉得自己应该多动手编程,做实训项目。

不进行实际的操作,很难在编写程序上有进步!编写自己的软件,即使是小程序,你也会向前迈进一大步。

我个人比较喜欢VC++,可以说我通过这次设计,把所学的各项技能很好的整合在一起。

又一次感受到了编程的乐趣,从中也学到了不少知识技巧,向前迈进了一大步!
通过编写这个程序,我体会最为深刻的一点是系统架构和设计模式的重要性。

即使是对于一个再小的程序,你已经做过但忘了的,再做一次又何妨,代码的组织和系统架构都是非常重要的,还因为这关系到日后的维护以及扩展。

设计这个程序之后,我感觉自己不仅实际动手能力有所提高,更重要的是进一步激发了我对专业知识的兴趣,是理论与实际得到一次很好的结合,并能够结合实际存在的问题在专业领域内进行更深入的学习。

对于我们计算机专业的学生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。

只有通过企业式的实训,才会了解工作需要什么,自己要学什么。

通过这次程序设计,使我了解自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,从而走上程序开发的专业道路。

致谢
这次毕业设计的开发过程中,我特别感谢我的指导老师吴俊华和我的同学好友对我的支持鼓励和好心帮助。

在这次开发过程中,我了解了许多有关程序员应该具备相关专业知识,使我了解自身状况与实际需要的差距,知道自己要学的知识,清楚地认识到自己努力的方向。

我再次感谢你们!
参考文献
[1]谭浩强,C程序设计.3版.北京:清华大学出版社.2005.
[2]谭浩强 ,C++程序设计. 北京:清华大学出版社,2004.
10。

相关文档
最新文档