五子棋游戏

一,1.五子棋的基本常识

与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。

五子棋的开始阶段称为开局,或称布局。其开局阶段是十分短暂的,大约在七着与十几着之间。在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。因此积极处理好开局和开局向中局的过渡十分重要。

五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。

2、五子棋比赛的相关规定

(1) 职业连珠规则

a. 黑方先下子,白后下,从天元开始相互顺序落子。

b. 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。

c. 黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“长连”。即黑棋只能以“四三”取胜。 有关术语解释请见图示说明。

d. 如分不出胜负,则定为平局。对局中拔子、中途退场均判为负。

e. 五连与禁手同时形成,判胜。

(2) 比赛中的规定和特例

a. 对局开始前,双方猜子,大数减小数,单数交换,偶数不换。

b. 白棋第一手(即盘面第二着棋)应在天元为界自己一侧布子,主要以示尊重对方,之后双方可任意行子。

c. 对局中双方应遵守“职业连珠五子棋规则”,如出现争议,应由裁判判定。

d. 对局中掉子(棋子掉落在棋盘上)的一方判负。如遇推子或蹭子,以盘面第一落点为准。用手将棋子扶正不算违规。

e. 对局中应礼貌行棋,防止不正常声音、动作影响对方思考。

f.. 比赛结束后,双方应将各自棋子放回原处。

g. 对局中如黑方出现禁手,白方应立即指出禁手点,黑方即负。如白方在黑方出现禁手后,又下一步白子,黑棋禁手则不成立了。

h. 比赛对局时间,双方分别为15分钟、1小时、2小时、5小时四个等级标准,超时判负。

(3) 特殊规定

职业五子棋虽然对黑棋采取了种种限制,但黑子先行的优势依然很大。因此,在高段位的职业比赛中,又出现了三种特殊的规定。

a. 指定打法:是指比赛双方按照约定好的开局进行对弈,由白棋先行。

b. 三手可交换:是指黑棋下盘面第3手棋后,白方在下第四手之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。

c. 五手两打法:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中拿掉一粒棋子,然后再继续对弈。一般说来,白棋肯定拿掉对白方不利的一点,而保留对黑方较为不利的那点让黑方行棋。

二 ,代码地址 https://github.com/kongxiangyu/test/tree/master

三,

1、系统用例模型设计

五子棋系统应该具有选择玩家先落子还是电脑先落子的功能,应该具有开始游戏和重新开始的功能,当然了,必须具有在玩家指定位置落子的功能。以上描述,用用例图在图1中做进一步描述。这部分功能,主要通过界面与系统的交互来实现。

各个用例,简单描述如下:

l 选择电脑先落子:选择后,在游戏过程中,由电脑执黑子,先落子;玩家执白子,于电脑后落子;

l 选择玩家先落子:选择后,在游戏过程中,由玩家执黑子,先落子;电脑执白子,于玩家后落子;

l 落子:原则上说,只要不违反禁手规则,在玩家鼠标点击最近的落子点落子,但是在本系统中,简单起见,没有考虑禁手规则;

l 开始游戏:选择后,根据设定的电脑还是玩家先落子,开始游戏;

l 重新开始:在游戏途中,可以选择重新开始,中断游戏并重新开始游戏。

同时,五子棋系统本身应该具有棋盘绘制、棋势扫描、棋势排序、棋势评估、择位落子,以及胜负判定的功能,尤其是对于棋势排序、棋势评估和择位落子,这里是体现五子棋系统人工智能(AI)的关键之处。以上描述,用用例图在图2中进一步描述。

l 棋盘绘制:绘制19*19的棋盘及相关按钮和选项,并负责电脑、玩家落子后棋子的具体绘制;

l 棋势扫描:扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势;

l 棋势排序:对获取的八个方向的棋势(实际上下合一,左右合一,左下右上合一,坐上右下合一,为四个方向),进行排序,便于进行棋势评估;

l 棋势评估:分别对电脑和玩家的棋势进行评估,量化棋势;

l 择位落子:比较电脑和玩家的棋势,若有利于玩家,则采取“守、堵”的策略,若有利于电脑,则采取“攻、走”的策略;

l 胜负判定:每次电脑或是玩家落子后,判断胜负情况,若出现“五子连珠”,则“连珠”一方取胜,另一方失败,游戏结束。

3、系统模块设计

为了实现五子棋系统本身具有的功能,将系统分为这几个模块:五子棋主模块、棋势扫描模块、棋势排序模块、棋势评估模块以及随机落子模块。其中,五子棋主模块实现棋盘绘制、胜负判定的功能,以及对弈过程中对比双方棋势的择位落子模块。棋势扫描模块、棋势排序模块、棋势评估模块分别实现棋势扫描、棋势排序、棋势评估的功能;而随机落子模块则实现在前两步棋势尚未形成时,电脑紧邻玩家落子位置随机择位落子的功能,是用例图中择位落子功能的一部分。

对应的,系统一共有五个类,分别对应五个模块;分别为:五子棋主模块Gobang类、棋势扫描StatusScan类、棋势排序StatusSort类、棋势评估StatusEvaluation类,以及随机落子RandomPlay类。

四、五子棋的实现与测试

1、Gobang类的实现

Gobang类是五子棋的核心类,棋盘绘制、棋子落子,响应事件的处理,游戏的控制和模式设置,胜负判定,以及对棋势扫描、排序、评估等的调用都在这里实现。Gobang类的类图。

其中棋盘的绘制,有paint()和init()来实现,棋子落子由setQizi()来实现,响应事件的处理也在这个类中添加监视器并处理,而游戏的控制和设置在Game_start()和Game_rastart()中实现,游戏胜负的判定由Judge()方法和四个判定不同方向上是否五子连珠的Game_win_*()函数来实现。而最为重要的棋势扫描、排序和评估,则由其属性scanp、scanc、sort、evaluatep、evaluatec分别调用它们的方法来实现。随机落子由属性randomPlay调用其方法实现。

2、StatusScan类的实现

StatusScan类通过扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势。StatusScan类的类图。

其中三维数组shape为一个20*20*5的数组,用来存储所获取的整个对弈双方的棋势。当然了,在实际实现中,实例化了两个StatusScan类的对象scanp和scanc,这两个对象分别用来存储玩家的棋势和电脑的棋势。而statusScan()方法具体实现从棋盘上获取整个棋势的具体过程,参数chesspad存储棋盘上的详细落子情况,参数colour决定需要获取的是黑方的棋势还是白方的棋势。具体扫描时,对于棋盘(i, j)处,有上下、左右、左下右上、坐上右下八个方向,但是统计时,将上下、左右、左下右上、左上右下分别合一,则一共有四个结果,分别存储在shape[i][j][0]、shape[i][j][1]、shape[i][j][2]、shape[i][j][3]中。

3、StatusSort类的实现

StatusSort类对StatusScan类扫描得到的棋势进行排序,以便于做进一步的棋势评估。StatusSort类的类图。

其中,StatusSort类只有一个方法statusSort(),参数shape即为StatusScan类扫描获取的棋势数据,该方法主要是对shape中的棋势数据进行排序,使得shape数组满足以下条件:

排序后的结果仍然存储在shape数组中。

4、StatusEvaluation类的实现

StatusEvaluate类对StatusSort类排序过的棋势进行评估,为对弈时电脑择位落子提供依据。StatusEvaluate类的。

其中,StatusEvaluate类也只有一个方法statusEvaluate(),参数shape即为StatusSort类排序后的棋势,该方法主要是根据棋盘上每一个位置(i, j)的棋势数据shap[i][j][0]、shap[i][j][1]、shap[i][j][2]以及shap[i][j][3]的取值,计算该位置的棋势评估值,并保存在shap[i][j][4]中。此外,还要比较每一个位置的棋势评估值,将最大的评估值记录在属性max中,相应的位置坐标记录在max_x和max_y中。

5、RandomPlay类的实现

RandomPlay类主要是在前两步,棋势尚未形成,在玩家落子后,电脑紧邻玩家落子位置,随机落子。RandomPlay类的类图

其中,方法randomPlay()方法具体实现这一过程,属性chesspad存储目前棋盘上的落子情况,参数a、b即为玩家最近一次的落子位置。randomPlay()方法通过检测随机数的值,分别在紧邻玩家落子(a, b)处的正上、正下、正左、正右、左下、右上、左上以及右下八个位置中的一个位置落子,最终选取的电脑落子位置,存储在属性x、y之中。

6、五子棋系统的测试

运行系统后,选择“让让电脑也无妨”,单击“人机对战,快冲啊”,开始游戏。游戏过程中,能够正确显示相关的游戏信息,如图10所示。

运行截图

五,问题及解决方案、心得体会

通过五子棋实验,从分析、设计、编程、调试,到最后运行成功,自己得到了很多的锻炼。

java 五子棋游戏的更多相关文章

  1. Java 五子棋小游戏

    package Day8_06; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import ...

  2. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

  3. 关于五子棋游戏java版

    一 题目简介:关于五子棋游戏 二 源码的github链接   https://github.com/marry1234/test/blob/master/五子棋游戏 三.所设计的模块测试用例.测试结果 ...

  4. 自定义View实现五子棋游戏

    成功的路上一点也不拥挤,因为坚持的人太少了. ---简书上看到的一句话 未来请假三天顺带加上十一回家结婚,不得不说真是太坑了,去年婚假还有10天,今年一下子缩水到了3天,只能赶着十一办事了. 最近还在 ...

  5. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

  6. 原生JS+Canvas实现五子棋游戏

    一.功能模块 先看下现在做完的效果: 线上体验:https://wj704.github.io/five_game.html 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代 ...

  7. java围棋游戏源代码

    //李雨泽源代码,不可随意修改.//时间:2017年9月22号.//地点:北京周末约科技有限公司.//package com.bao; /*围棋*/ /*import java.awt.*; impo ...

  8. Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

    Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...

  9. Java 3D游戏引擎——JME(java Monkey Engine)

    转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...

随机推荐

  1. PJ可能会用到的动态规划选讲-学习笔记

    PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...

  2. 【转】vue项目打包部署——nginx代理访问

    我又来了,今天部署了下vue项目,使用nginx做了代理,这样可以解决跨域的问题,这里做一个简单讲解. 1.先看vue项目打包(我这里使用的是vscode开发工具) 这里是我的项目结构: 打包之前需要 ...

  3. python五十七课——正则表达式(多个字符)

    演示匹配多个字符:以下x.y.n都是变量名:分类:1).模糊匹配: x?:表示0个或者1个 取值范围:[0,1]x+:表示1个或者多个 取值范围:[1,无穷大)x*:表示0个或者多个 取值范围:[0, ...

  4. [MySQL学习]STRICT_ALL_TABLES相应的OUT of RANGE VALUE FOR COLUMN和DATA truncated FOR COLUMN

    版权声明:声明:本文档能够转载,须署名原作者. 作者:无为 qq:490073687 周祥兴 zhou.xiangxing210@163.com https://blog.csdn.net/Rooki ...

  5. [SDOI2010]捉迷藏

    嘟嘟嘟 k-d tree板儿题. 建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得. #include<cstdio> #include<iostream> ...

  6. Java中关于LockSupport的简单入门记录

    LockSupport的JDK的文档描述:Basic thread blocking primitives for creating locks and other synchronization c ...

  7. DStream算子讲解(一)

    先把目录列好,方便有条理的进行整理

  8. win7下面搭建angularjs开发环境

    每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 1.安装git,添加环境变量2.github上有一个比较好的纯净AngularJs app的种 ...

  9. 对JavaScript垃圾回收机制的理解?

    (1)标记清除(Mark and sweep) 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为”进入环境”,当变量离开环境的时候( ...

  10. jvm虚拟机分享课笔记

    深入理解jvm虚拟机分享 1. jvm执行流程 java-编译-.class—类加载器(随时随地加载)--[进入java虚拟机] 执行引擎—本地方法接口---本地方法库 运行时数据区 2. 运行时数据 ...