好,下面我们来看一个应用示例。
这就是一个简单的排块游戏,这个游戏呢实际上就是我们这个样的界面,
它里面呢有好多方块,这个方块呢 就有点儿像拼图一样,我们可以移动,那中间有一个空的地方,
我们可以把它移动,最后直到还原到最开始 1 2 3 4 5
6 7 8等等这样的。所以这个游戏呢是一个
简单的排块游戏。我们先来看看这个效果,在这里面呢 一共有 15
个小方块,这是初始状态,那么 这里有一个空的位置,开始游戏的时候呢这个顺序就乱了,就是
其中有一个是空的,然后我们在这个空的旁边一点击,那么它就跟空的
相交换,实际上表面上就是这个东西移动到这个空的位置来,然后我们
在这样一个点击交换的过程当中呢,最终使得这个 排到最开始的
1 2 3 4 5 6 7 8 等等,这个就算完成。
我们下面看看这个代码怎么来写。
当然程序里面核心的,程序里面最核心的就是这些
变量,所以我们这里有一些常量和变量,比如说这里行列数,然后整个方块的数,
以及呢这里面有一个核心的就是 整数数组。我们界面只是用来显示这些
整数的,所以它其实本质的东西还是这里面的这个数组,用于记录上 每个按钮上的数字减
1,因为计算机里边我们习惯是从 0 开始的, 那界面上我们从
1 开始。当然从界面的元素来说,确实也有一些按钮的数组以及
有一个启动按钮。好,我们下面来看看这个程序代码。在 这里面有一个界面上呢,我们前面,上面
有一个面板,下面有一个面板, 这两个面板分别用于
放上我们前面的这些按钮。底下这个面板呢,就 p2
呢用于 放这个 btnStart 启动开始这个按钮,上面这个面板呢是用
GridLayout, GridLayout,这个 Grid,整个是用 GridLayout,然后上面这个
我们又放了很多的这些按钮。
整个面板用 BorderLayout,
把这些按钮都加上去,这是布局方面的事情。那具体这个代码呢你可能还得仔细看一下。
我们下面主要解释一下这个程序的逻辑方面。这个逻辑上面呢, 这里面按钮加了一个
ActionListener,然后呢 这个就是 btnStart
Click 又怎么样,那么对于那些方块的这些按钮呢, 我们加的
ActionListener 是什么呢?它首先去循环地去找,
这个找呢,看看当前这个按钮 getSource,就是当前
这个事件发生的时候,这个按钮呢它是跟哪一个按钮相等的,也就是我们要去 找到这个按钮的下标,这里叫
j,然后再去调 btn Click 这个方法,也就是说我们核心的逻辑就是,一个是 btnStart
就是启动的时候开始要做什么, 然后呢每一个按钮点击了要做什么,所以这两个方法是核心的
逻辑。那么启动的按钮我们来看一下,启动的按钮其实就是
打乱顺序,那么打乱顺序我们怎么办呢?我们多次找到两个数,随机的找两个数, 这个随机的从
1 到 N 之间,找两个数,这两个数呢然后
我们把这两个数字进行交换。这样的话也就像洗牌一样,随便找两张牌交换一下,
又随便找两张牌交换一下,这样我们交换很多次就打乱顺序了,这个就是打乱顺序。
那么下一步我们来显示,因为打乱顺序以后要重新显示了,
这个显示呢我们是把这个数组里面的数字加 1
显示到这个按钮上,同时这个按钮呢的 visible 置为 true。
但是呢有一个按钮,也就是最后那个按钮呢,我们必须把它 变为空,所以为了找到最后那个按钮,我们用一个
findBlank, 查找空这个按钮。所谓空的按钮就是数字等于最后那一个数的那个
按钮,再把它 visible 置为 false,这样的话使得它总有一个是空的。
好,我们下面再看看 findBlank 这个函数。
请大家注意呢程序里面最核心的就是,一个是
核心的这个数组,就是变量,另一个呢就是函数。
那我们要多写函数,尽量多写函数,比如这个 findBlank,我们又写一个函数。
这个函数是从第 0 个到最后一个,0 到 N 去找,如果这个数, 这个数组上面的数字等于 N 减
1,也就是等于最后那个按钮的话, 我们就找到了,就
return 这个找到的这个 i,所以在这里面我们是查找哪一个
为空,这样一个程序。我们下面再看,这是交换顺序了, 就开始,那么最核心的就是
btn 某一个按钮。比如说某一个数字 这个方块按了就怎么办,我们刚才已经把这个下标找到了以后呢,
我们下面再看,那为了每一个按钮点击了,我们要做的事情就是如果这个按钮
跟那个空按钮相交换,所以我们首先又要找到现在的空按钮在哪儿,findBlank。
找到以后要判断,这个空按钮跟我们当前的这个 index,当前的几个按钮
要相邻,isNeighbor 是相邻的话, 我们就怎么呢,就交换,交换包括这个
visible 的交换, 然后还有这个数字相交换,还有呢这个文本
又要重新显示,交换完了所以要做一系列的事情。
那这个数字交换,文本的交换,可视化的交换,还有呢 我们最好把当前开始点的那个按钮啊,
它的 requestFocus,这样使得那个焦点呢移到那个按钮上, 以使得它呢,用户能看清。
同时我们每点一次按钮呢,还要做一件事情,检查这个
result,就是查找它是不是已经完成了。这个是否完成了 相对也比较简单,它就是说从第
0 个到最后一个,我们看看 这个数字,这个数字和我们那个顺序是不是相等的。
如果相等那就可以了,如果不等那我们什么事情也不干,那么相等呢我们就用另外 一个
OptionPane.showMessageDialog,显示一个消息框。
这个 JOptionPane 也是很常用的一个
使用工具类,它里面有个显示一个信息 这个方法。所以这个程序里面我们注意这个
按钮的数组,然后按钮的生成、加入 和事件,也就是创建对象,
然后呢设定布局并加入,然后处理事件,这是我们
面向对象,这个图形化的这个界面最常做的几件事情。同时呢我们一定注意这个程序
里面的数据和函数的书写,当然尽量也有 注释,所以呢为了不同的同学看得方便,
我有一个中文的注释,还有一个把这个中文注释把它生成一个 utf8 的文件。
所以也可以去把这个例子打开,看一看。那为什么我喜欢编这个
程序呢?这个程序呢是有一个故事啊,我用很多语言都编了这样的一个程序,
不下十种语言。因为这是我上大学的时候, 我很喜欢看中学生数理化,我有一次看见呢
一个数学家,大数学家陈景润,那是我们以前的偶像了,
他就写了一篇文章,叫做十五子游戏,你看这不是十五个子吗?所以我当时很
惊讶,这个大数学家写这样一篇文章给中学生,所以也觉得很亲切。
当然他研究的是什么样的情况是可以完成的, 什么样的情况是不可以完成的。所以这里面在交换的时候啊,
它有一个奇偶性保持不变,所以就可以证明什么样
的是可以完成,什么样不可以完成。你还可以从网上找到这篇文章。
希望大家能够享受这样一个小的游戏程序。