资源简介
六子冲棋(博弈程序设计教程)
www.leilei.name
原创
源代码
代码片段和文件信息
/*************************************************************
* = 民间六子棋(六子冲)人机博弈引擎实现与教程 =
*
* www.leilei.name
*
* by LeiLei 2010.3.2 - 2010.3.5
*
*
* 本教程主要讲解六子冲棋的博弈引擎实现,不讲解界面实现部分。
* 本教程共分四节讲解:
*
* 第一节:局面表示 -- 构成可下棋的基本元素
* 第二节:走法生成 -- 实现下棋的规则
* 第三节:局面评估 -- 量化一个局面的双方优劣势
* 第四节:局面搜索 -- 让电脑具备思考的能力
*
* 本教程主要以便于理解为目标,不追求代码技巧,希望对写代码实践
* 较少的你,会有所帮助。
*/
/*************************************************************
* = 附:六子冲介绍 =
*
* 六子冲是流传于中国民间的一类棋类游戏。由于这个游戏对环境的
* 要求不高孩子们大都是在光滑的地面或石板上画上方格,以石子或木
* 棍、草节等为棋子,并有简单的比赛规则:
*
* 纵横各四条直线组成一个正方形棋盘,直线相交的地方为落子点。
* 开局时放子处为上下左右边线上的落子点,且不同方的子不可交叉放置。
* 游戏双方着二色棋子各6个在一 个“九宫”型棋盘上进行对抗因为游戏双
* 方各着6个棋子,故名“六子冲”。 棋子只能停留在棋盘上的落子点,棋
* 子只能在线上移动,棋子只能移动一步(即相邻落子点),每回合只能移
* 动1个棋子。消灭对方棋子的方法只有一条,也很简单。那就是:二子打
* 一子。即在棋盘上攻击方的2个棋子(2子必须相连并主动移动其中的1个)
* 与被攻方的1个棋子皆处在一条直线上并相邻时,被攻方的这个棋子就被
* 消灭。重复上面的步骤,保护自己的棋子并消灭对方的棋子,直到最后
* 胜利。
*
* 开始:双方棋子数均为六颗,分列棋盘四周,见图片“六子冲开始时”。
*
* 吃子:行棋一方若将两颗棋子移至一排,且一头挨着对方的一颗棋时,
* 则可吃子,见图片“吃子”。
*
* 注意:
* 1.行棋一方若将三颗棋子移至一排,不可吃子,见图1。
* 2.行棋一方若将两颗棋子移至一排,但一头挨着对方的两颗棋,不可
* 子吃,见图2。
* 3.行棋一方若将两颗棋子移至一排,但两头分别挨着对方的一颗棋,
* 不可吃子,见图3。
* 4.行棋一方若将两颗棋子移至一排,且一头挨着对方的一颗棋时,但
* 对方的该颗棋后有我方棋,不可吃子见图4。
*
* 流传:
* 有好多民间代代相承的传统儿戏,在六七十年代仍十分盛行,80年
* 代后逐渐衰落。80年代以后,由于社会生活和居住环境的变化,孩子们
* 聚在一起玩耍的机会较少,又有新兴的各类现代化的高档玩具流行,这
* 样的游戏则逐渐鲜为人知了。
* 六子冲就是其中最有代表性的一项游戏.也是当年的小孩子因陋就
* 简玩的一种棋类游戏。据传,六子冲游戏源自中国古代战争的士兵阵
* 型训练,后逐渐演变为一种棋类游戏。六子冲规则简单,上手容易,但
* 变化无穷,是一种让人玩起来就欲罢不能的智力对抗游戏。六子冲游戏
* 在上世纪主要流行于中国四川一带。
* 在中国山区农村流传甚广,,由于规则简单,工具可信手拈来,是
* 我国乡间常见的棋类游戏。在商洛镇安,涪城等地农村流行。
* 顾问:姜年檑
* (以上文字摘自百度百科,参见原文请访问:
* http://baike.baidu.com/view/2472074.htm)
*
*/
#include
/*************************************************************
* = 第一节 局面表示 =
*
* 1.1 棋子表示
*
* 棋子可以随便用个数字表示,可以把它定义为常量,
* 但是有时候为了方便运算和转换,也应该精心挑选用哪些数字表示棋子。
* 这里演示就随便选两个数字。
*
* (1)需要定义用来表示棋子的常量
*
* 如下所示:
*/
#define STONE 3 //定义常量 石头(白色棋子)
#define LEAF 7 // 树叶(黑色棋子)
#define WHITE 0 // 白方用0表示
#define BLACK 1 // 黑方用1表示
#define NOPIECE 0 // 无棋子用0
/*
* 1.2 棋盘表示
*
* 我们可以用数组来表示棋盘
* 用4*4的二维数组就可以表示这个游戏的棋盘结构和棋子在棋盘上的分布了。如下(简单吧):
* int board[4][4] = { // 对应坐标:
* 3 3 3 3 // (00) (10) (20) (30)
* 3 0 0 3 // (01) (11) (21) (31)
* 7 0 0 7 // (02) (12) (22) (32)
* 7 7 7 7 // (03) (13) (23) (33)
* };
*
* 数组下标构成的坐标表示棋子在棋盘上的位置。
* 可以用0表示棋盘上无棋子。
* 我们可以用4*4的数组表示棋盘,但是为了运算方便,这里我们采用8*8的一维数组来装棋盘,效果更好。
* 我们可以把棋盘放在数组的中央。
* 然后我们用一个8*8的inBoard数组来标识棋盘在数组中的位置。
* 棋子在棋盘上的位置,我们直接用数组下标表示。
*
* 所以,
* (1)我们需要一个用来表示棋盘的数组
* (2)我们用一个数组来标识棋盘在数组中的位置(用来判断棋子是否在棋盘上)
* (3)写几个函数来转换坐标。
*
* 如下所示:
*/
//棋盘数组(带开局棋子位置)
int board[64] = {
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 7 7 7 7 0 0
0 0 7 0 0 7 0 0
0 0 3 0
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5989 2010-03-02 17:43 六子冲开始时.jpg
文件 30868 2010-03-05 22:40 oldSix.c
文件 12800 2010-03-05 21:42 oldSix.exe
文件 3845 2010-03-02 17:55 1.jpg
文件 3941 2010-03-02 17:55 2.jpg
文件 3651 2010-03-02 17:55 3.jpg
文件 3958 2010-03-02 17:56 4.jpg
文件 3567 2010-03-02 17:44 吃子.jpg
文件 1859 2010-03-02 17:54 六子冲.txt
----------- --------- ---------- ----- ----
70478 9
- 上一篇:FLASH AS 简易涂鸦板带本地保存功能与撤消上一步功能
- 下一篇:万能钥匙QWE
评论
共有 条评论