五子棋游戏总体设计与实现
别妄想泡我
865次浏览
2021年01月27日 22:21
最佳经验
本文由作者推荐
广告学专业大学排名-指法图
五子棋游戏总体设计与实现
4
、系统总体设计与实现
4
、
1
总体设计分析
总体设计就是软件开发过程中的另 一个重要阶段
,
在这一阶段中将根据需求
分析中提出的逻辑模型
,
科 学合理地进行物理模型的设计。这个阶段的主要目标
就是将反映用户信息需求的逻辑方案转换成物理方案
,
并为下一阶段提供必要的
技术资料。
4
、
1
、
1
总体设计原则
(1)
整体性
:
软件就是作为统一整体而存在的。因此
,
在总体设计 中要从整个软
件的角度进行考虑。
(2)
灵活性
:
为保持 软件长久的生命力
,
要求该手机游戏软件具有很强的环境
适应性。为此
,游戏软件应具有较好的开放性与结构的可变性。
(3)
可靠性
:
可靠性就是指软件抵御外界干扰的能力及受外界干扰时的恢复能
力。
(4)
经济性
:
经济性就是指在满足游戏软件需求的前提下
,
尽可能地减小游戏< br>软件的开销。
4
、
1
、
2
软件模块总体设计
软件中各模块之间的关系通常利用层次图来表示。
它就是 一种一系列多层次
的用树形结构的矩形框描绘数据的层次结构框图。
一个单独的矩形框作为树形 结
构的顶层
,
各个数据的子集由下面的各层矩形框代表
,
最底层的各 个矩形框代表组
成这个数据的实际数据元素
(
不能再分割的元素
),
它代表完整的数据结构。
这模式
非常适合于需求分析阶段的需要
,
层次方框图 对数据结构描绘随着结构精细化也
越来越详细。反复细化沿着图中每条路径
,
从对顶层 信息的分类开始
,
直到确定了
数据结构的全部细节为止。
五子棋游戏总体设计与实现
开始游戏
重新游戏
游戏选项
悔棋
认输
五
子
棋
游
戏
背景音乐
退 出游戏
先后手设置
游戏设置
棋盘底纹设置
棋盘大小设置
游戏帮助帮助
关于
图
4-1
游戏功能结构
本研究 中将游戏软件分为三大模块
,
如图
4-1
所示
,
包括
:
游戏选项、游戏设置
与帮助。
按照在调研中搜集的资料对每个模块的功能进行编排 制作。
依据上述功
能的分析
,
本研究中
,
将游戏软件在三大 模块的基础上又对每一大模块又分为几个
子模块
:
游戏选项包括六个模块
:
开始游戏、重新游戏、悔棋、认输、背景音乐与退
出游戏。
游戏设置包括三个模块
:
先后手设置、棋盘底纹颜色设置与棋盘大小设置。
帮助包括两个模块
:
游戏帮助与关于。
4
、
2
游戏设计
4
、
2
、
1
游戏前的准备
本游戏在开 发之前需要做一些前期准备工作
,
尤其就是对于精通五子棋游戏
的
Java
游戏开发者来说。
通常情况下
,
一款运用起来比较熟练地
J2ME
开发工具
五子棋游戏总体设计与实现
就是必不可少的。本游戏使用的就是
J2ME
的简化开发工具
Sun
Java
(TM)
Wireless Toolkit 2
、
5
、
2 for CLDC,
她需先将
Java
虚拟机安装调试好之后才能使用。
WTK 2
、
5
、
2
不带有文本编辑功能
,
所以需要另寻搭配使用。
本游戏采用
Ultra Edit
进行编辑。
本游戏需要几张后缀名为、
png
格式的卡通图
,
除了一张用作五子棋游
戏的
Logo
外
,
其余的都将在游戏中使用。
4
、
2
、
2
游戏界面与事件驱动设计
游戏的界面设计采取传统游戏界面风格
,
如图
4-2
所示。
游戏设计 中采用传统
界面游戏风格
,
首先启动游戏
,
然后进入游戏开始界面< br>,
界面中放置“设置”
、
“开
局”
、
“帮助”
、
“关于”四个选项供玩家选择。其中“设置”选项主要就是对游戏
的相关功能进行设置,
如游戏难度设置。另外还有“悔棋”
、
“重玩”等项目的设
置。除此之 外还包括查瞧游戏帮助、游戏介绍等。
图
4-2
游戏界面设计
所谓事件驱动
,
简单地说就就是您点什么按钮
(
即产生什么事件
),
电脑执行什
么操作
(
即调用什么函 数
)
。当然事件不仅限于用户的操作。我们知道
,
事件就是事
件驱动 的核心自然就是。从事件角度说
,
一个事件收集器、一个事件发送器与一
个事件处理器 组成了事件驱动程序的基本结构。
事件收集器专门负责收集包括来
五子棋游戏总体设计与实现
自硬件的
(
如时钟事件等
)< br>、来自用户的
(
如键盘、鼠标事件等
)
及来自软件的
(
如应
用程序本身、操作系统等
)
的所有事件。将收集器收集到的事件分发到目标对象
中则由事件发送器负责完成。具体的事件响应工作则由事件处理器完成
,
它需要
运用虚函数机制
(
函数名取为类似于
Handle
Msg < br>的一个名字
),
它往往要到实现
阶段才完全确定。事件处理器对于框架的使用者 来说就是她们唯一能够瞧到的。
棋类游戏通常具备两个重要特性
,
首先就是 对战双方轮流落子
,
其次就是落子间隔
通常就是不确定的
,
尤其就是 对战后期
,
可能每一步棋都要经过深思熟虑
,
无论就
是人还就是计算 机
,
都无法对时间间隔有事先的预期。基于以上两个特性
,
本游戏
摒 弃了大多数游戏采用的线程或定时器驱动游戏的方法
,
而采用了事件驱动的方
法
,
即玩家的键盘或触摸笔触发游戏的下一个动作。事件驱动大大减少了不必要
的工作量
,
只有玩家发出消息时
,
计算机才启动运算
,
而在玩家思考期间< br>,
计算机不
做任何运算与重绘操作。
4
、
2
、
3
游戏的类设计
五子棋游戏属于二维棋类游戏
,
因此可以定义一个
Chesses
类来表示棋子
,
用一个
Chess
类型的二维数组来包 含棋盘上的所有棋子
,
对于该棋子玩家的区分
使用
Chesses
的
boolean
型的变量
is Player1
来区分。
可以考虑直接生成数组的
每一个对象而不就是在数组建立后
,
而就是把每一个棋子对象
(Chesses)
放在游戏
的进行中生成
,这主要就是考虑到移动设备的资源有限
,
尽可能减少系统资源占
用。这样在游戏进 行时
,
可以避免还没有下的棋子在一开始就占用了系统内存
,
玩
家每 下一步棋
,
在数组相应位置生成该棋子的对象。
对于游戏中的每一类的设计
,
首先就就是一个
MIDlet
类
,Gobang
类继承自
MIDlet
类
,
通过方法
start
App,pause
App,destroy
App
来通知游戏的开始
,
暂停与销毁结束
,
用于连接设备的应用程序管理器
(Application Manager)
。
本游戏共由
7
个类组成
,
它们各自的功能如下
:
(1) Gobang MIDlet
类
负责程序的启动与屏幕之间的切换
;
(2) Gobang Canvas
类
玩家的对战平台
,
她继承于
Canvas
类
;
五子棋游戏总体设计与实现
(3) Setting
类
用于创建游戏的各项设置参数表单
;
(4) Gobang Logic
类
游戏的逻辑类
,
负责胜负判断与计算机落子
;
(5) Dot
类
棋子类
,
包含了棋子的位置信息
;
(6) Help
类
游戏的帮助类
,
包含五子棋的一些常识信息与五子棋教学内容
;
(7) About
类
游戏的关于类
,
包含游戏的版本、版权等信息。
各个类之间的关系如图
4-3
所示
:
图
4-3
游戏类设计
4
、
2
、
4
游戏的流程设计
对于棋盘 界面的更新
,
游戏进行绘制棋子时就是按照棋子的二维数组来完成
的
,
玩家下棋后
,
设置
is Player1
值
,
程序修改 数组相应位置
,
然后重新绘制
(repaint)
。
为了使游戏的操 作尽可能的简便
,
本文设计上不在游戏进入时设计菜单
,
玩家可以
直 接开始对战
,
而就是在开始游戏的过程中设置重新开始与退出的按钮。即一键
开始,
运行即玩
,
重来或退出都使用一键操作。
游戏流程的设计依据主要就是游戏
五子棋游戏总体设计与实现
的界面设计与游戏的类的设计。
游戏启动时
,Gobang
MIDlet
对象先显示游戏的
主屏幕
,
在屏幕下方一侧就是出软 键
(
软键指描述抽象客户端设备如何显示
),
另一
侧就是用软件构成 的菜单
,
菜单元素主要有“开局”
、
“游戏设置”
、
“游戏 帮助”
、
“关于”选项。当玩家选择“游戏设置”软键时
,
则显示游戏参数设 置表单
;
当玩
家选择“开局”软键时
,
则显示游戏对战主界面
;
当玩家选择“游戏帮助”软键时
,
则显示游戏帮助表单
;
当玩家 选择
“关于”
软键时
,
则显示游戏关于表单。
玩家进入游戏参数设置表单
,
当玩家按下“确定”软键时
,
则确认当前游戏参数
,
返回游戏
主屏幕
;
当玩家按下“取消”软键时
,
则放弃此次对游戏的修改
,
直接返回游戏主屏
幕。
玩家进入游戏对 战画布
,
对战中画布有两个软键
,
当玩家按下“返回主菜单”
软键时
,
则退出游戏到达游戏主菜单
;
当玩家按下
“悔棋”
软键时
,
则进行悔棋操作
;
当游戏结束时
,
“悔棋”软键被换成了 “重玩”软键。
玩家进入游戏介绍表单
,
当玩家按下“确定”软键时
,
返回游戏主屏幕。
4
、
2
、
5
游戏算法的设计
1
、五子棋的获胜组合
有哪些获胜组合 就是在一场五子棋的游戏中计算机必须要知道的
,
因此
,
获胜
组合的 总数必须要求得。在本文中我们假定当前的棋盘为
15*15:
(1)
每一列的获胜 组合就是
11,
共
15
列
,
计算水平方向的获胜组合数,
所以水平
方向的获胜组合数为
:11*15=165
。
(2)
每一行的获胜组合就是
11,
共
15
列
,
则可计算垂直方向的获胜组合总数
,
垂
直方向的获胜组合数为
:11*15 =165
。
(3)
同理
,
可计算正对角线方向的获胜组合 总数
,
正对角线上的获胜组合总数
为
11+(10+9+8+7+6+5+4 +3+2+1)*2=121
。
(4)
计算反对角线上的获胜组合总数。计 算反对角线方向的获胜组合总数可
计算为
11+(10+9+8+7+6+5+4+3+2+1 )*2=121
。这样可计算得所有的获胜组合数
为
:165+165+121+12 1=572
。
2
、设计获胜棋型
通过上面的计算
,
一个
15*15
的屋子棋盘在此已经计算出了会有
572
中获胜
方式
,
因此
,
我们就可以利用数组建立一些常规棋型
,棋型的主要作用就是
:
五子棋游戏总体设计与实现
(1)
判断就是否有任何一方获胜
;
(2)
根据当前格局判断最可能的落子方式。
然而在现实中
,高手留给我们的经验就就是把握前奏
,
如“冲四”
、
“活三”
,
除了“连五”以外
,
这些也就是同向胜利的捷径。
3
、攻击与防守
获胜棋型的算法就是中性的
,
不区分计算 机与玩家
,
这就涉及到攻击与防守何
者优先的问题。而许多高手都认为五子棋的根本就 是“防守”
,
“攻击”就是灵
魂。进攻就是取胜的手段
,
就是防守的 延续与发展。许多经验与研究表明
,
一个棋
手只要掌握了全面的、基本的防守原理与技 巧
,
就能与比自己棋力高一个等级的
进攻型选手对抗
,
起码能立于不 败之地。对手进过越偏激
,
则防守的效果越好。没
有进攻的防守就像只开花不结果,
没有实际意义
,
顽强的防守就是反攻的前奏
,
没
有进 攻的延续
,
防守也失去了价值。而这缺一不可。根据以上原理
,
计算机在接受
最佳的攻击位置之前
,
还要计算当前玩家的最佳攻击位置。如果玩家存在最佳攻
击位置
,
那么计算机就将下一步的棋子摆在玩家的最佳攻击位置上以阻止玩家的
进攻
,
否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。
4
、用到的典型算法
(1)
坐标变换算法
游戏 的实质其实就是对所下棋子的位置进行操作与判断
,
因此将己方、对方
以及棋盘上空点 的位置坐标存储在相应的
List
中。
我对所下棋子的坐标进行了处
理
,
因为我所采用的棋盘为
15*15,
所以棋子横坐标为
0
到14
的整数
,
纵坐标也为
0
到
14
的整数。因 此
,
每次在棋盘上下子之后
,
计算机在存储该点的坐标时
,
便要对
坐标进行加工。假设左上角点为
firstPoint,
它的实际坐标为
(x1,y1),
而我就是将它
作为
(0,0)
存储的
,
其它的坐标
,
其它点都就是以该点为标准进行变换的
,
假设棋盘
上< br>每
个
格
子
的
宽
度
为
w,
某
实
际
点
为
(x2,y2),
变
换
后
的
坐
标
为
(x,y),x=(x2-x1)/w,y=(y2-y1)/w
。
(2)
胜负判断算法
胜负判断的规则很简单
,
就就是判断游戏双方的棋子在同一条水平线、同一
条竖线或就是同一条斜线上谁先出现
5
个连续的棋子
,
谁先达到这样的目标
,
谁就
获得胜利。 在本设计中
,
就是在每次下完一个子后进行判断
,
瞧己方就是否达到了
五子棋游戏总体设计与实现
胜利的标准
,
若胜利游戏便结束< br>;
否则
,
游戏继续。
(3)
人工智能算法
人工智能算法的主体思想分为以下三个步骤
:
第一步
:
根据双方的 当前的形势循环地假设性的分别给自己与对方下一子
(
在
某个范围内下子
),
并判断此棋子能带来的形势上的变化
,
如能不能冲
4,
能不能形成我方或敌方双
3
等。
第二步
:
根据上一步结果,
组合每一步棋子所带来的所有结果
(
如某一步棋子
可能形成我方
1
个活
3,1
个冲
4(
我叫它半活
4)
等
),
包括敌方与我方的。
第三步
:
根据用户给的规则对上一步结 果进行排序
,
并选子
(
有进攻形、
防守形
规则
)< br>。
5
、典型类的具体设计
(1)
应用程序类
Gobang
类用于连接设备的应用程序管理器
(Application
Manager),Gobang
类继承自
MIDlet
类
,
通过
Gobang
类的方法
start App,pause App,destroy App
来
通知游戏的开始
,
暂停与销毁结束。源代码如下
:
package com
、
occo
、
j2me
、
game
、
gobang;
import javax
、
microedition
、
lcdui
、
Display;
import javax
、
microedition
、
midl et
、
MIDlet;public class Gobang extends MIDlet
//
定义游戏界面的
Canvas
类
Gobang Canvas
的对象
Gobang public
{ Gobang Canvas gobang;
Gobang() {
super();
gobang=new Gobang Canvas(this);//
生成
Gobang Canvas
类的对象
gobang
} protected void start App(){
Display
、
get Display(this)
、
set Current(gobang);
} protected void pause App(){
} protected void destroy App(boolean arg0){
}} //
在屏幕上绘出游戏见面
gobang
(2)
游戏界面类
五子棋游戏总体设计与实现
Gobang
Canvas
类继承自
Canvas,
游戏的核心类就是
Gobang
Canvas
类
,
此
类将完成游戏的绘图、互动、控制、逻辑、等所有功能
,此类的框架代码如下
:
Package com
、
occo
、
j2me
、
game
、
gobang;
import javax
、
microedition
、
lcdu i
、
Displayable;
import javax
、< br>microedition
、
lcdui
、
Command;
import javax
、
microedition
、
lcdui
、
Canvas;
import javax
、< br>microedition
、
lcdui
、
Command Listener;
public Gobang Canvas(Gobang gobang){
this
、
gobang=gobang;
}
protected void paint(Graphics g) {
}
import
javax
、
microedition
、
lcdui
、
Graphics;public
class
Gobang
Canvas
extends
Canvas
implements
Command
Listener{protected
Gobang
gobang;
public Gobang Canvas(){
}
}
(3)
棋子类
整个棋盘就是一个
Chesses
类型的二维数组
,
棋盘上的每一个棋子都对应着
一个
Chesses
的对象
,
此类定义了一个棋子
,
源代码如下
:
package com
、
occo
、
j2me
、
game
、
gobang;
public Chesses() {
}
public class Chesses {boolean is Player1;
public Chesses(boolean is Player1) {
this
、
is Player1=is Player1;
}}
4
、
3
游戏实现
4
、
3
、
1
主类的实现
YpkWuZiQiActivity
类就是五子棋游戏的主类
,
同时也就是五子棋游戏的入口
,