1.系统框如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
2.vb6 五子棋
系统框如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
一、博弈博弈实验题目五子棋游戏。游戏源码游戏源码
二、大全问题分析
五子棋是博弈博弈双人博弈棋类益智游戏,由围棋演变而来,游戏源码游戏源码属纯策略型。大全股票比价源码棋盘通常*,博弈博弈即行,游戏源码游戏源码列,大全共个交叉点,博弈博弈即棋子落点;棋子由黑白两色组成,游戏源码游戏源码黑棋颗,大全白棋颗。博弈博弈游戏规则为黑先白后,游戏源码游戏源码谁先五子连成一条直线谁赢,大全其中直线可以是横的、纵的、度、度。
本次Java编程我的目的是现实人机对战,即游戏者一方是人,另一方计算机。这就要求程序不仅要具备五子棋的基本界面,还要编程指导计算机与人进行对弈。为了使程序尽可能智能,我采用了贪心策略、传统搜索算法、极大极小博弈树算法,对应游戏玩家的3个等级:简单、中等、困难。
三、功能设计
我的程序基本功能是实现人机对弈五子棋。人和电脑交替下棋,谁先五子连成一条直线谁就赢。下面是我程序的功能模块:
1.等级设置
核心功能是实现不同策略与算法的对比运用,纯贪心策略实现简单等级对手,直接搜索算法实现中等等级对手,极大极小博弈树算法实现困难等级对手。对应程序中的3选1单选按钮。
2.悔棋功能
模拟栈机制实现人悔棋,不限步长的悔棋。对应程序中的悔棋按钮。
3.棋面绘制
根据不同机计算机的屏幕分辨率,绘制逼真的棋盘。
4.引入
两张古典的人物,生动模拟对弈双方。人物旁的黑白棋钵显示黑白棋归属。
5.背景设置
支持用户选择背景,包括棋盘、棋盘边框、窗口边框,彰显个性。
6.音乐播放
下棋时有棋子落地的声音,一方胜利时有五子连成一片的声音。同时在设置背景时相应的改变整个对弈过程中的背景音乐。
7.时间显示
在棋盘正上方有一模拟文本框显示当前棋局用时。
8.其他小功能
支持和棋、认输、开启新游戏、退出游戏等操作。
四、数据结构与算法设计
数据结构部分
1.当前棋局的存储结构
我的五子棋程序选择通常用到的行*列棋盘,可以开二维数组PositionFlag = new int[][],PositionFlag[i][j]为0表示(i,j)点尚无棋,为1表示(i,j)点是人的棋子,为2表示(i,j)点是机器的棋子。之所以选择二维数组,主要原因有两点:
1.本程序需要频繁随机访问*的交叉点,对应查询该点状态以及改变该点状态,随机访问是数组的特点。
2.*=开二维数组的内存需求相对现在内存为2G及以上的计算机完全可以接受,且数组实现简单、操作方便。
基于以上两点,尽管创建动态的顺序表—链表可能可以节省少量内存(可以只存当前有棋的点,原数组对应位置为0的点可以不存),但选择数组的优势完全在上述两点体现了出来。
2.实现悔棋操作的数据结构
由于每次悔棋只需回退当前几步,后进先出原则,这正是栈这种典型数据结构的设计思想,于是我选择栈。我自己先写了用自定义数组模拟的栈,但由于是学Java语言且由于悔棋的存储空间需要随当前步数增大而增大(由于每局最多下步,即最多要悔步,所以自己开个的数组完全可以避免存储空间自增长的问题且内存完全可以接受,之所以不用自定义数组而用ArrayList类主要是为了尝试Java中STL的用法),所有我最终改为用Java类库中的ArrayList类。
确定用ArrayList类实现栈机制后就必须考虑每个ArrayList单元具体存储什么。刚开始我存储的是当前的棋局,即整个局面,而每个局面对应一个二维数组,这样是很占用内存的。试想一下,在最坏情况下,个ArrayList单元,每个单元存放一个*的二维数组,尽管**在Java的内存管理机制下不会爆栈,但也是极不划算的。之所以说不划算,是因为有更好的解决方案。由于每次悔棋只是在回退倒数一步,多步悔棋只需循环回退,所以可以只存储当前棋局最后一步的apk软件源码打开下法,对应一个二维点,完全可以自定义一个二维坐标类chessOneStep。
算法设计部分
Java语言是面向对象的语言。我在进行五子棋游戏编程是总共传创建了个自定义的类。在编写程序的过程中,我有一个明显的体验就是面向对象编程就是一项有关对象设计和对象接口技术,很多关键的技术就是如何设计自定义的对象。
下面我先概括给出我的所有类的作用:
1.mainFrame类:主框架类,我应用程序的入口;
2.chessPositon类:主控类,这个类是我程序的核心类,负责控制双方的下棋,以及调用其他的类完成当前棋局的显示绘制;
3.chessPanel类:面板类,调用其他底层类完成当前棋局的显示绘制;
4.chessBoard类:棋盘绘制类,负责棋盘的绘制;
5.chessImage类:文件类,包含各种资源(背景、背景音乐)以及静态全局变量(public static Type);
6.chessButton类:组件类,定义各种组件,包括按钮、单选按钮、文本框等;
7.chessMusic类:音乐类,负责调用Java库类完成背景音乐、下棋音乐、取胜音乐等的播放;
8.chessPiece类:棋局类,定义棋局二维数组数据结构并完成相关操作;
9.chessList类:栈类,完成悔棋等操作;
. chessOneStep类:棋子类,定义每步坐标以及下在该处获得的估价值;
.myCompare类:排序类,完成chessOneStep类的自定义排序
详细设计
1.mainFrame类
作为我的五子棋程序的主类,mainFrame类主要实例化相关的对象,如chessbutton,chessborad等,从而完成框架的创建。更重要的是实例化chessposition,这是本程序的核心类,控制游戏双方行棋过程完成人机互动下棋,然后将MyChessPosition与鼠标响应addMouseListener()关联起来。
2.chessMusic类
一个好的游戏必须给人一种身临其境的感觉,而声音是营造这种氛围的重要因素。参照网上各游戏运行商的音乐配置,我选择相关逼真的声音。包括背景音乐、下棋棋子落到棋盘发出的声音以及一方胜出的配乐。所有这些功能的实现,依赖于自定义的chessMusic类,采用AudioInputStream配合Clip的方式完成音乐播放的软硬件工作,然后定义两个接口chessmusic(String Name)和Stop(),前者完成播放功能,后者完成关闭当前音乐功能。因为音频文件相对较大,而我的程序提供在不同背景乐之间切换的功能,所以在打开另一个音频文件之前必须关闭前一个正在播放的音频文件,防止出现溢出。
3.chessImage类
适当的动画或能给游戏玩家带来美的体验。所以我的五子棋程序界面在不失和谐的前提下引入了尽可能多的,包括对弈双方、棋钵等。引入的具体工作通过语句import javax.imageio.ImageIO完成。同时,由于要在用到它的类中被访问,为了避免频繁调用函数,我直接将相关联的对象定义为public static,表明是公用的、静态的。进一步引申开去,我将程序中用到的静态全局变量都定义在chessImage类中。具体如下:
public static Date begin;//每局开始时间
public static Date cur;//每局结束时间
public static chessOneStep LineLeft;//结束端点1
public static chessOneStep LineRight;//结束端点2
public static boolean IsGameOver;//是否只有一方获胜
public static int ColorOfBackGround[][]= { { , , },{ 0,,},{ ,,}};//背景颜色
public static int ColorOfWindows[][]= { { ,,},{ ,,},{ ,,}};//背景颜色
public static int WitchMatch;//背景搭配
public static String MusicOfBackGround;//背景音乐
public static int CurrentStep;//记录当前步数
public static int Rank;//设置难度等级
public static boolean IsSurrender;//判断是否认输
public static boolean IsTie;//判断是否认输
public static String Message;//输出提示信息
public static Image IconImage;// 图标
public static Image blackBoard;//白棋盘
public static Image whiteBoard;//黑棋盘
public static Image blackChess;// 白棋棋子
public static Image whiteChess;// 白棋棋子
public static Image RightPlayer;//白棋棋罐
public static Image LeftPlayer;//白棋玩家头像
public static String path = "src/";// 的保存路径
4.chessButton类
这个是程序的组件类。定义了各种功能键,完善程序功能,营造逼真的人机对战游戏效果。分为3类:效果。。
(1)、按钮组件
本程序有5个按钮,支持和棋、认输、新游戏、退出、悔棋等。认输和和棋按钮终止当前的棋局,给出相应的提示信息;退出按钮调用系统System.exit(0)的函数正常返回;悔棋按钮调用后面要介绍的chessList类实现悔棋;新游戏按钮则刷新当前棋局准备下一轮,要将记录当前棋局的二维数组全部置0,刷新当前棋局开始时间等。
(2)、单选按钮组件
游戏界面支持设置个性化界面,包括背景颜色与背景音乐,跟重要的一点是设置难度(简单、中等、困难)。单选按钮只能多选一。背景颜色主要是存储相关颜色搭配方案的RGB颜色,开2维数组,即对应RGB3原色数组的一维数组,然后通过改变WitchMatch全局变量的值来有用户自己选择颜色搭配,不同的颜色搭配对应不同的背景音乐表达一致的主题。难度设置主要是改变计算机的下棋算法,不同难度通过Rank判断进入不同的程序分支,实现不同智能等级的计算机下棋水平。
(3)、文本框
在不同的单选按钮前添加相应的文本框,提示用户可以实现的功能。同时我用颜色模拟出显示当前棋局耗用时间的文本框。
不论按钮还是单选按钮都要关联相应的消息,把相应功能的实现放在消息响应处理函数理。这些主要是实现Java库提供的消息响应接口里的方法。
5.chessPiece类
主要完成当前棋面的存储,存储棋面的为什么要卖源码数据结构为二维数组int[][] PositionFlag;然后定义获取、设置某点以及整个棋面的状态的方法。
(1)、SetPositionFlag(int x, int y, int flag)//设置(x,y)处的状态为flag
(2)、GetPositionFlag(int x, int y)//获取(x,y)处的状态
(3)、SetAllFlag(int [][]NewFlag)//设置当前整个棋面的状态为NewFlag
(4)、GetAllFlag()//获取当前整个棋面的状态
(5)、DrawChessPiece(Graphics g)//绘制当前局面的棋子
由于本类比较重要,所以附上了代码,见源代码1。
6.chessBoard类
功能为绘制棋盘线。由于围棋的棋盘比较复杂,横线、竖线较多,且为了使棋盘美观,还要自定义窗口边框、棋盘边框、对弈双方边框等,对线宽、线型也有一定要求。有时要单像素线条,有时要多像素线条。对于多像素线条,我主要用了2种方法。
方法一:
在需要绘制多像素线条处首先绘制一条单像素线,然后根据线宽要求上下平移适当像素达到绘制多像素的目的。这样的方法适合绘制水平线或竖直线,绘制其他斜率的线条容易造成走样。在没有想到比较好的反走样编程思想后我选择了调用Java库中已经封装好的函数。
方法二:
为了克服方法一绘制非水平或竖直线时造成的走样,同时也为了更进一步学习Java语言,我猜想肯定会有类似OpenGL中设置线宽的画刷,于是上网百度找到了相应的画刷Stroke类。通过Java库实现绘制不同线宽的直线,达到了反走样效果。
7.chessOneStep类
这个类是为了配合chessList类实现悔棋以及在计算机下棋算法实现返回有效状态点而设计的。主要数据成员为
private int x,y,weight;//其中x,y表示点坐标,weight表示将棋下到该点获得的估价值。
主要方法如下:
(1)、GetX()//获得当前对象的x坐标
(2)、GetY()//获得当前对象的y坐标
(3)、GetWeight()//获得当前对象的(x,y)处的估价值
8.chessList类
程序支持悔棋功能,为了实现悔棋,自定义了chessList类。这个类主要通过引入java.util.ArrayList和java.util.List实现集合的数据类型。然后自定义一些方法,如下:
(1)、AddStep(chessOneStep OneStep)//添加一步棋到List中
(2)、GetSize()//获得当前List的大小
(3)、ClearList()//清空List
(4)、RemoveLast()//删去List中的最后元素
由于每次删除当前List中的最后一个元素,实现后进先出,所以可以模拟栈的功能实现悔棋。
9.myCompare类
由于在计算机下棋的极大极小博弈树算法中需要对自定义对象chessOneStep按weight进行排序,所以引入了myCompare类,通过实现Comparator接口中的compare方法完成自定义对象排序。
.chessPanel类
程序的自定义面板类,主要负责完成当前框架内容的显示。这是一个重要的与框架和图形显示密切相关的类。主要数据成员为
private chessboard MyChessBoard;//当前显示棋盘
private chesspiece MyChessPiece;//当前显示整个棋面的状态
主要方法如下:
(1)、chesspanel(chessboard MyChessBoard1, chesspiece MyChessPiece1)//构造函数,分别用MyChessBoard1和MyChessPiece1初始化MyChessBoard和MyChessPiece
(2)display(chessboard MyChessBoard1, chesspiece MyChessPiece1)//自定义显示回调函数,调用repaint()完成重新绘制游戏界面
(3)、paintComponent(Graphics g)//核心方法,调用各种函数完成具体的绘制工作
.chessPositon类
程序算法核心类,总的功能是控制人和计算机轮流下棋,以及调用chessPanel类中的display(chessboard , chesspiece )方法完成界面的实时刷新。关于chessPositon类,我在此将重点介绍。chessPosition类的主要数据成员如下:
private static chessboard MyChessBoard;//当前显示棋盘
public static chesspiece MyChessPiece;//当前显示整个棋面的状态
private static chesspanel Mychesspanel;////当前显示面板
public static chesslist MyChessList=new chesslist();//当前下棋集合,用于悔棋
final private static int INF = (1 << ); // 表示正无穷大的常量,用于极大极小博弈数搜索算法
public static boolean CanGo;//控制当前下棋一方
类的设计集中体现在成员方法的设计上。实现人机对战,只有语言是远远不够的,还要加入算法,用算法引导计算机下棋。下面介绍该类的方法成员:
(1)、chessposition(chesspanel , chessboard ,chesspiece ) //带有参数的构造函数
(2)、chessposition()
不带参数的构造函数
(3)、mouseClicked(MouseEvent event)
鼠标响应函数,负责人的下棋,根据鼠标点击的位置转换得到所在棋盘的相对位置。如果该位置不合法,即超出棋盘有效范围,点击无响应;如果该位置上已有棋,弹出消息框给出提示。这二者都要求重新给出下棋位置,即当前鼠标响应无效…直到点击到棋盘有效区域。
(4)、IsOver(int[][] Array,int x,int y)
判断当前int[][]Array对应的棋局是否结束,即一方五子连成一条直线。此处有两种思路,一种对当前棋面上的所有棋子都进行一次判断,具体为水平方向、竖直方向、与水平线成度方向、与水平线成度方向,只要有一个方向五子连成一条直线就说明有一方获胜,游戏结束;另一种思路为只在当前下棋的4个方向进行判断,我的程序采用的是第二种,所以IsOver方法除了int[][]Array参数外,还有x,y参数,(x,y)表示当前下棋的坐标点。
(5)display()
通过调用自定义面板类的android ptp 源码分析显示回调函数用于重新显示游戏界面,达到每下一步棋及时更新游戏界面的目的。
(6)、GetValue(int flag, int num)
估值函数,根据经验把棋局分成只有1颗棋相连,2颗棋相连且两端被封死,2颗棋相连且一端封死另一端活的,2颗棋相连且两端都是活的,同理3颗棋、4颗棋也各自可分3种情况。不同的情况对应不同的估价值。估价值的设定是决定计算机一方是否智能的一个关键因素。
(7)、GetPredictValue(int flag, int num)
对未连成一片但通过再下一颗子就能连成一片的局面进行估值,这在双方下棋的有限步骤内是能产生重要影响的。如果每局棋仅考虑当前一步,是不可取的。
(8)、Evaluate(int[][] Array, int x, int y)
根据棋面具体情况以及预先设定的估值函数,对某个点对应的局面进行评估。由于每次双方只能下一颗棋,所以可以每次取当前局面的所有点中对应估值最大值点的估值作为整个局面的估值。
(9)、GetGreedNext()
计算机下棋方法1,对应难度等级为简单,采用贪心思想。每次下棋前在求得最有利点下棋,而是否最有利只是通过一步评估。算法伪码描述为:
Max取负无穷大
for(行i从0到)
{
For(列j从0到)
{
If((i,j)对应的位置无棋)
{
a.假设放上一颗由人控制的棋,求估价值;
b.假设放上一颗由计算机控制的棋,求估价值;
c.取二者中较大值作为(i,j)处的估价值tmp;
d.取tmp与Max较大值赋值给Max.
}
}
}
最终Max对应的点就是当前整个局面中最大的估值点。至于上述为什么要考虑双方都在该点下棋的情况呢?主要原因为下五子棋是个攻防兼备的过程,不仅要考虑自己对自己最有利,还要考虑对对手最不利,通俗来讲就是在自己赢的时候不能让对手先赢。
()、GetSearchNext(int LookLength)
derectSearch(int [][]Array,boolean who,int deepth)
计算机下棋方法2:直接搜索法,对应难度等级为中等。
每步棋最多有个不同下法,若采用直接搜索法则对应的孩子节点有个(在下棋过程中会逐渐减少),即每层有最多个节点待扩展,这就决定了直接搜索进行不超过2次—主要原因有两点:
a.采用深度优先搜索需要递归,递归中状态过多可能会爆栈,我们知道递归是用栈机制来实现的;采用宽度优先搜索又需要存储为扩展的节点,这对内存容量要求很高。
b.不管深搜还是广搜,在时间复杂度为O(N^m)的情况下都是不能接受的。其中N为当前棋局的待扩展节点,最大;m为搜索的深度。
综上所述,在采用直接搜索法时搜索深度不能太深,严格来说是应该控制在2层以内,在计算机运算速度在^7次每秒的情况下,理论和实验都表明超过2层就会变得很慢且这种趋势成指数级增长。
直接搜索算法伪代码为
GetSearch(boolean flag,int deep)
{
如果deep等于0,返回当前棋局估值;
for(行i从0到)
{
For(列j从0到)
{
If((i,j)对应的位置无棋)
{
如果轮到计算机下棋,置标志位为2
GetSearch(!flag,deep-1);
如果轮到人下棋,置标志位为1;
GetSearch(!flag,deep-1);
}
}
}
}
()、GetMinMaxsearchNext(int LookLength)
MinMaxsearch(int [][]Array,boolean who, int deepth)
计算机下棋算法3:极大极小博弈树法,对应难度等级为困难。五子棋是个博弈游戏,当前在寻找对自己最有利的下棋点时要尽可能保证对对手最不利,这种思想可以用极大极小博弈树
vb6 五子棋
五子棋简介
五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。
五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
传统五子棋:
传统五子棋的棋子分为黑白两色,采用围棋棋盘,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
称谓:
五子棋,日文亦有“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”等多种称谓,英文则称之为“FIR (Five In A Row的缩写)、Gomoku(日语“五目”的罗马拼音)、Gobang、connect 5、mo-rphion”。博客音乐播放源码捷克语piskvorky,韩语omok……
许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,暗示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式;美国人喜欢将五子棋称为“商业棋”,也就是说,商人谈生意时可边下棋边谈生意,棋下完了生意也谈成了。
起源:
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。可见,五子棋颇有渊源。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。正如《辞海》中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜。”。
[编辑本段]五子棋的发展
日本
据日本史料文献记载,中国古代的五子棋先由中国传到高丽(朝鲜),然后于公元年至年日本的元禄时代再从高丽传到日本,最初在皇宫和贵族大家庭中流行,到元禄末期,开始在民间盛行。年,对传统五子棋进行规则改良后,经过公开征名,“联珠”这一名称才被正式确定下来。取意于“日月如合璧,五星如联珠”。现写做“连珠”。
欧洲
世纪初传统五子棋及连珠从日本传入欧洲,五子棋称为“Five In A Row”(缩写为FIR),同时根据日语的罗马拼音,“五目、五目碰”称为"Gomoku、Gobang",“连珠”则称之为“Renju”。
年以及年,瑞典和前苏联分别成立了连珠联盟。年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟(Renju International Federation,简称RIF).
世纪年代欧洲一些国家将传统五子棋引入“交换”等规则后,经过发展逐渐形成一系列的Gomoku新规则,中欧一些国家成立了Gomoku组织,并和六子棋共同成立了国际联盟(GCIF)。
世纪初在举办世界连珠(renju)锦标赛的同时也举办世界Gomoku锦标赛(GT)及六子棋国际公开赛(CT)。
年8月在捷克共和国(CzechRepublic)帕尔杜比采市(Pardubice)将举行第届世界连珠锦标赛和第3届世界Gomoku锦标赛。
中国
长久以来五子棋在中国一直没有得到发展。
年,国家体育总局批准中国棋院试办全国性五子棋比赛。
年8月2-4日,中国棋院举办了首届全国五子棋个人邀请赛,此后每年举办一次。
年,国家体育总局批准了中国棋院审定的《中国五子棋竞赛规则》(试行)(参考资料[1])和《中国五子棋段级位制》(试行)(参考资料[2])。
年2月,国家体育总局对五子棋正式立项,作为围棋下的一个二级项目。全国各地相继成立了新的五子棋俱乐部。
年5月和月中国棋院先后举办了首届全国五子棋团体锦标赛和首届全国五子棋个人锦标赛。
年6月和月中国棋院先后举办了第二届全国五子棋团体锦标赛和第二届全国五子棋个人锦标赛。
年5月-日中国棋院举办了第三届全国五子棋团体锦标赛。
年月,首届全国智力运动会将五子棋作为的正式比赛项目(参考资料[3])。
[编辑本段]现代五子棋
随着五子棋的发展,逐步发现先手优势非常大,最后得出“先手必胜”。五子棋要成为竞技运动,核心问题是怎样解决传统五子棋下法中“先手必胜”的问题。
“交换”思维
“交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“先手必胜”依然存在。
如:欧洲的Swap2、Swap1;中国的Swap3、第一手交换规则等。
“禁手”思维
禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先手必胜”。
“泡沫”原理
像泡沫一样会破灭。如“吃子”五子棋。连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。
“井字游戏”原理
井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。
通过缩小棋盘来抑制五子棋先手的优势。如:路棋盘,路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。
“跷跷板”原理
五子棋始终是先手领先一子。如果双方轮流领先一子呢?
台湾教授发明的六子棋,就如“跷跷板”一样。先手先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复杂性。
综合效应
“禁手”思维+“交换”思维+“井字游戏”原理=连珠
如:RIF规则、Sakata规则、Yamaguchi规则Tarannikov规则等。
现代五子棋的现状
五子棋、六子棋、连珠已经成为欧洲现代五子棋的组成部分,举行了很多次大大小小的比赛,并且将三种棋的世界锦标赛联合举行。
中国的现代五子棋还处于起步阶段。年中国棋院《中国五子棋竞赛规则》参考了RIF规则,同时兼顾发展传统五子棋。
[编辑本段]五子棋段级位制
中国五子棋段级位制 (试行) (具体内容见参考资料[2])
五子棋的段级位对象:参加中国棋院认可的国内外五子棋比赛的五子棋爱好者。
第四条 段位共分九个等级,最高是九段,以下分别是八段、七段、六段、五段、四段、三段、二段、初段。段位以下共分十个等级,最高是一级,以下分别是二级、三级、四级、五级、六级、七级、八级、九级、十级。
第五条 根据中国五子棋爱好者在国内、国际交流中所体现出来的实际水平,在五子棋段级位制度实施初期,对爱好者授予的最高段位暂定为六段。随着中国棋手参与国内外交流机会的增加和技术水平的提高,逐步增加所授予段位的上限,直至九段。
[编辑本段]棋盘、棋子与记谱方法
相传中华民族的祖先轩辕黄帝无意之中画下了十七条横线十条竖线,这无意中的发明造就出了五子棋。早在公元年古人就用瓷来烧制五子棋盘了。千百年来,人们用各种材质来制造围棋的棋子,如:玻璃、瓷器、玉、玛瑙、铜等等。
古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(×)棋盘,至南北朝时即已流行十九路(×)棋盘,直至年,才出现所谓五子棋专用棋盘,如图所示,为十五路(×)棋盘,形状近于正方形,平面上画横竖各条平行线,线路为黑色,构成个交叉点,邻近两个交点的距离纵线约为2.5厘米,横线约为2.4厘米。棋盘正中一点为“天元”。棋盘两端的横线称端线,棋盘左右最外边的两条纵线称边线。从两条端线和两条边线向正中发展而纵横交叉在第四条线形成的四个点称为“星”。天元和星应在棋盘上用直径约为0.5厘米的实心小圆点标出。
五子棋棋子亦称“棋石”分黑、白两色,形状为扁圆形,有一面凸起或两面凸起等形状,厚度不超过0.8厘米,直径为2.0~2.3厘米;一副棋子总数为枚,其中黑子枚,白子枚。按质地的不同,可分为玻璃、陶瓷、塑料、智石、磁铁、蛤贝、烧料、水晶、玛瑙、玉石等棋子。
五子棋正规的记谱方法为用“五子棋稿纸”,即专供五子棋爱好者记录对局或着法的稿纸。其上印有正规专用棋盘图形,记录时只要按相应位置在纸上标明行棋的先后,即可反映对局的进行过程。非正规的记谱方法为用格子纸记录,即用单数1、3、5等记录黑方的走法,用双数2、4、6记录白方的走法,同样可反映对局的进行过程。另外还有北京京都五子棋协会为了推广盲人下五子棋,以及正常人下盲棋并背诵五子棋棋谱,专门设计的盲棋记谱法等。
[编辑本段]相关术语
对局相关术语
〖黑方〗执黑棋一方的简称。
〖白方〗执白棋一方的简称。
〖胜局〗有一方获胜的对局。
〖和局〗分不出胜负的对局。
〖终局〗对局结束。
〖复盘〗对局双方将本盘对局全过程的再现。
行棋相关术语
〖阳线〗即:直线,棋盘上可见的横纵直线。
〖交叉点〗阳线垂直相交的点,简称“点”。
〖阴线〗即:斜线,由交叉点构成的与阳线成°夹角的隐形斜线。
〖落子〗棋子直接落于棋盘的空白交叉点上。
〖轮走方〗即“行棋方”,有权利落子的黑方或白方。
〖着〗在对局过程中,行棋方把棋子落在棋盘无子的点上,不论落子的手是否脱离棋子,均被视为一着。
〖回合〗双方各走一着,称为一个回合。
〖开局〗在对局开始阶段形成的布局。
〖连〗同色棋子在一条阳线或阴线上相邻成一排。
〖长连〗五枚以上同色棋子在一条阳线或阴线上相邻成一排。
〖五连〗只有五枚同色棋子在一条阳线或阴线上相邻成一排。
〖成五〗含有五枚同色棋子所形成的连,包括五连和长连。
〖四〗在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。
〖活四〗有两个点可以成五的四。
〖冲四〗只有一个点可以成五的四。
〖死四〗不能成五的四。
〖三〗在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。
〖活三〗再走一着可以形成活四的三。
〖连活三〗即:连的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。
〖跳活三〗中间隔有一个空点的活三。简称“跳三”。
〖眠三〗再走一着可以形成冲四的三。
〖死三〗不能成五的三。
〖二〗在一条阳线或阴线上连续相邻的5个点上只有两枚同色棋子的棋型。
〖活二〗再走一着可以形成活三的二。
〖连活二〗即:连的活二(同色棋子在一条阳线或阴线上相邻成一排的活二)。简称“连二”。
〖跳活二〗中间隔有一个空点的活二。简称“跳二”。
〖大跳活二〗中间隔有两个空点的活二。简称“大跳二”。
〖眠二〗再走一着可以形成眠三的二。
〖死二〗不能成五的二。
〖先手〗对方必须应答的着法,相对于先手而言,冲四称为“绝对先手”。
〖三三〗一子落下同时形成两个活三。也称“双三”。
〖四四〗一子落下同时形成两个冲四。也称“双四”。
〖四三〗一子落下同时形成一个冲四和一个活三。
战术相关术语
〖风车轮〗指在一定区域内来回地绕着连续进攻的战术或技巧,就像一个风车轮一直在转着似的,这样的取胜方法也称之为“风车胜”。
〖二头蛇〗指某一方以活三进攻时,无论对方防守于哪一头都难免被蛇头咬伤,因为此时的活三如同二头蛇一样,两头都有厉害的杀着。也称“两头蛇”。
〖一子双杀〗一子落下同时形成两种取胜方法而对方无法同时防守的取胜技巧。
〖一子多杀〗一子落下同时形成两种以上取胜方法而对方无法同时防守的取胜技巧。
〖一子双防〗一子落下同时形成防守两种取胜方法的防守技巧。
〖八卦阵〗以“日”字的一组对角点为棋型,互为马步的防守阵型。构成五子棋八卦阵。
〖VCF〗英文 Victory of Continuous Four 的字头缩写,是利用连续不断地冲四这种绝对先手,直至最终取得胜利的战术技巧。
〖VCT〗英文 Victory of Continuous Threat 的字头缩写,是利用连续不断地活三、冲四、做杀等先手,直至最终取得胜利的战术技巧。
比赛相关术语
〖个人赛〗计算个人成绩的比赛。
〖团体赛〗计算运动队团体成绩的比赛。
〖轮空〗赛制中部分选手直接从中间某轮开始参加比赛,某轮未比赛的安排就叫轮空。
〖节〗一个比较集中的比赛单位时间(如一个上午或一个下午或一个晚上)称一“节”。
〖轮〗参赛的各队(团体赛)或各名棋手(个人赛)普遍出场比赛一次(个别轮空者除外)称一“轮”。
〖次〗团体赛中的同一轮两队之间完成的比赛称为一“次”比赛。
〖场〗两名棋手之间完成的两局制或多局制的一次比赛称为一“场”比赛。
〖局〗两名棋手之间完成的一盘比赛称为一“局”比赛。
[编辑本段]那氏五子兵法
中国现代五子棋的开拓者那威荣誉九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套“ 秘诀 ” ,谓之《那氏五子兵法》:
先手要攻,后手要守,以攻为守,以守待攻。
攻守转换,慎思变化,先行争夺,地破天惊。
守取外势,攻聚内力,八卦易守,成角易攻。
阻断分隔,稳如泰山,不思争先,胜如登天。
初盘争二,终局抢三,留三不冲,变化万千。
多个先手,细算次先,五子要点,次序在前。
斜线为阴,直线为阳,阴阳结合,防不胜防。
连三连四,易见为明,跳三跳四,暗剑深藏。
己落一子,敌增一兵,攻其要点,守其必争。
势已形成,败即降临,五子精华,一子输赢。
[编辑本段]五子棋的开局
五子棋的开局也称布局,一般在3~7手左右完成。五子棋的开局是十分重要的。一般情况下,一局五子棋的着数在至着之间,因此,它的开局阶段是非常短暂的,大约在七八着至十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着关键的作用。一般来说,黑棋以攻为主,而白棋则以防为主。
在开局阶段,双方主要是二的争夺。双方必须设法创造自己的连二、活二、跳二或大跳二等,同时要阻挡对方的活二。无论哪种开局,均体现出这一规律。
可以说,哪一方的二做得多 ( 有两个以上的活二 ) ,或者有效地阻挡住对方的活二,那么,哪一方的胜率就比较大。另外,开局时每一个次序、每一种节奏都不能忽视,输赢就在一步之差。
直止打法开局为了便于记忆、区分以及比赛。只对前3步组成的棋形进行了部分取名。
中国五子棋竞赛规则的五子棋开局
开局形状均以“星”和“月”命名。(参考资料[1]中“第三条”)
斜止打法开局全国正式比赛均采用种开局,包括斜指开局的长星局、峡月局、恒星局、水月局、流星局、云月局、浦月局、岚月局、银月局、明星局、斜月局、名月局、慧星局和直指开局的寒星局、溪月局、疏星局、花月局、残月局、雨月局、金星局、松月局、丘月局、新月局、瑞星局、山月局、游星局。
黑方必负开局
可用《彭氏口诀》进行记忆:
二十六局先弃二,直指游星斜慧星。
寒星溪月疏星首,花残二月并白莲,
雨月金星追黑玉,松丘新宵瑞山腥。
星月长峡恒水流,白莲垂俏云浦岚,
黑玉银月倚明星,斜月名月堪称朋。
[编辑本段]五子棋的数学思考
可能很少有人注意到,五子连珠游戏其中包含着一个极为深刻的数学问题。为什么不是四子连珠,或者是六子连珠?你可能会说,四子连珠,那就太容易啦,下几步就胜了。而六子连珠呢,则太难了,谁也别想连成。这就说明,五子连珠极可能是一个最佳攻守平衡值,一个达成连珠的最大值。增一子、减一子都会打破这个平衡。四子连珠太易,攻方处于绝对优势;而六子连珠太难,守方处于绝对优势。而游戏规则必须是让游戏双方处于平等的位置才可能进行,否则游戏就不成其为游戏。要想黑白棋连珠成为一种符合游戏规则的智力游戏,五子连珠无疑是一个最佳方案。中华民族的祖先在发明五子连珠的过程中,猜想肯定也不是一撮而就,而是极可能经历了四子连珠、六子连珠的尝试过程,最后才确定为五子连珠,并流行开来。
这个问题,被当代科普作家傅小松称之为五子连珠问题,又称五子连珠猜想。其准确表述是:
在以横线、竖线互相交叉(一般各为条)的方形平面(棋盘)中,黑白两种“点’(棋子)先后沿横线、竖线排列(行棋),在平面(棋盘)横线、竖线、斜线(无实线连接)上形成连续的同色“点”(棋子),五个“点”(棋子)为可能达成连珠的最大值。
五子连珠是黑白棋连珠的一个最佳方案,这在实际中早已不会有人怀疑。并且,五子连珠已经存在并发展了几千年,成为了一种趣味性强,同时技巧比较复杂、竞争激烈的棋类游戏,与围棋、国际象棋、中国象棋的巧妙性、复杂性也有一拼。这似乎足以证明五子连珠的最佳性。但从科学真理的角度看,一万次实践的证明也不能代替逻辑和数学上的证明。要确定五子连珠是黑白棋连珠的一个最佳方案,五子连珠是一个最佳值、最大值,必须进行数学上的证明。
“五子连珠问题”的证明可能非常复杂,这是因为,第一,它不是一个静态的问题,而是一个动态的问题。棋盘是一个静态的二维平面,但行棋博弈是一个的动态的过程。第二,这不是一个线性和确定性问题的,而是一个非线性和模糊性问题。所谓“五子连珠”的最佳值,是在千变万化的攻与防中达到的一种默契。因此,要解决“五子连珠猜想”,可能要运用到博弈论、模糊数学等工具。
[编辑本段]五子棋攻防策略
五子棋源于中国,后传入日本名为“连珠”。学从中国,传至中国。
下五子棋须得法,法中变化有莫测;五子之变如水势,因势避高而趋下.战不过攻守,法不过奇正,奇正之法:往复循环,“不竭如江海,无穷如天地”。
其祥法如下 :围、击虚、就实、寡众
(围)由于五子棋源于围棋,故下五子棋若想立于不败之地,须以围棋之法行棋,说白了就是“包饺子”,试想:如果对方的棋子被围住了,左冲右突都不行,前闯后退更不见效,此时他心理极度郁闷,已无斗志,棋还能下好吗?只能是输的份了!!!此招用于防守。
(击虚)兵法有云:“避实击虚”,下五子棋之精髓也在其理。不过此举贵在进攻,进攻若能攻其空虚之处,且得法,将会以迅雷不及掩耳之势而破竹将对手击败。此招用于进攻。
(就实)老子《道德经》中讲了万物正反两个方面及消长之理,攻守亦不过如此,故有“避实击虚”则就有“就实让虚”。“就实让虚”就是对方往哪里走棋,咱就往哪里走棋,好比随形附影一般。这招要把握好火候,不能过度也不能失度,因为下棋很容易攻守易势(攻之极乃守时,守之极乃攻时;攻中生守,守中生攻),此招用于防守。
(寡众)《孙子●虚实》中曰:“......备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡......”此招用在五子棋中则反其道而行,则会收到意想不到的效果,具体招法是“堵了前面则堵后面,堵了后面则堵前面,堵了左边则堵右边,堵了右边则堵左边”,前后左右四面八方都堵,则对方则无路可逃,无棋可下!此招和(围)连用。无所不胜,用在防守。
另外,有时在有计算的前提下,连续冲三、冲四(vct、vcf)有可能创造新的进攻机会;反之,一味的VC,只能迟滞败亡的步伐,反而使自己被“围”陷入铁桶阵(一般叫马桶阵)中。除了这些外,八卦阵是防守的无二秘宝,只是明八卦太过明显,因此暗八卦(用部分八卦点做主力,少量杂子作障眼)的功底就成了衡量技术的重要指标。
参考棋经十三篇
五子棋贡献分析法
五子棋作为民间游戏来说,也是颇有智力韵味的,下面介绍一下理论中的五子棋的贡献问题与法则:
设以围棋棋盘左下角为坐标原点建立直角坐标系xOy,若(9,)(9,)(,)(,9)上有黑子,(8,)(,9)(,8)上有白子,现在到白棋走子,若走(,)(,)就属于斜向走子,但是通常直向的(紧贴着棋子走的)走子要比斜向的走子对防守的贡献大,若走(8,)(8,)(8,9)(9,9)其中一个的均属于单侧走子,而另一侧则空虚,所以也不好,若走(,)也不好,因为在(,8)的子已经对防守有了一定的贡献了,同理走(,)的也不好,因为(,9)的子也对防守有了一定的贡献.所以说此时最佳的走子方法就是走(9,)
若(8,)有白子,(,)(,)(,)有黑子,到白子走,由于(8,)对防守贡献了一部分,所以应该走(,)而不走(9,)。若为黑走,就应该走(,)而不走(9,),因为白子的(8,)会削弱它对攻的贡献