荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店