首页 > 范文大全 > 正文

五子棋对战平台的设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇五子棋对战平台的设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:该文设计和实现了一个五子棋对战平台。五子棋源于中国,发展于日本,在其它地区,如欧洲和前苏联,也广受欢迎。五子棋容易上手,老少皆宜,它能增强思维能力,提高智力,而且随时随地都可以进行游戏。该系统的设计遵循世界五子棋联赛的通用协议,可以方便地导入算法引擎,不仅可以实现双人对弈,也可以实现人机对弈、计算机对弈、网络对弈。

关键词:五子棋;人机对弈;算法引擎

中图分类号:TP391文献标识码:A文章编号:1009-3044(2012)22-5409-03

Design and Implementation of a Gobang Playing Platform

ZHANG Jia-jia

(Beijing Language and Culture University, Beijing 100083,China)

Abstract: This Paper designed and implemented a gobang computer game platform. gobang originated in China and developed in Japan, and is also popular in the former soviet and several European countries. It not only can enhance one’s thinking capability, but its adaptability allowed it played virtually everywhere by virtually everyone. The system’s design complies with the general protocol of World’s Gobang Cup, making it easy to import 3rd-party engines. Through this platform,human-human,human-computer,computer-computer play are supported,face to face or through network.

Key words: gobang; man-machine playing; algorithm engine

五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。该文在Windows7操作系统中使用VC2005设计和实现了一个五子棋对战平台。系统的设计遵循世界五子棋联赛的通用协议,可以方便地导入算法引擎,不仅可以实现双人对弈,也可以实现人机对弈、计算机对弈、网络对弈。

1系统设计

1.1总体流程

本系统有着良好的用户体能,根据人们下棋的习惯,设计出五子棋程序的总体流程。程序开始后,首先选择模式(两人对战、人机对战、机器博弈、网络对战),然后根据模式设置其它选项。如人机对战需设置算法引擎以及约定哪方先下;机器博弈需设定对弈双方所使用的算法引擎;网络对弈如使用算法引擎,需事先设定,并由一方通过socket主动连接另一方,收到对方“同意”的答复后,方可进行对弈。

1.2关键算法

1.2.1五子棋规则介绍

五子棋是双方之间进行的竞技活动,专用棋盘为15*15,五连子的方向为横、竖、斜;任一方在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜;在棋盘上以对局双方均不可能形成五连为和棋。黑白双方一次落子,由黑先下,由于先下一方在局面上占优,五子棋规则分为禁手和无禁手两种。

禁手规则:禁手是针对先行的黑棋而言,以限制黑棋的先行优势为目的。对局中如果黑棋违反禁手规则将被判负。以中国五子棋竞赛规则为例,有三三禁手(黑棋一子落下时同时形成两个或两个以上的活三,此子必须为两个活三共同的构成子)、四四禁手(黑棋一子落下同时形成两个以上的冲四或活四)、长连禁手(黑棋一子落下形成一个或一个以上的长连)。

无禁手指不对黑棋的先行优势做任何限制。

1.2.2电脑下棋流程

电脑下棋和人脑下棋在原理上是一致的。一方面,他在轮询等待棋局信息,如对方下子、悔棋、对方认输、结束比赛等,类似于等待裁判指令;同时,它在不断地思考,计算下一步的最佳策略。因此,对这两个同时进行的任务需要有两个线程,并需要内核对象来协调线程同步及互斥。如图1所示。

游戏开始时,事件1初始无信号,事件2初始有信号,思考进程无限等待事件1的状态。当对战平台发出开始游戏、重新游戏或者对方已下子的指令时,置思考状态为0,把事件1置为有信号,把事件2置为无信号。思考线程轮询到事件1为有信号状态,开始思考,思考结束后再把事件2置为有信号;当对战平台发出结束游戏,重新开始等指令时,置思考状态为1,无限等待事件2,也即等待思考线程完成思考。

线程同步核心函数的原型:

DWORD WINAPI

WaitForSingleObject(

HANDLE hHandle,

DWORD dwMilliseconds

);

CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset,

BOOL bInitialState,

LPCSTR lpName

);

bManualReset:

图1电脑下棋流程

指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。

bInitialState:

指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。

1.2.3博弈算法

计算机博弈模仿人类下棋,传统的算法是采用博弈树。两人对弈,A有很多落子选择,B也有很多对应下法,如果把所有的走法列出来,就构成了一颗树,即为搜索树,也称博弈树。树的根节点为先手的第一步走法,下面的走法构成了树的子节点,直至棋局结束。五子棋的标准棋盘是15×15,但搜索空间也是一个巨大的数字。博弈算法的任务是从这些以几何级数上升的子节点中寻找一个最有的节点,从而赢得游戏。整个算法分为搜索和估值,估值也即对所有可能落子位置进行一个评价,选择评价最高的位置作为最终落子位置。常见的算有Alpha-Beta剪枝算法、着法排序、空着裁剪、哈希表置换等算法。由于本系统的重点在于设计对战平台,博弈算法设计较为简单但足以代表人工博弈的思想。

本系统的估值函数分为单点估值函数和全局估值函数。单点估值函数的基本思想是对最当前的静态局面进行评估,遍历棋盘,对棋盘上的每一个非空位置进行四个方向的分析(水平、垂直、左对角以及右对角),统计每种棋型的数量(五连、活四、冲四、活三、眠三、活二、眠二),对不同的棋型进行不同的权重,最后还有个位置分数的加权(既要考虑空点对于己方的价值,也要考虑到对于对方的价值),这样就获得了棋盘上空点的估值。单点估值函数只能估算单个空白位置的价值,但全局估值函数可以估算所有的空白位置的总价值,进而评估整个棋局。对于当前棋局,将所有空白位置对下棋方的有利和不利程度总和相关即可得出全局估价值。

1.2.4悔棋流程

悔棋是棋类游戏里必不可少的功能。在对弈中,如果对方悔棋,对战平台会发出“undo”命令,此时应取消定时器,如果引擎正在读取指令,则通知其停止,并暂停思考。接下来进行“undo”操作。如果已下总步数小于2,则直接退出,因为总共只下了一步棋,无需悔棋。否则,先加亮显示最后一步棋,移除并重画屏幕。然后,更新相关数据结构,如将保存双方下子的链表尾部结点摘除,更新双方的超时时间等。

1.3关键数据结构

棋类游戏最核心的数据结构是棋盘,棋盘表示的高效与否决定了棋类游戏的性能。棋盘数据结构的设计应该根据棋的种类以及系统的设计目标而定。下面考察棋盘的几种常见数据结构表示。

1.3.1二维数组

无论是五子棋、象棋或是围棋,棋盘都是规则的长方形,任何一个位置都可以用横纵坐标来唯一确定。因此,用二维数组表示棋盘结构,非常直观。而且由于数组是直接存取的,这种表示方式存取比较高效。数组表示非常适合用于五子棋、围棋等这类不区分棋子种类的棋类游戏。其特点是局面表现能力强,便于评价局面的好坏。但是对于象棋、国际象棋等有棋子类别区分的游戏,特定棋子的信息十分重要,如帅和后。每次都要扫描整个棋盘才能获得特定棋子,比较耗时。

1.3.2链表

数组表示有一个很大的缺点是单个数组元素保存的信息太少,而且难以表现出二维棋盘每个棋盘位置与前后左右之间的关联。这样在系统进行一些比较复杂的操作,如悔棋,十分低效。因为悔棋需要知道上一步的下子位置。链表可以很好地解决这些问题。链表可以依据用户下子的顺序来链接,这样悔棋操作只需要摘掉链表尾部的结点就可以了。链表结点除了包含此位置的横纵坐标值,还可以包含其它信息,如该位置的棋子是我方还是对方的。

1.3.3位棋盘

位棋盘不同使用一个64位整形数来表示棋盘,适用于8*8的棋类游戏,如国际象棋和五子棋、围棋等。一个使用围棋盘的程序通常有一组位棋盘,这些位棋盘记录棋盘的不同信息。位棋盘的变化由位运算获得。由于位操作的特性,位棋盘的运算速度很快。和数组表示一样,一个位棋盘无法表示附加信息,每个位只有两个状态,0或1。使用位棋盘,要么有多个位棋盘,要么结合其他数据结构一起使用。

结合以上分析以及五子棋的特点,该文使用折中方案,除了评价局面的函数使用位棋盘以外,其它地方均使用链表表示棋盘。在链表更新的时候,相应地更新位棋盘。

struct Tsquare

{

Tsymbol z;//0=nothing, 1=player1, 2=player2, 3=outside

Psquare nxt,pre;//linked list for undo, redo

int x,y;//coordinates <1..width, 1..height>

int time;//total thinking time

Psquare winLineStart;//0 or beginning of a winning line

int winLineDir; //direction offset of a winning line

};

int bitboard[16];//standard board--15*15

2结束语

对于棋类玩家来说,残局和棋谱的保存有重要的意义。而电脑对战平台记录残局和棋谱非常方便,只需将对战状态保存下来,需要读残局和棋谱的时候再导入即可。本系统的数据结构可以很方便地支持残局和棋谱保存,这是改进的第一个方向。另外,支持网络对战是改进的另外一个方向。

人机对弈系统,核心部分是棋盘表示、走法规则(五子棋中走法规则简单,空子即可走)、搜索算法、估值函数。该文设计和实现了一个基本的五子棋对战平台,介绍了主要算法和数据结构,实现了系统的基本框架,对棋类博弈系统的设计提供一个参考。另外,五子棋国际比赛规则较复杂,通过禁手来限制黑棋的先行优势,为了便于说明,本系统没有加以考虑。

参考文献:

[1]王晓春. PC游戏编程:人机博弈[M].重庆:重庆大学出版社,2002.

[2]姜勇.五子棋人机对战系统设计[D].北京:电子科技大学,2010.

[3]陆汝铃.人工智能[M].北京:科学出版社,1995.

[4]朱全民,陈松乔.五子棋算法的研究与思考[J].计算技术与自动化,2006,25(2):72-74.

[5]石柱,何新贵.优序法在软件评价中的应用[J].计算机工程与设计,2002,23(2):45-46.

[6] Allis L V.Searching for solutions in games and artificial intelligence[D].University of Limburg,Maastricht,The Netherlands,1994.