没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
第 1 章 控制台五子棋
第 1 章 控制台五子棋
1.1 引言
控制台五子棋,顾名思义,就是在 Java 控制台运行的五子棋游戏,需要用户用键盘输入棋子的位
置来进行游戏。
由于是在控制台下面运行的程序,所以并没有漂亮的游戏界面,与及鼠标操作等东西,只是在一片
黑色控制台环境下进行游戏,游戏的可玩性并不高,似乎这并不是一个完整的游戏。虽然如此,但事实
上,一个程序最重要的并不是界面,而是处理各种业务逻辑与数据的方法,只要掌握了核心的方法,掌
握基础的知识,便更容易学习 awt,swing 等图形用户界面的编写,万变不离其宗,写起有操作界面的程
序也会变得更加容易,更加随心应手。而本章的主要目的让读者掌握与理解 Java 编程的基础知识,因
此,掌握本章五子棋的实现原理,对于学习以后的章节将会非常有帮助。作为本书的第一章内容,我们
在本章中将使用最简单的方式来实现一个控制台五子棋游戏。
1.1.1 五子棋介绍
五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠” ,英译为”Renju”,
英文称之为”Gobang”或”FIR”(Five in a Row 的缩写 ) ,亦有“连五子”、“五子连” 、“串珠”、“五
目”、 “五目碰”、“五格”等多种称谓。五子棋游戏是一个比较大众的棋类游戏,大多数人都会玩这个
游戏,五子棋的玩法与规则如下:
五子棋是两个人之间进行的竞技活动,由于对黑方白方规则不同,黑棋必须先行(本章节设计
的游戏,黑棋与白棋的规则一样,但一样由黑棋先下)。
五子棋专用盘为 15×15 ,五连子的方向为横、竖、斜。
在棋盘上以对局双方均不可能形成五连为和棋。
首先形成五连子的一方为赢。
五子棋必须由双方进行游戏,当某一方按照一定规则连成五个棋子的时候,该游戏方就胜利,在本
章中,我们并不需要做到对战形式的,我们可以设计一个简单的“电脑”来做我们的对手,当我们下完
棋后,这个简单的“电脑”就随便在棋盘中下一个棋,当然,如果想做更强大的“电脑”我们可以编写
程序来实现,当我们下棋的时候,这个“电脑”就对我们所下的棋子进行检测,并将棋子下到最恰当的
位置。本章主要目的是展现五子棋的实现原理,如果读者有兴趣,可以自行开发强大的“人工智能电脑”
来进行游戏。
1.1.2 输入输出约定
玩家必须以(x,y)的方式输入棋盘的坐标,其中,x 代表棋坐标,y 代表竖坐标。x 与 y 的值必须
是 1 到 N(棋盘的大小)的正数。
系统询问玩家是否继续游戏时,玩家输入 y 是代表继续,输入其它则代表退出游戏。
“●”代表黑子,“○”代表白子。当玩家以(x,y)的形式输入下棋的坐标后,游戏中就可以根据
玩家所下的坐标,再去将棋子放置到棋盘中。我们可以将棋盘看作一个二维数组,填充着棋盘式的标志
(“十”),玩家下棋后,将棋子替换原来的标志,最后再执行输入。由于本章是在控制台中进行打印,
因此只需要使用 System.out.println 来进行打印即可,如果需要实现有界面的五子棋游戏,例如使用
尔演の天空-www.eryansky.com
第 1 章 控制台五子棋
·2·
swing 或者 awt,可以使用相应的方法,将二维数组“画”到界面中。因此,不管是使用 swing、awt
或者其他界面技术,五子棋的实现原理几乎大同小异。
1.2 了解游戏流程描述
在开发五子棋之前,我们先了解一下游戏的整个游戏流程,了解游戏的流程,有助于我们在开发的
过程中可以清晰的掌握程序结构,对于实现功能有莫大的帮助,五子棋的具体流程如图 1.1 所示。
图 1.1 五子棋游戏流程
1.2.1 玩家输入坐标
游戏开始,系统在控制台中打印出棋盘,玩家根据这个棋盘,选定下棋的位置坐标后,在控制台中
输入相应的坐标,系统读取玩家所输入的坐标并进行相应的分析,如果玩家所下的棋使得玩家游戏胜利,
则系统询问是否继续游戏。
系统读取了玩家输入的坐标后,除了判断游戏是否胜利外,还需要判断玩家输入的坐标中是否已经
存在了相应的棋子,如果存在的话,需要再次提示玩家,重新输入。
第 1 章 控制台五子棋
·3·
1.2.2 “电脑”下棋
玩家输入了坐标,系统判断玩家没有游戏胜利后,就应该轮到“电脑”下棋,在本章的开头中我们
已经讲到,本章可以实现一个简单的电脑来进行游戏,只需要随便的产生棋盘坐标,就可以让“电脑”
在相应的坐标中下棋。如果电脑随机产生的坐标中已经存在棋子,那么我们可以重新随机产生坐标,直
到产生的坐标上没有存在棋子为止。当“电脑”下完棋后,就可以使用同样的判断方式(判断是否五子
相连)来判断“电脑”所下的棋子是否已经使得游戏胜利,如果游戏胜利,同样地去提示玩家,电脑已
经胜利了。
在本章我们并不需要实现强大的人工智能“电脑”,只需要简单的随机产生坐标即可。
1.3 创建游戏的各个对象
这里设计三个类来完成游戏的功能,棋盘类(Chessboard),游戏类(GobangGame)与棋子类
(Chessman)(枚举类),类的关系如图 1.2 所示,从图中可以看出,Chessboard 依赖于 GobangGame,
gobangGame 的改变,会影响到 Chessboard 状态的改变,而 Chessman 与 GobangGame 是一个聚合
关系。下面一一介绍。
图 1.2 五子棋类图
第 1 章 控制台五子棋
·4·
1.3.1 Chessboard类
要进行五子棋游戏,必须有有一个棋盘,而这个类主要控制棋盘的初始化,输出与及增加新的棋子。
这个类包含以下方法:
void initBoard(),这个方法用于初始化棋盘,开始新的游戏时,应该调用此方法,初始化出一
个新的空棋盘。
void printBoard(),此方法用于在控制台输出棋盘,各方每一完一颗棋子后,由于棋盘上棋子的
状态有改变,所以必须调用此方法重新输入棋盘。
void setBoard( int posX , int posY , String chessman ),posX 与 posY 是新下棋子的 x 与 y 坐
标,,chessman 是新下棋子的类型(黑子与白子),每下完一颗棋子后,通过调用此方法把棋
子设置到棋盘上。
String[][] getBoard(),返回棋盘,返回类型是保存棋盘的二维数组。
当我们需要初始化棋盘的时候,可以直接调用 Chessboard 的 initBoard 方法,我们需要考虑该方
法需要实现的功能:初始化棋盘。由于我们将棋盘看作是一个二维数组,因此 initBoard 就需要帮我们
去创建一个二维数组,创建二维数组可以使用以下代码。
代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.java
Object[][] array = new Object[size][size];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = new Object();
}
}
以上代码创建一个固定大小(一维与二维大小)的二维数组,再通过嵌套循环为数组中的每一个元
素进行赋值。在游戏中如果我们进行了下棋的操作,可以直接改变这个数组的某一个元素值。在创建
Chessboard 类时,我们就需要发挥面向对象的思维,在我们的程序中,所有看到的或者想的事物,我
们都可以将其抽象成具体的某个对象,并赋予一定的属性与行为。在设计对象的过程中,如果有某些事
物拿捏不准,不知如何设计属性或者行为,可以将其设计成接口或者抽象类。
Chessboard 中提供了一个 printBoard 的方法用于打印棋盘,在本章中,我们就需要将棋盘数组打
印到控制台中,因此该方法可以简单的调用 System.out.print 去打印相关的字符串。需要注意的是,由
于 printBoard 方法是没有参数的,因此我们需要为 Chessboard 提供一个二维数组变量,当调用
printBoard 方法的时候,将对象内的二维数组打印,我们可以将 Chessboard 看作一个有状态的 Java
对象,有状态的 Java 对象可以理解成一个 Java 对象保存一些与该对象相关的状态属性,如果该对象没
有保存与该对象相关的状态属性,那么我们可以将这个对象看成一个无状态的 Java 对象。
当外部调用 Chessboard 的 setBoard 方法时,就可以将某个值设置到 Chessboard 中的二维数组里,
告诉 Chessboard 玩家或者“电脑”在某个位置下了怎样的棋子。
1.3.2 Chessman类
Chessman 类是一个枚举类,此类是构造器私有的,不能直接创建,里面有 BLACK 与 WHITE 两
个静态属性,代表黑子与白子枚举类,两个表态属性都是 Chessman 类型的,要获取棋子,则通过这两
个属性调用以下的方法获取棋子:
String getChessman(),返回 String 类型的棋子实例,“●”或者“○”。
如果我们需要得到棋子的字符串(“●”或者“○”),可以使用以下的代码。
代码清单:code\gobang\src\org\crazyit\gobang\Chessman.java
Chessman.BLACK.getChessman();
第 1 章 控制台五子棋
·5·
1.3.3 GobangGame类
GobangGame 类是进行游戏的类,Chessboard 依赖于此类,此类控制游戏的开始,重玩与结束,
并影响 Chessboard 类。主要包含以下构造器与方法:
GobangGame(),默认无参数构造器。
GobangGame( Chessboard chessboard ),有参数构造器,以一个 Chessboard 实例去初始化
这个类。
boolean isValid( String inputStr ),此方法验证控制台的输入字符串是否合法,如果合法,返回
true,如果不合法,则返回 false,此方法抛出 Exception 异常。
void start(),开始游戏。此方法抛出 Exception 异常。
boolean isReplay( String chessman ),是否重新开始游戏,如果是,返回 true,否则返回 false,
参数 chessman 代表黑子或白子。
int[] computerDo(),计算机随机下棋,由计算机自动设置棋盘,并返回包含新下棋子位置 x 与
y 坐标的 int[]数组类型。
boolean isWon( int posX , int posY , String ico ),判断输赢,参数 posX 与 posY 代表新下棋子
的 x 与 y 坐标,ico 代表新下的棋子类型,如果赢了,返回 true,否则返回 false。
GobangGame 是我们五子棋游戏的主体类,游戏里面所有的处理都在该类中实现。GobangGame
中的 isValid 方法用于验证控制台的输入,玩家主要在控制台输入下棋的坐标,下棋的坐标的字符串形
式为:x,y,我们需要对字符串进行处理得到 x和 y的值,如果玩家输入的字符串不符合系统要求,则 isValid
方法返回 false,只有当该方法返回 true 的时候,才会去修改 Chessboard 的二维数组。
GobangGame
中提供了一个 st
art 方法,用于游戏的开始,我们需要考虑游戏开始的行为,例如需
要初始化棋盘(调用 Chessboard 的 init 方法),需要开始从控制台读取玩家的输入信息、打印棋盘,验
证控制台输入的信息等,这些功能我们将在下面的章节中加以描述。
当轮到“电脑”下棋的时候,我们需要随机生成电脑的下棋坐标,GobangGame 中的 computerDo
方法用于随机产生坐标。
判断一局游戏是否胜利,可以调用 GobangGame 的 isWon 方法,该方法判断游戏是否胜利,是五
子棋中最主要的方法,五子棋是否可以相连的所有逻辑,都会在该方法中实现。isWon 方法会在每次下
棋后(玩家下棋或者“电脑”下棋)调用。
到此,游戏中的三个对象已经设计完成,这三个对象中已经定义好了各种方法,并在前面章节中详
细描述了各个方法的作用,在下面章节中我们将开始对这三个对象所定义的方法进行实现。当然,如果
需要做到更好的程序解耦,我们可以使用一些设计模式,例如将游戏规则写成一个具体的算法,可以使
用策略模式,如果需要产生出不同的棋子(将控制台换成其他界面),可以编写棋子工厂等。但是本章
主要目的是展现一个最简单的五子棋,因此本章中并不涉及任何具体的设计模式。
1.4 棋盘类实现
在此类中,主要是用一个 String[][]类型的二维数组 board 去保存棋盘,board [i][j]代表棋盘的某个
位置(i 代表 x 坐标,j 代表 y 坐标),如果此位置没有棋子,默认值为“十”,如果有棋子,board [i][j]的
值为“●”或者“○”。用一个不可改变的常量 BOARD_SIZE 来表示棋盘的大小,所以保存这个棋盘
的是一个 BOARD_SIZE*BOARD_SIZE 的二维数组。图 1.3 描述了为什么需要使用一个二维数组来代
表一个棋盘,如果把棋盘的一列当做一个数组,那么 N 列的棋盘就是一个二维数组,用数组能很好的存
储与表现这个棋盘。
剩余482页未读,继续阅读
Mr-Wanter
- 粉丝: 2818
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0