第四章:在小世界中玩井字棋

需求分析


井字棋是我家第一台无线电视上自带的游戏。我觉得它是世界上最简单的棋类游戏。因为它的棋盘就是一个3x3的九宫格子,其规则是两名玩家各执一种棋子在棋盘上轮流放置棋子,首先三子连珠的玩家即可获胜。比五子棋还要简单!

第四章:在小世界中玩井字棋_第1张图片
井字棋

为此,我打算:

 ▪    画一张3x3的棋盘,一枚“O”型棋子,一枚“X”型棋子。

 ▪    棋盘居中显示在SimpeApplication的GUI界面上

 ▪    使用Property记录当前玩家:1表示当前持“O”型棋子的玩家正在思考;2表示当前持“X”型棋子的玩家正在思考

 ▪    使用ListProperty记录棋盘状态:0表示没有棋子;1表示棋子为“O”;2表示棋子为“X”

 ▪    按下数字小键盘上的Num1到Num9,表示当前玩家打算在相应位置上放置棋子。如果该位置没有棋子的话,修改棋盘状态数据和当前玩家数据

 ▪    属性监听器监听到棋盘状态数据变化后,会更新GUI界面上的棋子

 ▪    (选做)按下数字小键盘上的Num0清除棋盘状态数据并将当前玩家数据设置为1:持“O”型棋子的玩家正在思考

 ▪    (选做)判断当前玩家是否胜利,如果胜利则画一条线


绘制素材并居中显示棋盘


程序员的工作不是精心设计美术资源,因此不要在这方面浪费太多的时间。这是我用windows画图工具绘制的素材(提取码:keap)

由于这一章我们要做的事情十分简单,因此我打算把代码统统放进一个类里面。我们给这个类起一个名字叫作Game,然后继承SimpleApplication。然后在main()方法中加载Game:

第四章:在小世界中玩井字棋_第2张图片
SimpleApplication程序

然后我们把素材放到resources文件夹目录下:

第四章:在小世界中玩井字棋_第3张图片
把素材放进resources目录下

创建并显示棋盘:

第四章:在小世界中玩井字棋_第4张图片
添加棋盘组件

如果一切OK,那么现在运行程序后你可以看到:

第四章:在小世界中玩井字棋_第5张图片
居中并显示棋盘效果


InputManager


现在我们在Game类中添加两个成员变量:player(当前玩家)和gridBoardState(棋盘状态)

第四章:在小世界中玩井字棋_第6张图片
添加成员变量

可以看到我已经给player赋予了初始值:1,给gridBoardState赋予了初始值:九个0(因为3x3格子总共有9个格子)。

为了和小世界交互,我们必须用到com.jarlure.ui.system.InputManager(静态输入管理器)这个类。一定要注意这个不是jME3提供的输入管理器,而是UI框架提供的。InputManager的用法跟AssetManager(静态资源管理器)一样,也要进行初始化:

第四章:在小世界中玩井字棋_第7张图片
初始化静态输入管理器

我们创建一个键盘输入监听器(KeyInputListener)并把它注册进输入管理器中:

第四章:在小世界中玩井字棋_第8张图片
添加键盘输入监听器

编写一个检查当前是否有棋子并更新棋盘状态的方法,让键盘输入监听器调用:

第四章:在小世界中玩井字棋_第9张图片
检查并更新棋盘状态的方法
第四章:在小世界中玩井字棋_第10张图片
让键盘监听器调用该方法


棋子的动态创建与显示更新


我们先在Game类中添加两个成员变量:

第四章:在小世界中玩井字棋_第11张图片
添加两个成员变量

我准备把这两个组件当作原件,以后在棋盘上放置的都是它们的复制品。名称叫作“xxxJar”是因为我觉得这两个组件更像是两个放棋子的碗:

第四章:在小世界中玩井字棋_第12张图片
放围棋用的碗


创建“O”型棋子与“X”型棋子原件:

第四章:在小世界中玩井字棋_第13张图片
创建棋子原件

我们给gridBoardState(棋盘状态)添加一个监听器来监听棋盘状态的变化:

第四章:在小世界中玩井字棋_第14张图片
添加监听器

编写一个放置棋子的方法:

第四章:在小世界中玩井字棋_第15张图片
放置棋子方法

这里由于我们用到了棋盘组件,因此需要把gridBoard从局部变量变为类成员变量:

第四章:在小世界中玩井字棋_第16张图片
局部变量改为成员变量

现在我们把放置棋子的方法添加到监听器中:

第四章:在小世界中玩井字棋_第17张图片
把方法添加到监听器中

让我测试一下效果。如果一切正常,那么运行程序后,按下数字小键盘上的Num1到Num9,就会放置棋子:

第四章:在小世界中玩井字棋_第18张图片
效果展示


胜负判断与重新开始


你应该已经掌握了要领:无非是监听数据变化与执行方法。我希望你能举一反三,自己独立实现剩下的逻辑。然后你可以通过对比我写的完整代码(提取码:keap)修改和完善这个小游戏。祝你成功!

你可能感兴趣的:(第四章:在小世界中玩井字棋)