荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Version (Who makes history and why), 信区: Program
标  题: 求教五子棋算法                         yxm (转寄)[转载]
发信站: 荔园晨风BBS站 (Sat Mar 15 17:47:20 2003), 站内信件

【 以下文字转载自 Version 的信箱 】
【 原文由 pcAngel(风过留枫) 所发表 】
发信人: Socrates (Apocalypse), 信区: Programming
标  题: Re: 求教五子棋算法
发信站: BBS 水木清华站 (Sun May 14 21:33:04 2000)

 看936 文章,下面是这个程序的 readme
                          五子棋程序简介
一.程序概述:
    此程序系游戏类,供广大五子棋初学者及业余爱好者休闲娱乐之用。
它最大的特点是: 算法简洁精练,反应迅速,判断准确,并具有悔棋,
提示等功能,可以陪你过足棋瘾。
    源程序用Turbo C 2.0编写,包括以下六个文件:
        WZQ.H              包括程序中所需的头文件及宏定义
        WZQ.C              全局变量定义及主函数main
        WZQCLIB.C          用来显示小字库中的汉字
        WZQINI.C           显示菜单及静态界面设计
        WZQDRAW.C          程序运行过程中简单图形处理
        WZQCALCU.C         算法
        WZQWIN.C           胜负判断及显示
   编译后可执行文件名为WZQ.EXE。程序运行还需自建小字库WZQHZK及
文件EGAVGA.BGI在当前目录下,显卡至少是VGA。
二.游戏规则:
    在15 x 15的棋盘上,黑白两方轮流翌子(计算机执黑),
谁先在横,竖,或斜方向的连续五个位置上连成五子,谁就胜利。
三.使用说明:
 *****菜单: 1.游戏形式分为练习和比赛两种,
                练习过程中可以悔棋,及参考提示,不显示比分;
                比赛则不允许悔棋,显示你的成绩。
            2.对手级别包括初级、中级、高级三种。
            3.开局方式共五种:
                先手A: 棋盘上无子,白下第一手。
                后手A: 棋盘上有一黑子,白下第二手。
                先手B: 棋盘上有黑白各一子,白下第三手。
                后手B: 棋盘上有两黑子一白子,白下第四手。
                随机: 以上任一种。
            4.总局数可以是1~9中的任意一种,缺省值为3。
              菜单选定后按回车键,游戏开始。按Esc键退出。
 *****下子:当棋盘上出现一个蓝色方框时,你便可以用方向键移动它,
            移到你准备下子的地方后按Enter键(或空格键),即可。
 *****悔棋:若发现某一步下错了,要纠正,可按u键。
            每次只能悔一步,且同一手棋不得悔两次。
 *****提示:初学者若不知道该在何处下子可按h键,
            棋盘上的蓝色方框将会给你提示,以供参考。
 *****认输:按b键即可实现,再按任意键进入下一局。
 *****其他:1 按Ctrl+ u 可悔多步棋。
            2 若想在黑棋活三或冲四时给予提醒,可按r键切换。
            3 在游戏过程中按Esc键,或游戏结束后将返回主菜单。
四.关于算法:
    用二维数组a表示棋盘上每个位置的情况。0表示没有棋子;7表示有黑子;
8 表示有白子。当轮到黑方(计算机)下时,对整个棋盘四个方向进行扫描
(即:横,竖,斜,反斜)。以横向为例,依次取连续的五个位置,如果它们
的a值累加(total)为零,表示没有棋子;若是7的倍数,表示只有黑子;若
是8的倍数,表示只有白子。若检测到这五个位置上没有白子,说明黑方在此
处成五子的可能性不为零,应在其中无子的位置处赋上一定的进攻值(用二维
数组attack来描述),进攻值的大小由测得黑子的多少来决定。表达式的最简
形式为:
          attack=attack+(total/7) ^ e   (1)
         (其中e为参数,值定在2左右)。
在源程序中,attack=attack+((total/7)+cb+s*(2-|k-2|)/10)^e  (1')
         (其中k=0,1,2,3,4,反映赋值点位置,2表示中央位置。
           当s>0时,位置越靠近中央,赋值越高。s反映位置对赋值的
           影响程度。cb可调节底数的大小。)
例如在某五个连续位置测得三个白子,无黑子(total=21),则在其余两位置
赋进攻值为3^3=27(设t=3)。在多次扫描过程中,每位置的赋值采取累加的方
式。最终,在棋盘上每个无子的地方都有一个进攻值和一个防御值(defend),
最后将两值合成得综合值 (judge)来判断该在何处下子。合成方式为:
            judge = attack ^ xb + defend ^ xw   (2)
            (其中x , y为参数,一般有xb = xw = 2)
     为了避免棋局的单一性,不小于最大综合值%95的点位都可能被选中。
     不同级别的算法类似,但参数有所不同:
初级:不考虑位置因素
中级:考虑位置因素,但进攻与防御参数一致。
高级:考虑位置因素,并根据进攻与防御的特点,赋予不同的参数。
(最佳参数值未知,将在程序不断调试中摸索)
     到此为止的算法还很粗糙,经常会出现一些BUG。因此,在测出最佳点
位后,结合五子棋的一般常识,又进行了以下补充和修正:
1, 假定在最佳点位处下子,检测白棋是否有活三,若有并且黑棋在原位下子
后不能行成冲四,则说明黑棋必输,重新计算最佳点,直至检测不到白棋有活
三或黑棋能形成冲四(最多重算十次,否则有可能出现死循环)。
2, 检测黑棋是否有活三,若有则黑冲活四。
3, 检测白棋是否有四,若有则堵之。
4, 检测黑棋是否有四,若有则成五。
( 注:以上四步骤顺序不得颠倒)
此算法还有待于参数的改进和更多的补充修正,但最大的遗憾是不能算多步棋。
五.作者:
     邢曦,中国科学技术大学化学物理系97级(二年级)本科生,
     联系地址:科大229-109
     联系电话:0551-3602381

【 在 toybox (望雨) 的大作中提到: 】
: 因为做数据结构大作业,自己写了一个,但棋力太差,不知各位高手有没有什么好介绍.
: thx


--
※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.27.12]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.50]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店