五子棋算法设计

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

流星载月I have a dream,a

beatiful dream that one day i can fly !!

首页

日志

相册

音乐

收藏

博友

关于我

日志

fly_just

永远不相信努力创造不了奇迹!

加博友关注他

最新日志

http包截获并还原HTML与数据

中华民族的好总理-周恩来

中华民族的好总理-朱镕基

网络共享拨号软件粗设计

五子棋算法设计初探

First ,Last 集构造

首页推荐

日本人喜欢用饺子配米饭

劈腿女如何玩转俩'老公'

台湾新片靠全裸女博出位

石油双雄逼民营油企停产

女星走红毯全靠透视装?

灵肉交织的智力舞蹈(图)

更多>>

First ,Last 集构造

网络共享拨号软件粗设计五子棋算法设计初探

2008-11-08 21:12:38| 分类:默认分类|字号目录:

标题

一、设计概要

1、图形界面设计

2、算法设计概要

二、具体算法实现

1.计算放棋的相对物理坐标

2.给着棋点周围加权

3.计算棋局上成棋个数

4.给特殊棋格附于特别权

5.计算最大权值、最小权值

6.根据最大、最小权值决定策略

7.输赢的判断

三、变量、数据结构与函数

1.自定义的变量和消息

2.类成员变量

3.数据结构

4.全局函数

5.类主要成员函数

三、人机对战流程图

主题内容:

、图形界面设计

棋盘方格以背景图片的方式贴于对方框之上,其中的图片来自网络图片中剪切下来的一部分,格局大小非标准的国际五子棋大小,只是为了研究五子棋算法而作的一个模拟棋盘。棋盘大小为16*14,即横方向上16格,坚直方向上14格。棋子仍MFC自带绘图ICON工具所绘制,大小31*31像素,分为黑白两种棋子。棋局可以自动保存于数据链表中,可自动重绘。见图(1).

图(1)

、算法设计概要

⑴关于落子点的计算

在棋局上下棋时,不能以鼠标的点击位置为着棋点,所以必须找一个合适的或者用户最想要着棋的位置着棋。所以关于着棋点的位置要经过特定的计算才能着棋。我们棋盘的十字交叉点的间距横对都为35个像素,方格直经为53个像素,而起始坐标经计算为(33,37)像素处。我们是这样计算的:坐棋盘的起始坐标(33,37)开始每隔35个像素间距后,通过与鼠标点击点的坐标求径直距离后,再与方格直径53的一半26.5作比较,如果两点的距离小于或等于26.5,那么该点极有可能是客户最想要的着棋点,扫描棋盘直到找到一个这样的点为止,除非用户点击的不在棋盘区域或已经着棋了的点,否着应该找到这样的一点。

⑵关于着棋后的输赢判断

在判断输赢时,用到的一个巧妙的方法。从所周知,无论谁下棋赢了以后总会成五子连线,而成五子连线时,第五颗棋总是会着落在棋盘上,所以我们在判断是否有五子连线时,并不是全盘扫描,而是在每着落一子后就扫描该棋子左右、上下、以及斜着的四个方向。如果扫描出来了那个方向上的棋子首先到达五子,就返回给上级调用,由上级调用者作出相应判断。如果是其它子,如果某个方向上成了六子或六子以上时,不能算作它赢得了

棋,而必是五子才能赢得了棋。如果是五子以下的棋子时,将要根局相应棋子成子情况,作出相应反应,如加权、减权等操作。

⑶关于加权搜索算法的实现

该五子棋用到的算法命名为加权搜索算法。我们将棋盘分解为了两个子棋盘,它们分别是一个16*14大小的二维数组。一个棋盘负现保存当前着棋点位置,比如1表示黑棋着了该棋格,2表示白棋着了该棋格,另一个棋盘负责记录下来每个棋格的权值。权值有正负两种,其中正权值表示进攻分,而负权值表示防守分。算法是这样设计的:每个棋子都有它的势力范围(想法来自于围棋),最大势力范围为5(加上自已的一格),影响到周围八个方向。在此,我们将这个势力范围定义为深度,用它来设置电脑当前等级。当某一个棋子着棋后,便会对它势力范围内的所有棋格权值分有所影响,靠得越近的自然影响越大,越远的影响等级呈递减速趋势。在每着一棋后判断棋子输赢的同时,会记录下来当前棋子与其周围棋子的成棋个数,根据成棋的个数及棋局形势再设置各个棋格权值,通常会加上或减去N个Callful值(Callfull =100 ,N>=1),如果是电脑形成成棋个数,则加上N个Callful,如果是玩家,则减去N个Callfull,N由以下几种情况决定:

注:要加权的格用*表示

①成四子时:电脑N=4,玩家N=3

独立四子即:*●●●●*

成被阻四子即:_*●●●●○或○●●●●*_

②成三子时,电脑N=3,玩家N=2

独立三子即:_*●●●*_

加上中空后成四子即:_*●●●*●

加上中空后被阻即:_*●●●*○(会减少一个Callfull权)

③成被阻三子,N=2

左被阻三子:○●●●*__

右被阻三子:_*●●●○

加上中空即后续一子成五子:○●●●*●_或_●*●●●○(再加一Callful权)加上中空即后续二子成六子:○●●●*●●或●●*●●●○(恢复原权值)

④成两子,N=1

成独立两子:_*●●*_

加上中空后成六子:_●●*●●● (恢复原权值)

加上中空后成五子:_●●*●●_或_●●*●●○(再加一Callful权)

⑤成孤立一子:

加上中空与其后续子成五子:_●*●●●_或_●*●●●○

(加上3倍Callful权)加上中空与其后续子成独立四子:_●*●●?_(加上1倍Callful权)加上中空与其后续子时成被阻四子:_●*●●○(恢复原权值)

⑥一般情况下任何子的处理:

黑子时:n=1,白子时:n=-1;

相关文档
最新文档