分类号:
西安文理学院数学系学士学位论文
黑白棋游戏设计与开发
系院名称数学系
指导老师闫利娟
学生姓名赵扬扬
学生学号 021********
专业、班级数学与应用数学07级3班
提交时间 2011年5月24日
西安文理学院数学
西安文理学院数学系本科毕业论文任务书论文题目黑白棋游戏设计与开发
毕业年份2011系、专业、班级数学系、数学与应用数学3班
学生姓名赵扬扬学号021********
指导教师闫利娟职称
一、内容概要
随着世界经济的快速发展和计算机的日益普及,计算机游戏逐渐走进了人们的生活,成为大多数人娱乐休闲的主要方式。按照联网与否,计算机游戏可以分为单击游戏和网络游戏,单机游戏,指仅使用一台计算机或者其它游戏平台就可以独立运行的电子游戏。区别于网络游戏,它不需要专门的服务器便可以正常运转游戏,部分也可以通过局域网或者战网进行多人对战。游戏玩家不连入互联网即可在自己的电脑上玩的游戏,模式多为人机对战。因为其不能连入互联网而互动性稍显差了一些,但可以通过局域网的连接进行多人对战,而不需要专门服务器也可以正常运行的游戏。
本次毕业设计是基于c++语言,在vs2005平台上进行的单机版游戏开发,通过本次游戏的开发,有益于进一步掌握对c++语言的应用,加深对计算机游戏的制作理念的理解,对我今后参与更加复杂的游戏项目积累宝贵的经验!
黑白棋(Reversi、Othello),也叫苹果棋,翻转棋,是一个经典的策略性游戏。黑白棋是19世纪末英国人发明的。直到上个世纪70年代一个日本人将其发展,借用莎士比亚名剧奥赛罗(othello)为这个游戏重新命名,也就是现在大家玩的黑白棋。为何借用莎士比亚名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。他是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就是借用这个黑人白人斗争的故事而命名。
二、游戏规则
1、游戏元素
棋盘:本游戏使用8x8的棋盘,每次落子只能放在棋盘的格子中。
棋子:本游戏使用黑白两种棋子。执黑者先行,在每次游戏开始时,由玩家进行选择,若玩家选择执黑,则计算机选择执白。反之相似!
2、游戏玩法
(1)游戏的胜负:本游戏使用8x8的棋盘,由两人执黑子和白子轮流下棋,最后子多方为胜方。
(2)落子的要求:轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子。
(3)取胜的技巧:一般说来,下棋过程中,你必须尽量削减对手的行动力,同时增加自己的行动力,这种策略我们称之为行动力原则(或行动力战术)。当一方达到或接近这个目标时,我们就称该棋手控制了棋局。另外,这个战术的目的是迫使对方下坏棋,如果对方虽然可选位置很少,但每一步却总有好棋,那战术目的就没有达成。记住,你必须让对方完全无好棋可下。
黑白棋规则规定只能在对方棋子相邻的空位下棋,这就可以推出另一个原则。对方棋子边上的空位越多,你下棋的选择也就越多,换句话说,你的行动力就越强;相反,如果你棋子边上的空位越少,对方可下的位置也就越少。我们把相邻位置上有空位的子称为外子,反之称为内子,连在一起的外子称为前线或墙。下棋时要尽量减少自己的外子。
三、文献查阅指引
[1] 王浩.游戏开发经典案例详解.北京:清华大学出版社.2010:399-408.
[2] Stanley B. Lippman著.李师贤译.c++ Primer.北京.人民邮电出版社.2010.
[3] 詹红霞侯思颖陶永红等著.Visual C++ 程序设计教程.北京:清华大学出版社.2007.
指导教师签名:
年月日
教研室意见
负责人签名:
年月日系审核意见
负责人签名:
年月日
西安文理学院数学系本科毕业论文开题报告论文题目黑白棋游戏设计与开发
毕业年份2011系院数学系专业、班级数学与应用数学
07级3班
学生姓名赵扬扬学号021********指导教师闫利娟
一、研究的价值和意义
随着网络技术的日新月异和计算机的普及,当今的计算机技术也走上了平民化和娱乐化的时代,尤其是游戏产业的发展已经成为信息产业中发展势头最猛烈最具前景的一个分支。
windows是一款优秀免费的操作系统,目前使用用户持续增加。windows下的游戏目前非常多,未来几年内,windows游戏产业必将持续发展。
人工智能是一门极富挑战性的科学,随着计算机处理速度的飞速提高,人们很早就提出了疑问:计算机是否会超越人类?
结合上诉三者与一体,我决定用C++语言开发一款小游戏,游戏内容来自网络上日渐流行的一种智力游戏‘黑白棋’。黑白棋是一种在网络上日渐流行的小游戏,本身的人机对战又需要考虑到人工智能。
因此,我希望把平时界面简单、选项复杂的游戏,在windows里面做成漂亮的、简单的游戏程序,以给windows玩家一个新的选择。
同时,利用本课题设计的机会可以熟悉c++语言的各种特性,锻炼程序设计的实践能力,熟悉c++语言windows下的开发环境,熟悉前沿的windows图形用户界面的开发,以及巩固数据结构和算法等课程的学习成果,并深入理解数据结构和算法在程序设计中的核心地位。
最后,借助开发本次游戏的过程,可以熟悉人工智能的程序实现,有助于掌握棋类所需人工智能的常见算法,随着游戏产业的日益壮大,人工智能在游戏中的突出表现,人工智能越来越得到世人的重视。在这次的人机对战算法中,通过一定的算法,实现电脑的下棋及走棋运作,加深了对人工智能工作原理的了解。
二、研究的步骤方法
1.研究的目标和内容
研究目标:
通过对黑白棋游戏规则的研究,做出一款适合在windows系统下进行人机对弈的黑白棋程序出来,是本课题的研究总目标。
具体需要研究一下几方面:
1 黑白棋游戏规则;
2 黑白棋游戏技巧;
3 友好的用户界面;
4 单人模式的人工智能算法;
5 黑白棋游戏的常用功能(悔棋、难度选择等)。
主要内容:
1 总体设计:
一款黑白棋游戏软件主要分为界面开发、存储结构、规则设计、人工智能算法设计等四大模块。
2 具体设计:
具体设计阶段要把总体设计阶段规划好的界面、存储、规则、算法等一一实现。
在界面阶段通过调查分析设计好的界面用绘图工具首先绘制出来,并在程序中得以显示。
存储阶段采用二维数组来表示每个棋盘位置的状态。包括该处为空、黑子、白子、可下子点、不可下子点等。
规则设计通过分析黑白棋游戏自身规则规律,用代码在程序里还原游戏自身的规则。
算法设计通过学习其他程序和书籍的算法,来写出一套适用于本程序自身的算法,已实现人机对弈的机器落子过程。
3 系统测试:
通过不断对程序进行测试,找出程序中存在的bug,并修复bug,并不断完善游戏的功能,增加游戏的正确性和可玩性。
2.拟采取的研究方法、研究手段及技术路线、实验方案等
1开发环境:
开发语:c++语言;开发平台:windows操作系统中的vs2005平台。
2 研究方法及手段:
通过对比网上现有黑白棋游戏软件的优缺点,开发出一款更优秀的黑白棋游戏程序。
3 技术路线:
软件开发按照软件工程的思想进行。按照需求分析、系统设计、软件编程、软件测试、软件维护的顺序依次进行,前一阶段的输出为后一阶段的输入。
4 实验方案:
在每次程序代码改变或完成时,进行程序测试,及时发现自身问题并改正错误。
三、黑白棋游戏的总体设想
1.设计思路
本游戏设计是采用MFC对话框模式进行设计开发。所以从此游戏设计采用模块化思想,即程序整体设计分为五个模块来实现。分别为:主界面对话框类、棋盘窗口类、人工智能算法类、规则处理类、帮助对话框类。
2.结构设计
棋盘状态用数组a[8][8]初值为0表示空格。函数的实体比较简单,因为要输出图形,所以应初始化图形系统,图形工作方式正确确定后,画出棋盘,调用playtopc()人机对弈函数开始游戏。一旦游戏结束后,关闭图形系统,程序结束。
本次设计的主要函数有:
2.1. Create ()创建游戏的窗口、游戏中的图片。
通过windows编程中的LoadBitmap ()加载游戏所需要的图片。
2.2. OnPaint ()窗口绘图函数。
2.3. OnLButtonDown ()鼠标左键响应函数,点击鼠标左键下棋
2.4. computer_play ()电脑下棋函数
2.5. PlayMotive()根据游戏的规则翻转棋盘的棋子
根据游戏的等级,按照不同的搜索深度进行判断,实现电脑下棋。
2.6.do_move_chess()判断能否下棋落子。
2.7. game_over ()输出胜利者结果
根据分数值 score1和score2的大小得出下棋的结果,输出赢者信息。
3.流程图
3.1 交换棋手下棋流程图:
开始
当前位置能否棋
子?
Y
按鼠标左键下棋
更新棋盘
统计分数
换棋手
图1
3.2游戏的逻辑流程
开始
初始化游戏大小、棋盘
设置游戏的等级
棋手走棋
格子已满或一方没子了?
调用MoveColor 恢复格子
符合下子条件?
换棋手
结束
Y
N
N
图2
点击鼠标左键
三、主要参考文献
[1] George F.Luger Artificial Intelligence: Structures and Strategies for Complex Problem Solving Addison Wesley[M].2001-7
[2] Mat Buckland.Ai Techniques For Game Programming[M].Premier Press.2002.
[3] 张宏林.数字图像分析与处理技术[M].北京:人民邮电出版社 2003-2.
[4] 棋类游戏的智能模块设计――浅谈人工智能[J].2004-09.
[5] 蔡自兴,徐光祐.人工智能及其应用(第三版)[M].北京:清华大学出版社.2003-9.
[6] 杜秀全,程家兴.博弈算法在黑白棋中的应用[J].2003.
指导教师意见及建议
签字:
年月日
系(院)主管主任意见及建议
签字(盖章):
年月日
黑白棋游戏设计
赵扬扬
(西安文理学院数学系,陕西西安710065)
摘要:本次毕业设计是基于c++语言,在vs2005平台上进行的单机版游戏开发,通过本次游戏的开发,有益于进一步掌握对c++语言的应用,加深对计算机游戏的制作理念的理解,对我今后参与更加复杂的游戏项目积累宝贵的经验!
黑白棋(Reversi、Othello),也叫苹果棋,翻转棋,是一个经典的策略性游戏。黑白棋是19世纪末英国人发明的。直到上个世纪70年代一个日本人将其发展,借用莎士比亚名剧奥赛罗(Othello)为这个游戏重新命名,也就是现在大家玩的黑白棋。为何借用莎士比亚名剧呢?是因为奥赛罗是莎士比亚一个名剧的男主角。他是一个黑人,妻子是白人,因受小人挑拨,怀疑妻子不忠一直情海翻波,最终亲手把妻子杀死。后来真相大白,奥赛罗懊悔不已,自杀而死。黑白棋就是借用这个黑人白人斗争的故事而命名。
关键词:c++编程;windows编程;MFC技术
论文目录
第一章引言 (1)
1.1 c++简介 (1)
1.2 window编程介绍 (1)
1.3 Visual studio开发平台简介 (1)
第二章毕业业设计的目的及要求 (2)
2.1毕业设计的目的 (2)
2.2毕业设计的开发环境 (2)
2.3毕业设计所需的知识 (2)
2.4毕业设计要求 (2)
第三章毕业设计的内容 (3)
3.1程序功能介绍 (3)
3.2程序整体设计说明 (4)
3.3程序源代码及注释 (7)
第四章结束语 (23)
第一章引言
1.1 c++语言介绍
C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
1.2 windows编程介绍
Windows是微软推出的图形界面的操作系统,有windows2000、XP、Vista、win7等各种版本。是一种抢占式多任务的操作系统,是PC上的主流操作系统,在PC操作市场占绝大多数网络游戏的客户端、服务器端都可在上运行。
Windows程序由一个或多个的窗口组成,通常是多个窗口。窗口一般是一个矩形的区域,由windows对窗口进行统一管理。任何的文字、图形都写窗口中显示。
windows 系统设计为事件驱动的操作系统,事件在windows定义为消息,消息为应用程序和应用程序间、应用程序和操作系统间提供了信息传递的渠道。消息队列,由Windows维持。
1.3 Visual studio开发平台简介
Visual Studio是微软公司推出的开发环境,visual Studio可以用来应用创建windows平台下的windows程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件。目前已经开发到10.0版本,也就是Visual Studio 2010.我们本次毕业设计的开发平台就是其中的Visual Studio 2005。
第二章毕业设计的目的与要求
2.1 毕业设计的目的
通过对黑白棋游戏规则的研究,做出一款适合在windows系统下进行人机对弈的黑白棋程序出来,是本课题的研究总目标。
具体需要研究一下几方面:
1.黑白棋游戏规则;
2.黑白棋游戏技巧;
3.友好的用户界面;
4.单人模式的人工智能算法;
5.黑白棋游戏的常用功能(难度选择)。
2.2 毕业设计的开发环境
开发语:c++语言;
开发平台:windows操作系统中的vs2005平台。
2.3 毕业设计所需的知识
熟悉c++语言及vs2005开发平台。
2.4 毕业设计要求
1. 分析毕业设计题目的要求
2. 写出详细设计说明
3. 编写程序代码,调试程序使其能正确运行
4. 设计完成的软件要便于操作和使用。
第三章毕业设计的内容
3.1程序功能介绍
1.显示游戏的界面功能
游戏界面上包括游戏等级选择、重新开始、游戏帮助的控件对游戏进行相应的设置。
2.接受鼠标输入功能
能够接受玩家的鼠标输入功能,把棋子放入指定的位置。
3.根据规则翻转相应的棋子
无论是电脑或是玩家在棋盘中落下棋子后,能够根据游戏的规则,把横向、纵向及对角直线上的棋子全部翻转过来,变成最后落下棋子的颜色,并对棋子数量进行增减。
4.游戏胜负判断功能
双方都没有棋子可下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没下满时,如果一方的棋子应经被对方吃光,则棋局结束。将对手棋子吃光的一方获胜。
5.实现人机对战模式
支持人工智能,根据游戏等级的不同,进行不同的算法深度搜索,找出最合理的位置进行落子操作。
6.人工智能的等级设置
能够指定当前电脑人工智能的等级。根据不同的等级,其算法搜索深度不同。
7.游戏提供帮助说明
在游戏界面中,提供一个控件。以方便对本游戏不了解的玩家对游戏进行操作和使用。
黑白棋功能架构:
3.2程序整体设计说明 1.设计思路
本游戏设计是采用MFC 对话框模式进行设计开发。所以从此游戏设计采用模块化思想,即程序整体设计分为五个模块来实现。
主界面对话框类:主要负责主界面及棋盘、棋子的显示及棋盘窗口对象的创建和调用。
棋盘窗口类:主要负责接受玩家鼠标输入的棋子位置及棋子翻转动画等 处理。
黑 白 棋
棋子操作功能
棋子翻转功能
主界面显示功能
人工智能功能
棋子动画翻转
棋子数组更新
棋
子及棋盘的显示
游戏等级的设置
帮助功能
图3-1
人工智能算法类:主要负责电脑的人工智能算法的处理。
规则处理类:主要负责棋子数据的统计、落子位置有效及胜负判断等处理。 帮助对话框类:主要负责帮助提示的显示及其他辅助消息。
2.程序结构(流程图)
黑 白 棋 游 戏
主 界 面 对 话 框 类
棋 盘 窗 口 类
规 则 处 理 类
人 工 智 能 算 法 类
帮 助 对 话 框 类
图3-2
载入游戏初始化
游戏设置判断有斯是否开始
帮助
弹出帮助
对话框
设置游戏等级
高中低点击鼠标
左键下棋
电脑
下棋
判断棋盘变化
调用PlayMotive函数
改变前盘棋子
盘其中白棋和黑棋是否
满足结束条件
游戏结束
图3-3
N
N N
N
Y
Y
Y
Y
3.程序结果
人执黑棋,电脑执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。按鼠标左键可以摆放棋子。下到最后谁的棋子多,谁赢。
3.3 程序源代码及注释
1、游戏对话框中控件的设置
消息与成员函数映射:
BEGIN_MESSAGE_MAP(COthelloDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_HELP, &COthelloDlg::OnBnClickedButtonHelp)
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_RADIO1, &COthelloDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &COthelloDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &COthelloDlg::OnBnClickedRadio3)
ON_BN_CLICKED(IDC_START, &COthelloDlg::OnGameStart) END_MESSAGE_MAP()
帮助控件的实现:
void COthelloDlg::OnBnClickedButtonHelp(){
// TODO: 在此添加控件通知处理程序代码
HelpDlg helpDlg;
helpDlg.DoModal();
}
“低”空间的实现:
void COthelloDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_LOW;
}
“中”控件的实现:
void COthelloDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_NOR;
}
“高”控件的实现:
void COthelloDlg::OnBnClickedRadio3()
{
// TODO: 在此添加控件通知处理程序代码
g_iGameLevel = LEVEL_HIGH;
}
游戏开始控件的实现:
void COthelloDlg::OnGameStart()
{
// TODO: 在此添加控件通知处理程序代码
GameStart();
}
void COthelloDlg::GameStart()
{
m_nBlackCount = 2;
m_nWhiteCount = 2;
m_chess.NewGame();
}
2、棋盘窗口的设计
CChessBoard类的构造函数:
CChessBoard::CChessBoard()
{
m_iMotiveNumber=0;
m_iMotivex = m_iMotivey=0;
m_bPlayMotive = FALSE;
init_board(&m_oChessBoard);
}
CChessBoard::~CChessBoard()
{
}
消息与成员与函数映射:
BEGIN_MESSAGE_MAP(CChessBoard, CWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_CREATE()
ON_MESSAGE(UM_COMRUN, OnComRun)
ON_MESSAGE(WM_TRANCHESS, OnTranChess)
END_MESSAGE_MAP()
延时函数:
void delay(INT32 millisecond)
{
clock_t start = clock();
do
{
MSG msg;
if (::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
if ( !AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return;
}
}
}while(clock() } 改变棋子接口函数 LRESULT CChessBoard::OnTranChess(WPARAM wParam, LPARAM lParam) { int row = wParam/10-1; int col = wParam%10-1; CRect r(col*COL_WIDTH+22, row*ROW_WIDTH+22, col*COL_WIDTH+COL_WIDTH+22, row*ROW_WIDTH+ROW_WIDTH+22); m_bPlayMotive = FALSE; OnPaint(); InvalidateRect(&r); if((lParam>>16) !=0) PlayMotive(row, col, UINT8(lParam)); return 0; } 由电脑人工智能下棋 LRESULT CChessBoard::OnComRun(WPARAM wParam, LPARAM lParam) { computer_play(&m_oChessBoard, m_hWnd); UINT16 wscore, bscore; get_chess_score(&m_oChessBoard, wscore, bscore); GetParent()->SendMessage(UM_RECALC, WPARAM(wscore|0x80000000), LPARAM(bscore)); return 0; } 新游戏 void CChessBoard::NewGame() { if(cur_step >0) { g_bStart = 1; init_board(&m_oChessBoard); Invalidate(); } } 窗口建立函数