课 程 设 计 说 明 书
课程名称: 软件工程
设计题目: 黑白棋
院 系: 计算机科学与信息工程学院
学生姓名: 高宁
学 号: 200803040045
专业班级: 网络工程
指导教师: 王 瑞 平
2011年 06月 24日
课 程 设 计 任 务 书
设计题目
黑白棋
学生姓名
高宁
所在院系
计算机科学与信息工程学院
专业、年级、班
08网络工程二班
设计要求:
a游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。b下棋方法:黑白棋的棋盘是一个有8*8方格的棋盘。下棋时将棋下在空格中间,而不是像围棋一样下在交叉点上。开始时在棋盘正中有两白两黑四个棋子交叉放置,黑棋总是先下子。下子的方法把自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜八个方向內有一个自己的棋子,则被夹在中间的全部翻转会成为自己的棋子。并且,只有在可以翻转棋子的地方才可以下子。胜负判定条件如果玩家在棋盘上没有地方可以下子,则该玩家对手可以连下。双方都没有棋子可以下时棋局结束,以棋子数目来计算胜负,棋子多的一方获胜。在棋盘还没有下满时,如果一方的棋子已经被对方吃光,则棋局也结束。将对手棋子吃光的一方获胜。
学生应完成的工作:
概要设计
参考文献阅读:
《实用软件工程》作者:赵池龙 杨林 孙伟(第二版)电子工业出版社 2006.9
《Visual C++教程》作者:郑阿奇 主编,丁有和(第2版)机械工业出版社
《VC++2008专题应用程序开发实例精讲》作者:张忠帅 电子工业出版社2008.10.1
工作计划
幼儿园家访工作计划关于小学学校工作计划班级工作计划中职财务部门工作计划下载关于学校后勤工作计划
:
1. 6月10号 ~ 6月13号 概要设计
2. 6月14号 ~ 6月16号 界面美化设计
3.6月21号 ~ 6月24号 模块功能测试
任务下达日期: 2011 年 6 月 10 日
任务完成日期: 2011 年 6 月 24 日
指导教师(签名): 学生(签名):
黑白棋
摘 要: 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别,自然语言处理和专家系统等。“人工智能”一次最初是在1956年在Dartmouth学会上提出的。从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展。
本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算技术和人工智能技术不断发展,计算机下棋水平得到了长足的进步。
黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。它的游戏规则简单,因此上手很容易,但是它的变化又非常复杂。有一种说法是:只需要几分钟学会它,却需要一生的时间去精通它。
该程序主要运用的战术有削弱对手行动力战术,四角优先战术、最大贪吃战术。在游戏开局和中局时,程序采用削弱对手行动战术,即尽量减少;在游戏终局时,则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角为稳定角,不会被对手吃掉,所以这里是兵家必争之地,在阻止对手进角的同时,自己却要努力地进角。
关键字: 人工智能 行动力 扫描 战术
目 录
1.设计背景 5
2.设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
6
2.1总体设计 6
2.2模块设计 7
3. 方案实施 7
3.1主界面名控件的实现 7
3.2程序流程图 9
3.3详细设计 12
4. 结论与结果…………………………………………………………………...13
4.1运行情况…………………………………………………………………..14
4.2结果………………………………………………………………………..14
5. 收获与致谢 15
6. 参考文献 16
1.设计背景
VC语言的学习是很有前景的,VC语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为VC自身的功能的强大。有了这两点,VC语言成为一种重要的开发工具就在情理之中了。
黑白棋,又叫翻转棋(Reversi)、苹果棋或奥赛罗棋(Othello)。一般棋子双面为黑白两色,故称“黑白棋”。因为行棋之时将对方棋子翻转,变为己方棋子,故又称“翻转棋”。棋子双面为红、绿色的称为“苹果棋”。 黑白棋的前身是英国人发明的翻转棋(Reversi),后来由日本的长谷川五郎加以改进,并改称为奥赛罗棋(Othello),国内习惯上称之为黑白棋。这个棋类游戏在西方较为流行,但在中国起步较晚,还不很流行。
黑白棋作为一个棋类竞技运动,在民间十分流行,为了熟悉黑白棋规则及技巧,以及研究简单的人工智能,决定用VC开发黑白棋游戏。主要完成了人机对战功能,有很好的可扩展性。在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高提高电脑AI方案,如递归算法、电脑学习等。算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。尽管黑白棋的规则比较简单,但它所包括的丰富战略,不亚于那些相当“经典”的策略游戏。其中人工智能部分,由于采用了大量的搜索算法,其中很多被利用到各方面。
2.设计方案
2.1总体设计
这个题目核心是人工智能和Socekt编程,并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。它的概念、方法和技术,正在各行各业广泛渗透。智能已经成为当今各种新产品、新装备的发展方向。所以,趁着这个机会,对人工智能中比较容易实现的人机博弈进行了解研究学习,也是很实用且很有必要的。电脑究竟能否最终战胜人脑?这是大家一直在探索的问题。自从1997年黑白棋程序Logistello战胜冠军棋手村上健以来,电脑程序已经把人类棋手远远抛在后面。目前,程序可以记住大量的开局定式、可以正确地判断局面的优劣、可以思考到二十几步之后的局面,这都是人类棋手远不能及的。然而,电脑的这一切又都是人类所赋予的,因此究竟电脑和人脑孰优孰劣,还难以定论。
近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表,其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱。
越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。自己对人工智能比较感兴趣,而黑白棋游戏程序的开发实现这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。人工智能属于计算机科学的领域,它以计算机技术为基础,近几十年来,它的理论和技术已经日益成熟,应用领域也正在不断扩大,显示出强大的生命力。人工智能大致可以分成几个学科,它们每一个都是独特的,但是它们常常又互相结合起来完成设计任务,这时,这些学科之间的差别就变的很模糊。人工智能在专家系统,自然语言理解,自动定理证明,自动程序设计,人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实质上是博弈论问题)和家用电器智能化等领域都有广泛的应用。而这个课题就是和人工智能中的博弈论领域紧密相关的。
2.2模块设计
本系统分六个模块:黑棋用时,白棋用时,黑棋数目,白棋数目,限时,走棋速度。
各模块的功能:
黑棋用时:计算并记录黑棋所用的时间;
白棋用时:计算并记录白棋所用的时间;
黑棋数目:记录黑棋的总个数:
白棋数目:记录白棋的个数:
限时:可以分为“限时”和不限时,如果限时可以根据自己的需要调整限制的时间;
走其速度:计算奏起的速度。
3. 方案实施
本系统是窗口式应用软件,将采用C/S模式来设计,所以大部分模块功能都是用窗口来显示。
为了体现窗口的界面风格,每一个模块中的功能都放在菜单中的各个菜单项上,这样可以让用户更加方便的使用该软件。
3.1主界面各控件的实现
保存一个盘棋的实质就是保存这个棋的堆栈。当要点击 “ 保存棋局” 按钮时, 调用 C C h e ssVie w:: OnFileSave ( ) , 此时会打开另一个窗口, 让你输入一个要保存文件的文件名, 后缀名程序 自动设定为. CHESS 。 当点击“ 保存” 按钮后, 将调用 CChessView::Serialize(o这里用的是串行化保存。先保存三个全局变量 : ChessType, human, computer 。之后将会调用Othello _ r j ::Serializel (o 这时再保存一个 int 变量 StackSize , 为要保存的栈的元素个数, 这在下面的“ 载入” 功能时有用。之后是最关键的一步, 保存整个当前栈s t 。增加一个辅助栈因为要保存整个栈需要遍历整个栈 , 所以需要有另外一个栈来保存弹出来的元素, 当串行化保存完整个栈后,再把 s t 里面保存的元素重新压人到当前栈st , 之后即可以继续进行当前的游戏。而为了操作方便 , 还要把当前的状态再串行化保存 , 并且保存了另外一个数据: record , 这个数据保存的是当前这盘棋所走的棋谱信息,这个数据为的是在载入时可以把载入的棋所走的信息直接输出在 List Box 上, 所以只用保存一次。
“ 载入” 是在任意时刻都允许的。点击“ 载人” 按钮后, 调用 CChess View::On FileOpen ( ) , 这时会出现一个窗口, 让你选择要载人的文件 , 文件 的后缀名必须是. CHESS,点击 “ 打开”按钮后,同样 调用的是CChessView::Serialize1 ( ) , 以黑白棋( 人机对战) 为例, 先载人三个全局变量和之后清空当前栈, 现在要做的就是把串行化保存的数据拿出来再生成一个当前栈, 调用 Othello_ rj ::Serialize 2 ( ) , 这时将会按顺序把保存进去的数据再拿出来赋给当前类 othello _ rj ,然后先把这个类压入到辅助栈 s t 中。因为是堆栈 ,所以保存进去时的数据跟现在拿出来的数据的J 顷序刚好相反,所以当把所有的数据都拿出来保存在 s t里面时, 再把 s t 里面的数据压入到 s t ,即当前栈中,这样 , 就把以前保存的棋的栈完整地复原到当前栈中了,这时再调用一次Othello_ rj ::Serialize 2 把剩下的数据赋给当前类, 回到以前保存 时那个棋的状态 重 画棋盘,输出信息到控件。