五子棋游戏

一,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. January 07th, 2018 Week 01st Sunday

    To remember is to disengage from the present. 铭记过去就是放弃当下. To remember the past doesn't mean we would ...

  2. strong vs copy

    一.前言           在这里,我通过实例去介绍strong和copy的区别(%p打印出来对象的地址)  ViewController.h            #import <UIKi ...

  3. centos iftop iotop htop

    centos6.4安装iftopyum install gccyum -y install libpcap libpcap-develyum -y install ncurses ncurses-de ...

  4. vue_表单控件

    Vue.js中提供 v-model 的指令对表单元素进行双向数据绑定,在修改表单元素值的同时,实例 vm 中对应的属性值也同时更新,反之亦然.本小节介绍主要input元素绑定v-model 后的具体用 ...

  5. 网页中的meta标签的作用

    偶尔看到一篇博客详细介绍了meta的作用:http://www.cnblogs.com/nianshi/archive/2009/01/14/1375639.html

  6. web机试

    测试: <html><style> </style><title>Demo</title> <body><div > ...

  7. 用Python读写Excel文件的方式比较

    虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Ex ...

  8. 转:// 再说 Oracle RAC services

    应用程序工作负载在Oracle 10g中可以被定为services,也称之为服务,能够在单实例中使用,也能够在RAC中单独使用和管理.因此整个数据库负载能够被分割为多个不同的services,通过管理 ...

  9. zabbix监控nginx连接数量

    #!/bin/bash conn=`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' | grep "E ...

  10. springboot读取配置文件的顺序(转)

    也就是说:springboot会默认先加载项目外部的配置文件,覆盖内部的配置文件!所以导致项目一直使用的错误的配置! 强烈建议:不要把项目和application.properties配置文件放在一起