需求分析
井字棋是我家第一台无线电视上自带的游戏。我觉得它是世界上最简单的棋类游戏。因为它的棋盘就是一个3x3的九宫格子,其规则是两名玩家各执一种棋子在棋盘上轮流放置棋子,首先三子连珠的玩家即可获胜。比五子棋还要简单!
为此,我打算:
▪ 画一张3x3的棋盘,一枚“O”型棋子,一枚“X”型棋子。
▪ 棋盘居中显示在SimpeApplication的GUI界面上
▪ 使用Property
▪ 使用ListProperty
▪ 按下数字小键盘上的Num1到Num9,表示当前玩家打算在相应位置上放置棋子。如果该位置没有棋子的话,修改棋盘状态数据和当前玩家数据
▪ 属性监听器监听到棋盘状态数据变化后,会更新GUI界面上的棋子
▪ (选做)按下数字小键盘上的Num0清除棋盘状态数据并将当前玩家数据设置为1:持“O”型棋子的玩家正在思考
▪ (选做)判断当前玩家是否胜利,如果胜利则画一条线
绘制素材并居中显示棋盘
程序员的工作不是精心设计美术资源,因此不要在这方面浪费太多的时间。这是我用windows画图工具绘制的素材(提取码:keap)
由于这一章我们要做的事情十分简单,因此我打算把代码统统放进一个类里面。我们给这个类起一个名字叫作Game,然后继承SimpleApplication。然后在main()方法中加载Game:
然后我们把素材放到resources文件夹目录下:
创建并显示棋盘:
如果一切OK,那么现在运行程序后你可以看到:
InputManager
现在我们在Game类中添加两个成员变量:player(当前玩家)和gridBoardState(棋盘状态)
可以看到我已经给player赋予了初始值:1,给gridBoardState赋予了初始值:九个0(因为3x3格子总共有9个格子)。
为了和小世界交互,我们必须用到com.jarlure.ui.system.InputManager(静态输入管理器)这个类。一定要注意这个不是jME3提供的输入管理器,而是UI框架提供的。InputManager的用法跟AssetManager(静态资源管理器)一样,也要进行初始化:
我们创建一个键盘输入监听器(KeyInputListener)并把它注册进输入管理器中:
编写一个检查当前是否有棋子并更新棋盘状态的方法,让键盘输入监听器调用:
棋子的动态创建与显示更新
我们先在Game类中添加两个成员变量:
我准备把这两个组件当作原件,以后在棋盘上放置的都是它们的复制品。名称叫作“xxxJar”是因为我觉得这两个组件更像是两个放棋子的碗:
创建“O”型棋子与“X”型棋子原件:
我们给gridBoardState(棋盘状态)添加一个监听器来监听棋盘状态的变化:
编写一个放置棋子的方法:
这里由于我们用到了棋盘组件,因此需要把gridBoard从局部变量变为类成员变量:
现在我们把放置棋子的方法添加到监听器中:
让我测试一下效果。如果一切正常,那么运行程序后,按下数字小键盘上的Num1到Num9,就会放置棋子:
胜负判断与重新开始
你应该已经掌握了要领:无非是监听数据变化与执行方法。我希望你能举一反三,自己独立实现剩下的逻辑。然后你可以通过对比我写的完整代码(提取码:keap)修改和完善这个小游戏。祝你成功!