C#五子棋设计.docx

上传人:b****5 文档编号:5045517 上传时间:2022-12-12 格式:DOCX 页数:27 大小:1,021.63KB
下载 相关 举报
C#五子棋设计.docx_第1页
第1页 / 共27页
C#五子棋设计.docx_第2页
第2页 / 共27页
C#五子棋设计.docx_第3页
第3页 / 共27页
C#五子棋设计.docx_第4页
第4页 / 共27页
C#五子棋设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

C#五子棋设计.docx

《C#五子棋设计.docx》由会员分享,可在线阅读,更多相关《C#五子棋设计.docx(27页珍藏版)》请在冰豆网上搜索。

C#五子棋设计.docx

C#五子棋设计

 

一、需求分析

1.项目背景

五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。

主要流行于华人和汉字文化圈的国家以及欧美一些地区。

规则为双方交替落子,直到有一方下出五子连续,五子连珠为赢。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

2.可行性分析

2.1技术可行性

技术上的可行性分析主要技术条件是否顺利完成开发工作,硬、软件是否满足开发者的需要等。

该系统的软件开发平台已成熟可行。

硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,棋硬件平台完全能满足此系统的需求。

而且网上有许多关于五子棋软件的设计的文献资料以及核心代码,同时组员兴趣浓烈,有信心完成该项目的开发工作,综上所述,本项目技术上可行。

2.2经济可行性

此项目所需用环境平台、技术、所需其他东西都是可以找到的,所以经济上可行。

并且本系统实施后可以让用户很好的对五子棋进行更加深入的研究,有助于开发用户智力。

2.3管理可行性 

主要是管理人员是否支持,现有的管理制度和方法是否科学,规章制度是否齐全,原始数据是否正确等。

规章制度和管理方法为系统的建设提供了制度保障。

2.4操作可行性

操作上是鼠标的使用,主要凭借在棋盘上点击方格或按钮进行游戏,方便简单。

使用前只要看明白游戏规则及其方法即可。

3.项目技术支撑

3.1开发环境

在VisualStudio2012集成开发环境下用C#语言及.NET架构编写软件;采用SQLServer实现棋局信息传输中的数据储存功能。

3.2理论支持

五子棋核心算法、C\S架构、多线程、socket机制。

3.3理论介绍

3.3.1C#简介

C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。

它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。

C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

[1] 

C#是面向对象的编程语言。

它使得程序员可以快速地编写各种基于MICROSOFT.NET平台的应用程序,MICROSOFT.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

3.3.2C\S架构

C/S结构,即大家熟知的客户机和服务器结构。

它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。

这也就是目前应用系统的发展方向。

C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。

对应的优点就是客户端响应速度快。

具体表现在以下两点:

(1)应用服务器运行数据负荷较轻。

一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

(2)数据的储存管理功能较为透明。

在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,并且通常把那些不同的(不管是已知还是未知的)前台应用所不能违反的规则,在服务器程序中集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。

所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。

3.3.3socket机制

Socket是面向客户/服务器模型设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。

Socket通常用来实现客户方和服务方的连接。

客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。

Socket通信机制提供了两种通讯方式:

有联接和无联接方式,分别面向不同的应用需求。

使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。

在该方式下,通信双方必须创建一个联接过程并建立一条通讯链路,以后的网络通信操作完全在这一对进程之间进行,通信完毕关闭此联接过程。

使用无联接方式时其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,不能保证信源所传输的数据一定能够到达信宿。

在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。

 

二、概要分析

1.基本设计概念

1.1总体处理流程

本软件采用面向对象的设计方案,通过把对弈接口组件化,来实现界面设计与算法设计的完全分离。

 

1.2结构

 

表1类模块列表

类标识符

类名

功能

TGobangForm

五子棋主程序窗体类

它是程序界面设计部分的实现,它主要负责界面的绘制,而真正的人机对弈操作委托GobangAI来完成。

TGobangAI

五子棋对弈接口类

它定义了完成人机对弈的操作接口,这样主窗体类可以通过这些操作接口来完成人机对弈的过程。

而实际这些操作的实现是通过桥接的方式委托搜索引擎SearchEngine来完成的。

TBestMove

最佳走法的线程类

它是通过委托TGobangAI实例中的SearchEngine对象的GetBestMove操作来找出当前电脑的最佳走法。

而它本身却是在TGobangAI中被实例化并被调用的。

TSearchEngine

搜索引擎类

在它当中定义了搜索算法所需要的数据结构和操作,而搜索算法中的核心操作是委托估值核心Evaluator来完成的。

TEvaluator

估值核心类

在它当中定义了估值核心所需要的数据结构和操作,并实现了估值核心。

 

表2各个类中的属性和操作列表

属性操作标识符

所属类

功能

Board

TGobangAI

返回指定位置落子状态,委托SearchEngine实现

Move

TGobangAI

返回所指定的步数的走法,委托SearchEngine实现

Score

TGobangAI

返回所指定步数的走法得分,委托SearchEngine实现

CurMove

TGobangAI

返回当前走法索引,委托SearchEngine实现

StoneColor

TGobangAI

设定或返回电脑的棋色

Level

TGobangAI

设定或返回电脑的棋力水平值

IsStart

TGobangAI

返回游戏是否开始

AddStone

TGobangAI

玩家下子,如果玩家未赢,则紧跟着电脑下子

GiveUp

TGobangAI

玩家认输

GoBack

TGobangAI

玩家悔棋,棋局退回到玩家下最后一颗子之前的状态

Start

TGobangAI

开始游戏,开局后,棋色和棋力属性将不能再改变

Stop

TGobangAI

结束游戏,游戏结束后,棋色和棋力属性可以改变

Board

TSearchEngine

返回或设定指定位置落子状态,委托Evaluator实现

Move

TSearchEngine

返回所指定的步数的走法

Score

TSearchEngine

返回所指定的步数的走法得分

CurMove

TSearchEngine

返回当前走法索引

Winner

TSearchEngine

返回获胜者

IsGameOver

TSearchEngine

返回游戏是否结束

GetBestMove

TSearchEngine

返回最佳走法

Board

TEvaluator

返回或设定指定位置落子状态

IsDraw

TEvaluator

返回是否平局

GetScore

TEvaluator

返回棋局估值

 

上面所列出的属性和操作仅为public的属性和操作,private的变量、属性和操作这里没有给出定义,它们将在接口设计和系统数据结构设计中进行讨论。

另外TGobangAI是一个组件类,其中定义了三个比较特殊的事件属性,通过这三个事件,可以使界面设计更加灵活方便,这三个事件的功能在下表中给出:

 

表3TGobangAI组件中的事件定义列表

事件

描述

OnGameStart

游戏开始事件

OnChange

游戏中棋盘状态改变所触发的事件

OnGameOver

游戏结束事件

1.3功能需求与程序的关系

TGobangForm

TGobangAI

TSearchEngine

TEvaluator

界面

界面算法接口

算法

1.4尚未解决的问题

因为博弈算法中搜索引擎的改进是影响整个游戏智能化程度的关键,但是搜索算法有很多,现在还不能确定哪种搜索算法更适合于本游戏,这些算法的测试将在详细设计和编码调试时再进行。

2.接口设计

2.1用户接口

用户的所有操作全部通过鼠标或者热键来完成。

开始游戏、悔棋、认输和结束游戏这些操作通过点击按钮、右键菜单或使用热键来完成。

棋色和水平选择通过点击单选框或右键菜单来完成。

游戏中棋子状态将直接反映在棋盘上,其他反馈信息(比如棋盘当前局面、走棋时间、棋谱等信息)将在单独的反馈信息栏中显示。

2.2外部接口

本程序与其他比赛程序通过裁判程序(有比赛裁判委员会给出)来进行相互通讯,棋盘上落子通过鼠标事件的触发来完成,裁判程序将模拟这一鼠标事件。

裁判程序对棋盘状态的获取将直接根据棋盘颜色变化来检测。

2.3内部接口

TGobangAI组件定义了界面和算法的接口,TGobangAI中聚合了TSearchEngine类的实例FSearchEngine,而TSearchEngine中聚合了TEvaluator的实例FEvaluator。

通过这种设计,提高了系统的松散耦合性。

3.流程图

3.1主模块图

界面及图形模块

 

3.2主流程图

服务器端与客户端流程图

 

3.3模块流程图

Step++Step值的奇偶来判断,初值为0

奇偶step++

 

否是是否

 

棋手下棋流程

//棋色类型

TStoneColor=(scBlack,//黑棋

scWhite);//白棋

//落子点状态类型

TPointState=(psBlack,//有黑棋

psWhite,//有白棋

psNone,//没有棋

psInvalid);//无效位置

 

AD/ENTER/SPACEW/S/ESC

 

有无

 

是否

 

电脑下棋流程

 

三、详细设计

1.基本操作

1.1界面以及落子处理

1.使用二维数组Chessboard[15,15]储存棋盘的状态,以0表示没有放子的位置,以1表示放黑子的位置,以2表示放白子的位置;

2.以鼠标的状态提示当前持子的一方;

3.将棋盘作为图片的形式贴处在程序界面上;

4.加载棋子资源(黑、白棋子),当鼠标在棋盘上点击的时候产生事件,处理鼠标的位置产生对应的棋盘坐标位置;

5.判断落子出是否可以落子:

不可以则不做任何处理,不改变鼠标的状态;可以落子,则打印对应的棋子图像,记录棋盘位置,并将位置传递给判定函数;

6.交换持子方,重复落子过程,直到判定函数产生胜出结果;

[2]程序流程

本程序由六个基本功能模块构成,各模块的详细分析如下:

(1)初始化:

首先,建立盘面数组board[21][21]、对战双方的棋型表Computer[21][21][4]和Player[21][21][4]并将它们清零以备使用

(2)主循环控制模块:

控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。

(3)玩家下子:

当轮到玩家下时,玩家通过鼠标在棋盘上落子,程序会根据该点的位置,在board[21][21]数组的相应地方记录。

(4)盘面分析填写棋型表:

本程序核心模块之一,人工智能算法的根本依据!

其具体实现方法如下:

玩家在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一些点位,如“活三”、“冲四”等;然后再在其中选择落子点。

但是,电脑不会像人一样分析问题,要让它知道哪是“活三”、哪是“冲四”,就得在棋盘上逐点计算,一步一步的教它。

先来分析己方的棋型,从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中心向左挨个查找,如果遇到己方的子则记录然后继续,如果遇到对方的子、空白点或边界就停止查找。

左边完成后再向右进行同样的操作;最后把左右两边的记录合并起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computer[x][y][n]中就行了(x、y代表坐标,n=0、1、2、3分别代表横、竖、左斜、右斜四个方向)。

而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方棋型表也就填写完毕了。

然后再用同样的方法填写电脑的棋型表。

电脑下子:

有了上面填写的两张棋型表,现在要作的就是让电脑知道在哪一点下子了。

遍历棋型表Computer[15][15][4]和Player[15][15][4]找出其中数值最大的一点,在该点下子即可。

1.2五子棋判胜

本功能模块主要对游戏的胜负进行判定.

1.由玩家输入棋子所在位置,由系统判定胜负,若胜,则游戏结束;否则,游戏继续.

2.对胜负判定需先确定一个中心棋子位置.

3.由一个中心棋子可以引出四条线形成五子连一线.

4.判定过程中注意越界现象.

概要设计

1.五子棋的判胜条件即为5个相同的棋子连在一条线上.

2.以一个棋子为中心,有4条线可以形成五子连线.如图所示:

(描红的为中心棋子)

3.中心棋子即为最后一步所下棋子.

4.以1线为例,从中心棋子出发(设为白子),先向左进行判断,若棋子为白子,则计数器加1(初始值为1),否则(为黑子或无子),则返回中心棋子,向右进行判断,进行相同操作.

5.1线判定结束后,若计数器为5,则判白子胜,否则,计数器归1,再从2,3,4线按顺序进行判定.

6.棋盘的每个坐标有3个状态,分别为无子(标记为0),白子(标记为1),黑子(标记为2),对棋盘点进行判断时,只需判定其所在状态即可。

7.若棋盘下满,仍未有五子连线,则判和。

流程图为:

1.3悔棋

开始以前按钮设置为禁止(F),只有在棋局的过程中,并且轮到该本方落子,并且棋盘有2个棋子或2个棋子以上时,“悔棋”按钮才被置于激活状态(T);一局比赛中只可以悔棋2次。

结构化说明:

IF本方下棋

IFcount棋子>=2

激活“悔棋”按钮

IF对方同意

count棋子=count棋子-2

ELSE返回

ELSE返回

ELSE返回

在游戏中,如果一方点击“悔棋”按钮,则向对方提出悔棋请求。

对方在收到“悔棋”请求后会弹出确认对话框,点击“是”接受“悔棋”请求,也可以点击“否”来拒绝。

如果点击接受按钮,则在双方棋盘上清除最新下的两个棋子,然后请双方继续进行下子操作。

流程图为:

1.4.人机对战算法

1.4.1知识准备 

极大极小树  

目前绝大部分的博弈类游戏中的人工算法都采用这种方法。

假设己方为MAX点,对方则为MIN点。

如果当层的节点为奇数时那么就为MAX层,同样节点为偶数时就为MIN层。

当在MAX层时,该层的值就应该为下一个MIN层中的最大一个的值。

当在MIN层是,该层的值就应该为它子层MAX的最小的一个。

 深度优先搜索  

在图论中有两个很重要的遍历的方法,一个是深度优先搜索(DFS),另外一个是广度优先搜索(BFS).这两个方法的主要区别在于下一个节点的选择。

DFS首先选择它的连接节点,若它的下个节点已经全部被遍历过或者不存在的话。

则向上返回到上一个节点,在遍其他的未被访问过的点。

很容易想到这要用到堆栈结构,使用一个递归来实现。

而BFS则是逐个的遍历它的联接接点,将已经访问过的点放入队列中。

然后再依次取出继续这个过程。

剪枝方法  

当预测的深度达到3的时候,最坏情况下225*225*225=11390625个,这在目前的一些常规平均的机器性能下也需要40多秒的时间,这是不能够容忍的。

那么是否有很好的改进技术,去除那些不必要的节点,并且在剪去了这些点后不影响结果呢?

答案是肯定的,这种方法就是Alpha---Beta剪枝。

1.4.2算法的设计思路  

本设计所使用的人工智能算法主要分为四步:

  

第一步:

考虑到系统的运行效率,根据平常下棋的经验,第一步子不需要经过复杂的分析计算。

如果人类玩家下的第一步子是落在棋盘边界上时,则电脑的第一步子将落在棋盘的正中央;否则,电脑的第一步子将在紧挨着人类玩家第一步子的左边位置落下。

  

第二步:

为了缩短系统搜索分析时间,防止电脑每下一步棋都要将整个棋盘上所有的空白点都分析一次,本设计将设计一个函数计算搜索范围。

然后根据搜索范围进行第一次搜索分析,排除不在搜索范围之内的空白点、不可能连成五子即不可能胜利的点以及活1,半活2点。

搜索游戏双方有没有哪方即将胜利,即双方有没有成五或者可不可以制造出活4。

  

第三步:

对第一次分析的结果进行再次分析。

找出双方可以制造出活4的点的位置,如果没有的话,就分别整理出双方可以制造出活3的点的位置,半活4的点的位置,双活3的点的位置,半活3的点的位置,双活2的点的位置,活2的点的位置。

  

第四步:

由前两次的搜索分析得出双方都不可能制造活4,所以只能找活3,再没有的话就找半活4,在没有的话就找单活3,双活2等棋型。

1.4.3算法流程

遍历整个棋盘,找出所有空白点,在每个空白点判断与该点相邻的4个方向上各方连续的棋子数,在每一个方向上,判断白子和黑子的连续的个数,判断活3,冲4等各种棋形状况,为各种状况赋权值。

然后将该方向上的权值返回,将每个空白点的各个方向的权值相加,为该点权值。

令设计一个数组,储存每个空白点权值,然后在遍历整个棋盘空白点,计算出每个空格点,找出权值最大点,也就是当前情况下,电脑最应该落子的点。

返回权值最大的点的坐标

确定棋盘为二维数组,先写一个machine函数,用双重for(i,j)语句,遍历整个棋盘,找出所有空白点,即bkmap[i][j]=0.写4个函数分别判断上,右上,右下,右,4个方向上连续的黑子数,连续的白子数。

在每个方向上用counter1记录白子数。

用counter2记录黑子数,如果白色有是那个连续(counter1=3),加权20;如果黑色有三个连续(counter2=3),加权10;如果白色有4个相连(counter1=4),加权100;如果黑色有4个相连(counter2=4),加权70.另外设置一个side变量,用来记录棋子两边的阻碍数,判断黑子两边是否有白子或已到边界。

然后记录(counter1+counter2)*5-side为该点在该方向上的权值,返回该权值到machine中

定义一个三位数组computer[i][j][4],其中i,j为空白点坐标,4代表4个方向,将每个方向上的返回值分别赋给computer[i][j][0]computer[i][j][1]computer[i][j][2]computer[i][j][3],即该点4个方向权值均确定

然后再遍历整个棋盘空白点,计算出每个空格点4个方向上权值的总和,做比较,放回权值最大的点的坐标(这里用全局变量dx,dy表示)即通过比较,不断修改全局变量的值,最后所得的dx,dy点就是计算机落子点。

 

流程图为:

 

 

2.系统链接

2.1服务器的设计

网络五子棋是采用网络协议为TCP/IP的网上对弈游戏,运用“客户端-服务器“(c/s)网络架构模式。

服务器可以创建任意多局游戏。

  

通过使用多线程和网络套接字SOCKET来实现游戏之间的通讯,它是基于点对点的通讯。

开始让服务器初始化建立服务器套接字SOCKET,基于某个端口PORT,服务器始终处于监听状态。

客户端是动作的发起者,何时发出申请由客户端决定。

客户端向服务器发出申请,服务器给予响应。

打开客户端套接字SOCKET,连接到服务器端的地址ADDRESS连接建立后,创建一个SOCKET实例,并开始一个线程,监听该客户端请求。

服务器继续监听其它用户的连接。

服务器通过数据输入流从客户端接收信息,并且通过数据输出流把相应的信息发送给客户端。

客户端发送请求和响应接收到的各种信息。

  

TCP/IP协议的作用在于网络互联,但其本身就是物理网上的一组完整的网络协议集。

TCP在传输层上提供服务,IP在互联网层上提供服务。

这两个主要协议提供的服务,加上高层的服务,共同实现了TCP/IP协议集的功能。

 

Socket是一种应用程序的编程接口,它通过一组管套函数使应用程序在本地系统和远程系统之间建立通信信道,实现连接的管理和数据的传输。

它为网络上进程之间的通信提供了一种透明的方法,并支持包括TCP/IP在内的多种网络通信协议。

服务器端主要通过建立流连接来连接客户端,与客户端进行相互通信、转发信息。

接收客户端的信息,接收信息后按照此客户端的要求将信息发送到相应的客户端,服务器端起到了中转的作用。

服务器端主要方法如下:

(1)在主类的Start()函数中,用于初始化连接的信息为:

ss=newServerSocket(TCP_PORT);

udpSocket=newDatagramSocket(UDP_PORT);

ss为服务器端Socket,为了保证连接的正确性和转发数据的高效性,因此定义了两个端口变量:

TCP_PORT和UDP_PORT,服务器端用TCP_PORT实现服务器套接字。

服务器套接字等待请求通过网络传入。

用UDP_PORT用来发送和接收数据报包的套接字。

(2)在主类chessServer中,其用于接受客户端连接信息的函数start(),服务器端每接收一个客户端连接,就会为每个客户端在服务器端启动一个UDPThread线程,UDPThread类继承了Thread,它集成了服务器端的所有功能,包括与各客户端之间的相互通信,转发信息。

2.2客户端设计

游戏客户端主要用于初始化玩家信息,定义玩家的操作状态,包括游戏客户端界面的结构组织,定义游戏控制按钮的实现,定义键盘事件的实现。

主要方法:

(1)方法launchFrame()用于在玩家客户端启动时,为用户发送连接服务器信息。

(2)方法actionPerformed(ActionEvente)用于实现玩家单击客户端下文的控制按钮的功能。

在此方法中主要实现了玩家加入游戏、放弃游戏以及人机对战等各个按钮的功能。

参数为触发事件的行为事件。

2.3流

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 可爱清新

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

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