ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:1,021.63KB ,
资源ID:5045517      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5045517.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C#五子棋设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C#五子棋设计.docx

1、C#五子棋设计一、需求分析1.项目背景五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区。规则为双方交替落子,直到有一方下出五子连续,五子连珠为赢。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。2.可行性分析2.1技术可行性技术上的可行性分析主要技术条件是否顺利完成开发工作,硬、软件是否满足开发者的需要等。该系统的软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,

2、价格越来越低,棋硬件平台完全能满足此系统的需求。而且网上有许多关于五子棋软件的设计的文献资料以及核心代码,同时组员兴趣浓烈,有信心完成该项目的开发工作,综上所述,本项目技术上可行。2.2经济可行性此项目所需用环境平台、技术、所需其他东西都是可以找到的,所以经济上可行。并且本系统实施后可以让用户很好的对五子棋进行更加深入的研究,有助于开发用户智力。2.3管理可行性主要是管理人员是否支持,现有的管理制度和方法是否科学,规章制度是否齐全,原始数据是否正确等。规章制度和管理方法为系统的建设提供了制度保障。2.4操作可行性操作上是鼠标的使用,主要凭借在棋盘上点击方格或按钮进行游戏,方便简单。使用前只要看

3、明白游戏规则及其方法即可。3项目技术支撑3.1开发环境在Visual Studio 2012集成开发环境下用C#语言及.NET架构编写软件;采用SQL Server实现棋局信息传输中的数据储存功能。3.2理论支持五子棋核心算法、CS架构、多线程、socket机制。3.3理论介绍3.3.1 C#简介C#是一种安全的、稳定的、简单的、优雅的,由C和C+衍生出来的面向对象的编程语言。它在继承C和C+强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C+的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.

4、NET开发的首选语言。1C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。3.3.2 CS架构C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处

5、理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。具体表现在以下两点:(1)应用服务器运行数据负荷较轻。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结

6、果,应用服务器运行数据负荷较轻。(2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,并且通常把那些不同的(不管是已知还是未知的)前台应用所不能违反的规则,在服务器程序中集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。3.3.3 socket机制Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。 So

7、cket通常用来实现客户方和服务方的连接。客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在

8、不同的主机和进程之间转发进行。二、概要分析 1. 基本设计概念1.1总体处理流程本软件采用面向对象的设计方案,通过把对弈接口组件化,来实现界面设计与算法设计的完全分离。 1.2结构表1 类模块列表类标识符类名功能TGobangForm五子棋主程序窗体类它是程序界面设计部分的实现,它主要负责界面的绘制,而真正的人机对弈操作委托GobangAI来完成。TGobangAI五子棋对弈接口类它定义了完成人机对弈的操作接口,这样主窗体类可以通过这些操作接口来完成人机对弈的过程。而实际这些操作的实现是通过桥接的方式委托搜索引擎SearchEngine来完成的。TBestMove最佳走法的线程类它是通过委托T

9、GobangAI实例中的SearchEngine对象的GetBestMove操作来找出当前电脑的最佳走法。而它本身却是在TGobangAI中被实例化并被调用的。TSearchEngine搜索引擎类在它当中定义了搜索算法所需要的数据结构和操作,而搜索算法中的核心操作是委托估值核心Evaluator来完成的。TEvaluator估值核心类在它当中定义了估值核心所需要的数据结构和操作,并实现了估值核心。表2 各个类中的属性和操作列表属性操作标识符所属类功能BoardTGobangAI返回指定位置落子状态,委托SearchEngine实现MoveTGobangAI返回所指定的步数的走法,委托Searc

10、hEngine实现ScoreTGobangAI返回所指定步数的走法得分,委托SearchEngine实现CurMoveTGobangAI返回当前走法索引,委托SearchEngine实现StoneColorTGobangAI设定或返回电脑的棋色LevelTGobangAI设定或返回电脑的棋力水平值IsStartTGobangAI返回游戏是否开始AddStoneTGobangAI玩家下子,如果玩家未赢,则紧跟着电脑下子GiveUpTGobangAI玩家认输GoBackTGobangAI玩家悔棋,棋局退回到玩家下最后一颗子之前的状态StartTGobangAI开始游戏,开局后,棋色和棋力属性将不能

11、再改变StopTGobangAI结束游戏,游戏结束后,棋色和棋力属性可以改变BoardTSearchEngine返回或设定指定位置落子状态,委托Evaluator实现MoveTSearchEngine返回所指定的步数的走法ScoreTSearchEngine返回所指定的步数的走法得分CurMoveTSearchEngine返回当前走法索引WinnerTSearchEngine返回获胜者IsGameOverTSearchEngine返回游戏是否结束GetBestMoveTSearchEngine返回最佳走法BoardTEvaluator返回或设定指定位置落子状态IsDrawTEvaluator返

12、回是否平局GetScoreTEvaluator返回棋局估值上面所列出的属性和操作仅为public的属性和操作,private的变量、属性和操作这里没有给出定义,它们将在接口设计和系统数据结构设计中进行讨论。另外TGobangAI是一个组件类,其中定义了三个比较特殊的事件属性,通过这三个事件,可以使界面设计更加灵活方便,这三个事件的功能在下表中给出:表3 TGobangAI组件中的事件定义列表事件描述OnGameStart游戏开始事件OnChange游戏中棋盘状态改变所触发的事件OnGameOver游戏结束事件1.3 功能需求与程序的关系TGobangFormTGobangAITSearchEn

13、gineTEvaluator界面界面算法接口算法1.4 尚未解决的问题因为博弈算法中搜索引擎的改进是影响整个游戏智能化程度的关键,但是搜索算法有很多,现在还不能确定哪种搜索算法更适合于本游戏,这些算法的测试将在详细设计和编码调试时再进行。2. 接口设计2.1 用户接口用户的所有操作全部通过鼠标或者热键来完成。开始游戏、悔棋、认输和结束游戏这些操作通过点击按钮、右键菜单或使用热键来完成。棋色和水平选择通过点击单选框或右键菜单来完成。游戏中棋子状态将直接反映在棋盘上,其他反馈信息(比如棋盘当前局面、走棋时间、棋谱等信息)将在单独的反馈信息栏中显示。2.2 外部接口本程序与其他比赛程序通过裁判程序(

14、有比赛裁判委员会给出)来进行相互通讯,棋盘上落子通过鼠标事件的触发来完成,裁判程序将模拟这一鼠标事件。裁判程序对棋盘状态的获取将直接根据棋盘颜色变化来检测。2.3 内部接口TGobangAI组件定义了界面和算法的接口,TGobangAI中聚合了TSearchEngine类的实例FSearchEngine,而TSearchEngine中聚合了TEvaluator的实例FEvaluator。通过这种设计,提高了系统的松散耦合性。3.流程图3.1主模块图 界面及图形模块 3.2主流程图 服务器端与客户端流程图 3.3模块流程图 Step+ Step值的奇偶来判断,初值为0 奇 偶 step+ 否 是

15、 是 否 棋手下棋流程/棋色类型TStoneColor = (scBlack, /黑棋 scWhite); /白棋/落子点状态类型TPointState = (psBlack, /有黑棋 psWhite, /有白棋 psNone, /没有棋 psInvalid); /无效位置 A D/ ENTER/SPACE W/ S/ ESC 有 无 是 否 电脑下棋流程三、详细设计 1.基本操作1.1界面以及落子处理 1.使用二维数组Chessboard15,15储存棋盘的状态,以0表示没有放子的位置,以1表示放黑子的位置,以2表示放白子的位置; 2.以鼠标的状态提示当前持子的一方; 3.将棋盘作为图片的

16、形式贴处在程序界面上; 4.加载棋子资源(黑、白棋子),当鼠标在棋盘上点击的时候产生事件,处理鼠标的位置产生对应的棋盘坐标位置; 5判断落子出是否可以落子:不可以则不做任何处理,不改变鼠标的状态;可以落子,则打印对应的棋子图像,记录棋盘位置,并将位置传递给判定函数; 6.交换持子方,重复落子过程,直到判定函数产生胜出结果;2 程序流程 本程序由六个基本功能模块构成,各模块的详细分析如下:(1)初始化:首先,建立盘面数组board2121、对战双方的棋型表Computer21214和Player21214并将它们清零以备使用(2)主循环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序转到相应

17、的模块中去,主要担当一个调度者的角色。(3)玩家下子:当轮到玩家下时,玩家通过鼠标在棋盘上落子,程序会根据该点的位置,在board2121数组的相应地方记录。(4)盘面分析填写棋型表:本程序核心模块之一,人工智能算法的根本依据!其具体实现方法如下:玩家在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一些点位,如“活三”、“冲四”等;然后再在其中选择落子点。但是,电脑不会像人一样分析问题,要让它知道哪是“活三”、哪是“冲四”,就得在棋盘上逐点计算,一步一步的教它。先来分析己方的棋型,从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中心向左挨个查找,如果遇到己方的子则记录然后继续

18、,如果遇到对方的子、空白点或边界就停止查找。左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computerxyn中就行了(x、y代表坐标,n=0、1、2、3分别代表横、竖、左斜、右斜四个方向)。而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也就填写完毕了。然后再用同样的方法填写电脑的棋型表。 电脑下子:有了上面填写的两张棋型表,现在要作的就是让电脑知道在哪一点下子了。遍历棋型表Computer15154和Player15154找出其中数值最大的一点,在该点下子即可。1.2五子棋判胜本功能模块主要对游

19、戏的胜负进行判定.1.由玩家输入棋子所在位置,由系统判定胜负,若胜,则游戏结束;否则,游戏继续.2对胜负判定需先确定一个中心棋子位置.3由一个中心棋子可以引出四条线形成五子连一线.4判定过程中注意越界现象.概要设计1 五子棋的判胜条件即为5个相同的棋子连在一条线上.2 以一个棋子为中心,有4条线可以形成五子连线.如图所示:(描红的为中心棋子) 3 中心棋子即为最后一步所下棋子.4 以1线为例,从中心棋子出发(设为白子),先向左进行判断,若棋子为白子,则计数器加1(初始值为1),否则(为黑子或无子),则返回中心棋子,向右进行判断,进行相同操作.5 1线判定结束后,若计数器为5,则判白子胜,否则,

20、计数器归1,再从2,3,4线按顺序进行判定.6 棋盘的每个坐标有3个状态,分别为无子(标记为0),白子(标记为1),黑子(标记为2),对棋盘点进行判断时,只需判定其所在状态即可。7 若棋盘下满,仍未有五子连线,则判和。流程图为:1.3悔棋 开始以前按钮设置为禁止(F),只有在棋局的过程中,并且轮到该本方落子,并且棋盘有2个棋子或2个棋子以上时,“悔棋”按钮才被置于激活状态(T);一局比赛中只可以悔棋2次。结构化说明:IF 本方下棋 IF count棋子=2 激活“悔棋”按钮 IF 对方同意 count棋子=count棋子-2 ELSE 返回 ELSE 返回ELSE 返回 在游戏中,如果一方点击

21、“悔棋”按钮,则向对方提出悔棋请求。对方在收到“悔棋”请求后会弹出确认对话框,点击“是”接受“悔棋”请求,也可以点击“否”来 拒绝。如果点击接受按钮,则在双方棋盘上清除最新下的两个棋子,然后请双方继续进行下子操作。流程图为:1.4.人机对战算法1.4.1知识准备极大极小树目前绝大部分的博弈类游戏中的人工算法都采用这种方法。假设己方为MAX点,对方则为MIN点。如果当层的节点为奇数时那么就为MAX层,同样节点为偶数时就为MIN层。当在MAX层时,该层的值就应该为下一个MIN层中的最大一个的值。当在MIN层是,该层的值就应该为它子层MAX的最小的一个。深度优先搜索在图论中有两个很重要的遍历的方法,

22、一个是深度优先搜索(DFS),另外一个是广度优先搜索(BFS).这两个方法的主要区别在于下一个节点的选择。DFS首先选择它的连接节点,若它的下个节点已经全部被遍历过或者不存在的话。则向上返回到上一个节点,在遍其他的未被访问过的点。很容易想到这要用到堆栈结构,使用一个递归来实现。而BFS则是逐个的遍历它的联接接点,将已经访问过的点放入队列中。然后再依次取出继续这个过程。剪枝方法当预测的深度达到3的时候,最坏情况下225*225*225=11390625个,这在目前的一些常规平均的机器性能下也需要40多秒的时间,这是不能够容忍的。那么是否有很好的改进技术,去除那些不必要的节点,并且在剪去了这些点后

23、不影响结果呢?答案是肯定的,这种方法就是Alpha-Beta剪枝。1.4.2算法的设计思路本设计所使用的人工智能算法主要分为四步: 第一步:考虑到系统的运行效率,根据平常下棋的经验,第一步子不需要经过复杂的分析计算。如果人类玩家下的第一步子是落在棋盘边界上时,则电脑的第一步子将落在棋盘的正中央;否则,电脑的第一步子将在紧挨着人类玩家第一步子的左边位置落下。 第二步:为了缩短系统搜索分析时间,防止电脑每下一步棋都要将整个棋盘上所有的空白点都分析一次,本设计将设计一个函数计算搜索范围。然后根据搜索范围进行第一次搜索分析,排除不在搜索范围之内的空白点、不可能连成五子即不可能胜利的点以及活1,半活2点

24、。搜索游戏双方有没有哪方即将胜利,即双方有没有成五或者可不可以制造出活4。 第三步:对第一次分析的结果进行再次分析。找出双方可以制造出活4的点的位置,如果没有的话,就分别整理出双方可以制造出活3的点的位置,半活4的点的位置,双活3的点的位置,半活3的点的位置,双活2的点的位置,活2的点的位置。第四步:由前两次的搜索分析得出双方都不可能制造活4,所以只能找活3,再没有的话就找半活4,在没有的话就找单活3,双活2等棋型。1.4.3算法流程遍历整个棋盘,找出所有空白点,在每个空白点判断与该点相邻的4个方向上各方连续的棋子数,在每一个方向上,判断白子和黑子的连续的个数,判断活3,冲4等各种棋形状况,为

25、各种状况赋权值。然后将该方向上的权值返回,将每个空白点的各个方向的权值相加,为该点权值。令设计一个数组,储存每个空白点权值,然后在遍历整个棋盘空白点,计算出每个空格点,找出权值最大点,也就是当前情况下,电脑最应该落子的点。返回权值最大的点的坐标确定棋盘为二维数组,先写一个machine函数,用双重for(i,j)语句,遍历整个棋盘,找出所有空白点,即bkmapij=0.写4个函数分别判断上,右上,右下,右,4个方向上连续的黑子数,连续的白子数。在每个方向上用counter1记录白子数。用counter2记录黑子数,如果白色有是那个连续(counter1=3),加权20;如果黑色有三个连续(co

26、unter2=3),加权10;如果白色有4个相连(counter1=4),加权100;如果黑色有4个相连(counter2=4),加权70.另外设置一个side变量,用来记录棋子两边的阻碍数,判断黑子两边是否有白子或已到边界。然后记录(counter1+counter2)*5-side为该点在该方向上的权值,返回该权值到machine 中定义一个三位数组computerij4,其中i,j为空白点坐标,4代表4个方向,将每个方向上的返回值分别赋给computerij0 computerij1 computerij2 computerij3,即该点4个方向权值均确定然后再遍历整个棋盘空白点,计算出

27、每个空格点4个方向上权值的总和,做比较,放回权值最大的点的坐标(这里用全局变量dx,dy表示)即通过比较,不断修改全局变量的值,最后所得的dx,dy点就是计算机落子点。流程图为:2.系统链接2.1服务器的设计 网络五子棋是采用网络协议为TCP/IP的网上对弈游戏,运用“客户端服务器“(c/s)网络架构模式。服务器可以创建任意多局游戏。 通过使用多线程和网络套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯。开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,服务器始终处于监听状态。客户端是动作的发起者,何时发出申请由客户端决定。客户端向服务器发出申请,服务器给予响应

28、。打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS连接建立后,创建一个SOCKET实例,并开始一个线程,监听该客户端请求。服务器继续监听其它用户的连接。服务器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的信息发送给客户端。客户端发送请求和响应接收到的各种信息。 TCP/IP协议的作用在于网络互联,但其本身就是物理网上的一组完整的网络协议集。TCP在传输层上提供服务,IP在互联网层上提供服务。这两个主要协议提供的服务,加上高层的服务,共同实现了TCP/IP协议集的功能。Socket是一种应用程序的编程接口,它通过一组管套函数使应用程序在本地系统和远程系统之间建立通信信

29、道,实现连接的管理和数据的传输。它为网络上进程之间的通信提供了一种透明的方法,并支持包括TCP/IP在内的多种网络通信协议。服务器端主要通过建立流连接来连接客户端,与客户端进行相互通信、转发信息。接收客户端的信息,接收信息后按照此客户端的要求将信息发送到相应的客户端,服务器端起到了中转的作用。服务器端主要方法如下:(1) 在主类的Start()函数中,用于初始化连接的信息为:ss = new ServerSocket(TCP_PORT);udpSocket = new DatagramSocket(UDP_PORT);ss 为服务器端Socket,为了保证连接的正确性和转发数据的高效性,因此定

30、义了两个端口变量:TCP_PORT和UDP_PORT,服务器端用TCP_PORT实现服务器套接字。服务器套接字等待请求通过网络传入。用UDP_PORT用来发送和接收数据报包的套接字。(2)在主类chessServer中,其用于接受客户端连接信息的函数start(),服务器端每接收一个客户端连接,就会为每个客户端在服务器端启动一个UDPThread线程,UDPThread类继承了Thread,它集成了服务器端的所有功能,包括与各客户端之间的相互通信,转发信息。2.2 客户端设计游戏客户端主要用于初始化玩家信息,定义玩家的操作状态,包括游戏客户端界面的结构组织,定义游戏控制按钮的实现,定义键盘事件的实现。主要方法:(1)方法launchFrame()用于在玩家客户端启动时,为用户发送连接服务器信息。(2)方法actionPerformed(ActionEvent e)用于实现玩家单击客户端下文的控制按钮的功能。在此方法中主要实现了玩家加入游戏、放弃游戏以及人机对战等各个按钮的功能。参数为触发事件的行为事件。2.3流

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1