欢迎光临散文网 会员登陆 & 注册

石头迷阵小游戏

2023-09-08 18:37 作者:爪哇岛江户川  | 我要投稿

/*代码及运行截图在最后面*/

素材链接:https://pan.baidu.com/s/1BrmD6VSJ0Yh7LkLklaoNfg?pwd=dk71

提取码:dk71

链接:https://pan.baidu.com/s/130i3OTJwGTyTNJalk2hHpA?pwd=2sjg

提取码:2sjg

一、思路

1、我们要做的第一步就是先完成窗体的创建,new一个新的窗体对象然后去设置它的参数。

2、创建完窗体之后,我们就可以添加我们需要的图片了。在创建图片的时候,首先我们要想到,必须收拾好了再出门,也就是添加图片这些代码必须在设置窗体可见之前。

我们按照规律,先将16张图片加入面板,再将背景图片加入面板,因为最先添加的在上层。

然后我们先试着运行一下我们的代码,看看图片是否添加成功。

3、我们使用的窗体是Java中本身就写好的JFrame,它里面的功能早就已经被定义好了,我们如果想要加点其他的功能,我们没有办法去修改Java的源代码。现在我们既想使用窗体的功能,又想加入新的功能,该怎么办?

答案就是——继承

我们只需要自己去编写一个类,让它去继承JFrame这个类,我们就可以使用JFrame这个类中的所有功能,又可以添加自己想要的功能。

所以我们在这里新建一个类。

我们在子类中添加两个方法,一个是初始化窗体、一个是绘制界面,然后将我们的代码放进来。

注意:我们这里将代码直接复制进来会报错

首先对于数组的报错,是因为作用域的原因,我们只需要将二维数组放在方法外面。

然后窗体对象名的报错,也是因为作用域的原因,但是!!!我们使用窗体对象的目的是为了调用getContentPane( )这个方法,而这个方法是来自于JFrame类,我们这个类是继承于JFrame这个类,我们可以用super.去调用,但是!!!我们之前学过,如果子类没有重写父类的方法,这个super.可以省略,所以我们直接不写。

那么我们之前创建窗体对象的部分也可以直接省略不写。

4、我们再来思考一个很重要的东西,这两个方法什么时候被执行呢?

答案是创建窗体对象的时候,我们知道有一种方法,在创建对象的时候会被执行——构造方法。

所以,我们在构造方法中调用这两个方法。

注意:设置窗体可见必须在游戏界面绘制完成后再执行(收拾好了再出门!)

所以现在,只要我们一创建对象,构造方法就会执行,就会初始化窗体,绘制游戏界面。

我们在主方法中试着创建对象:

运行结果:

现在我们如果想要添加自己的功能,只需要在JFrame的子类中创建方法,然后在构造方法中调用就可以。

5、图片顺序打乱。

我们要打乱石头方块其实就是要改变二维数组里的内容,我们可以遍历这个二维数组,然后将元素做随机交换。

我们将打乱图片顺序抽取成一个方法,然后在构造方法里面调用它,注意,他应该在绘制界面的前一步。然后我们再次运行代码。

6、移动窗体模块

<1>我们要为窗体注册键盘监听,并区分出上下左右,谁被摁了。

我们之前调用监听,都是利用窗体对象.的形式,但是现在我们没有窗体对象了我们怎么调用?

我们的子类继承于JFrame,子类就是我们正在用的窗体,子类的对象呢?在测试类这一块去new的,我们在子类中怎么能拿到呢?我们之前学过一个关键字,代表的是当前类的对象——this。我们可以直接用this.的形式去调用。

这里需要我们去给一个参数,掉addKeyListener( )方法时,参数要的是一个接口,我们应该传入的是一个实现类对象。所以摆在我们面前有两种选择,要么单独写一个类,要么给一个匿名内部类。

我们之前学过,一个类在继承类的同时,也可以实现接口,所以我们直接让我们的子类去实现KeyListenner这个接口。

报错是因为我们要重写KeyListener这个接口里面的方法。

现在我们子类就是这个接口的实现类,而KeyListener( )方法中需要传入的是一个实现类对象,我们直接this。(直呼牛逼)

keyPressed是记录键盘按下

keyReleased是记录键盘松开

keyTyped是记录键盘键入的时候

接下来我们只需要在keyPressed中加入移动逻辑。其他两个就不用管了。

我们先用打印语句模拟执行:

模拟运行很成功。

为了效果的美观,我们将判断语句抽取出一个新的方法:

<2>确定0号元素的位置

什么时候去找0号的位置呢?

在图片顺序被打乱之后就可以找了,我们在成员变量中声明两个变量记录0号元素的位置。

<3>实现移动业务 (空白块视角)

左移动:

空白块和右边数据做交换。

空白块:行不变,列加一。

右边的变为空白快的位置。

其它几个操作类似。

现在跑起来代码,画面是不会动的!!!

所以我们每移动一次,需要刷新一次窗体面板。

这样之后其实还是不会成功的,如果我们只是这样操作的话,每刷新一次窗体面板,就相当于新添加了一次图片,而先添加的在最上层,所以我们就相当于一直在最下层添加图片。

解决方法:在每一次绘制界面的开始都执行一次清空窗口的操作,每一次绘制界面的结束都执行一次刷新窗口的操作。

super.getContentPane( ).removeAll( );

super.getContentPane( ).repaint( );

这样就可以运行了。

但是!!!!还有bug!!!!

bug先放着不管,自己写的游戏,自己写个挂可以吧!

“Z”一键胜利!!!

<4>问题处理

索引越界:

如果遇到了边界坐标,再移动会发生索引越界异常。

加入if判断,如果横坐标不等于3,就可以左移动。

以此类推。

7、胜利判断

定义一个新的数组存储过关的数据,每键盘输入一次,就判断一次,如果新数组与原数组内容相同,就加载胜利图片。

建议重新定义一个方法。

为了不浪费内存,我们将胜利的数组放到成员变量中。

这个方法在什么时候调用呢?

答案是绘制游戏界面的里边,然后我们加一个判断,如果结果为true就显示胜利!

为了不让游戏结束后继续移动,我们还需要在控制移动的方法的开始就判断是否胜利,如果胜利直接就结束方法。

8、统计步数

定义一个成员变量count,每移动一次,count++;

还要定义一个JLabel来显示移动步数。

9、重新游戏

设置一个按钮,点击让它重新游戏。

给按钮绑定监听,步数归零,顺序打乱。

然后就OK了。


石头迷阵小游戏的评论 (共 条)

分享到微博请遵守国家法律