Bootstrap

利用Java Swing实现在线游戏盒子:连连看游戏

盒子实现游戏🎮:

  • 🔸 推箱子:一款家喻户晓的益智小游戏,玩家控制搬运工上下左右移动,来将箱子推到指定地点。
  • 🔸 飞行射击:一款操纵飞行角色发射炮弹攻击敌机的小游戏。
  • 🔸 对对碰:一款经典的消除类游戏,玩家只要通过点击人物来使人物之间互相换位,连成 3 个以上的人物来消除得分。
  • 🔸 弹弹堂:一款回合制射击类竞技游戏,玩家双方发射炮弹攻击对方,直到一方血量为零。

JAVA程序设计小游戏对战平台,实现了注册、登陆、添加好友、聊天室(弹弹堂、推箱子、雷电、对对碰).zip资源-CSDN文库

1. 对对碰🏎️

1.1 对对碰游戏介绍

对对碰是一款经典的消除类游戏🌈,玩家只要通过点击人物来使人物之间互相换位,连成 3 个以上的人物来消除得分。

1.2 对对碰游戏功能

只需要鼠标单击进行操作,玩家点击两个相邻的人物,使他们交换位置,如果交换位置后有三个以上的连续人物则可以将他们消除,消除的人物由上方的砖块补充,且如果消除人物补充完后某处依然有三个以上连续的人物,则可以继续消除(即连锁反应),🔥消除人物越多,玩家分数越高。游戏界面如下图所示:

1.3 对对碰实现原理

[整体核心结构]

public class Touch_animation extends JFrame
{
private JPanel backPanel = new JPanel();
private RoomPanel roomPanel = new RoomPanel();
private int pictures[][] = new int[matrixR][matrixC];
private int cClicked, rClicked; //第一次单击按钮的坐标
…
public Touch_animation() {}
public void init() {}
private void initImage() {}
private boolean isThreeLinked(int y, int x, int[]kinds){}
private void removeLinked(int y, int x, int kind){}
private boolean globalSearch(int flag){}
private void callAnimation() {}
private void downPictures(){}
private void swapPictures(int x, int y){}
private void testExchanging(){}
private void initPictureMatrix(){}
private void upsetPictureMatrix(){}
class RoomPanel extends JPanel{}
}

[具体实现]

         💡 游戏面板由一个 JFrame 的继承类和两个 JPanel(或其继承类)构成。Touch_animation 继承了 JFrame 构成面板底层,采用 BorderLayout 布局,backPanel位于 Touch_animation 的 NORTH,负责放置“开始”和“退出”按钮以及显示分数和时间的 TextField。roomPanel 位于 Touch_animation 的 CENTER 没有添加组件,仅仅用于绘制图片、人物和进度条。int[][] pictures 是该游戏的核心变量,它存储游戏矩阵的信息,每个方格的数字代表其存储哪种人物,信息的表示是 0~6,共 7 种人物🤹‍♂️类型。

  • 💠 init()用于各项初始化,作用在游戏刚开始以及游戏重新开始的初始化。
  • 💠 initImage()加载背景图片、小人物图片以及动画特效的图片。
  • 💠 isThreeLinked(int y, int x, int[]kinds)判断(x,y)坐标处是否有 3 个以上的相同人物组,如果有则返回 true,否则返回 false,原理采用基础的横向/纵向顺序检索。另外,为了提高效率,需要在检测出可消除的行/列的同时,知道是消除一行还是一列,还是行和列。由于 Java 没有指针,因此这里直接采用数组 int[]kinds 来记录结果,只启用 kinds[0],kinds[0] 为 1 表示横向消除,10 表示纵向消除 11 表示横纵都消除。
  • 💠 removeLinked(int y, int x, int kind)是在 isThreelinked 被调用后并且返回 true的基础之上使用的,作用是消除(x,y)坐标处三个以上的连续行/列甚至行列都消除。kind 作为输入,也就是 isThreeLinked 写入的 kinds[0]的值,指定是消除一行、一列还是行列都消除。
  • 💠 globalSearch(int flag)全局扫描人物矩阵,如果有消除点则返回 true,否则返回 false。flag 为 1 时仅仅扫描,flag 为 0 时,在扫描的基础上进行消除。靠调用isThreeLinked 检测是否有消除点,调用 removeLinked 进行消除。
  • 💠 callAnimation()具体见 3.3.4 动画实现。
  • 💠 downPictures()实现消除后“空白”处由上方的人物“下坠”补全。
  • 💠 swapPictures(int x, int y)实现鼠标点击相邻方块的交换。这里传入的参数 x 和y 已经是第二次点击的坐标,第一次点击的人物横纵坐标会被存入 cClicked 和rClicked 两个变量中,直到第二次点击面板时才会将点击坐标(x,y)作为参数调用swapPictures。在该函数中,x 和 y 会先被转换成 cAbs 和 rAbs,即选中的人物横纵坐标,之后判断两次点击的人物坐标是否相邻,如果相邻则尝试交换并调用testExchanging 判断交换后是否会产生消除。
  • 💠 testExchanging()测试交换结果,如果可以消除则进行消除。
  • 💠 initPictureMatrix()补全 pictures 矩阵的“空白”处,用随机数填上。
  • 💠 upsetPictureMatrix()将 pictures 矩阵所有格重置为某个随机数。
  • 💠 RoomPanel 覆盖了 JPanel 的 paint()方法,绘制背景、人物和进度条。
1.4 动画实现

这是本游戏比较特殊的地方,也是为 3.4 弹弹堂的实现奠定基础之处。核心相关字段和方法如下:

private boolean isAnimation; //是否处于动画状态
private boolean isExchanging; //是否处于交换状态
private boolean isExplosion; //是否处于爆炸状态
private boolean isFalling; //是否处于下降状态
private Timer animation; //动画的定时器
//爆炸特效有关字段
private BufferedImage explosionImage[]; //所有图片
private final int explosionCnt = 25; //一共 25 帧
private int explosionCur; //当前的帧数
private boolean explosion[][]; //爆炸矩阵
//交换动画有关字段
private final int changeCnt = 32;
private boolean changeBack;
private int changeCur; //已经交换的步数
private int sr, sc, dr, dc; //交换图标的坐标
private int pictureY[][] = new int[matrixR][matrixC];
private int pictureX[][] = new int[matrixR][matrixC];
private void callAnimation(){}

        简要地说,isAnimation = isExchanging | isExplosion | isFalling(几个字段的含义见以上注释)。动画进行和游戏逻辑不冲突的关键在于:每次要进行游戏逻辑时都判断一下 isAnimation 是否为 true,如果不是则屏蔽游戏逻辑,直到动画结束,否则继续游戏逻辑。

        爆炸特效的实现原理就是最基本的“动”画原理,按照一定频率在某个地方播放一段连续的帧产生动画错觉。这里的 explosion 矩阵用于指示哪些人物所在的位置被消除,即需要产生爆炸特效。爆炸特效的帧播放依靠于 private Timer animation 这一动画的定时器,该定时器会在爆炸特效被启动的时候启动,每隔0.01 秒切换一帧,然后调用 repaint()重新绘制面板,直到帧数被播放完。

        交换动画的实现原理类似爆炸特效的基本原理,也是按照一定的频率,在图片移动路径上不断打印图片,从而实现两张图片相向“移动”到对方位置的视觉效果。这里的 pictureY 和 pictureX 存储了所有人物图片在 roomPanel 的 y 坐标和 x坐标,roomPanel 的 paint()函数会根据以上两个矩阵绘制每个人物,而图片交换动画的实现就是每隔一段时间更改“移动”的两张人物的 y 和 x 的值,从而实现动画效果。交换动画会在 swapPictures 中通过指定 isExchanging=true 以及 sr,sc,dr,dc等字段来初始化和启动交换“动画”。

callAnimation()是用来检测全局是否产生了消除,如果产生了消除,则设定isExplosion、isAnimation 为 true 后启动爆炸动画

;