package com.baidu.czy;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Arrays; import java.util.Random; import javax.swing.*;
public class ComponentListener extends KeyAdapter implements ActionListener {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> GameStart UI;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 界面对象</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Numbers[][];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 存放数据的数组</span> <span style="color: rgba(0, 0, 255, 1)">private</span> Random rand = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Random(); </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> BackUp[][] = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">int</span>[4][4];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用于备份数组,供回退时使用</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> BackUp2[][] = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">int</span>[4][4];<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用于备份数组,供起死回生时使用</span> <span style="color: rgba(0, 0, 255, 1)">public</span> JLabel lb; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">分数标签</span> <span style="color: rgba(0, 0, 255, 1)">int</span> score = 0<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">int</span> tempscore, tempscore2;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">记录回退的分数值</span> <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> JButton bt, about, back; </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> JCheckBox isSoundBox; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否胜利,true:胜利,false:失败</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> isWin = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否复活,true:使用复活,false:不使用复活</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> relive = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否可以回退,true:不可回退,false:可以回退 (是否已经进行过一次回退了)</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> hasBack = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否播放音乐,true:播放音效,false:不播放音效</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> isSound = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">事件</span> <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> ActionEvent e; </span><span style="color: rgba(0, 0, 255, 1)">public</span> ComponentListener(GameStart UI, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">[][] Numbers, JLabel lb, JButton bt, JButton about, JButton back, JCheckBox isSoundBox) { </span><span style="color: rgba(0, 0, 255, 1)">this</span>.UI =<span style="color: rgba(0, 0, 0, 1)"> UI; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.Numbers =<span style="color: rgba(0, 0, 0, 1)"> Numbers; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.lb =<span style="color: rgba(0, 0, 0, 1)"> lb; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.bt =<span style="color: rgba(0, 0, 0, 1)"> bt; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.about =<span style="color: rgba(0, 0, 0, 1)"> about; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.back =<span style="color: rgba(0, 0, 0, 1)"> back; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isSoundBox =<span style="color: rgba(0, 0, 0, 1)"> isSoundBox; }
@Override public void actionPerformed(ActionEvent e) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (e.getSource() ==<span style="color: rgba(0, 0, 0, 1)"> bt ) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">游戏开始</span> isWin = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">各个小格赋初值0</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < 4; i++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> j = 0; j < 4; j++<span style="color: rgba(0, 0, 0, 1)">) Numbers[i][j] </span>= 0<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">游戏开始,分数为0</span> score = 0<span style="color: rgba(0, 0, 0, 1)">; lb.setText(</span>"分数:" +<span style="color: rgba(0, 0, 0, 1)"> score); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成4个0-3之间的随机数</span> <span style="color: rgba(0, 0, 255, 1)">int</span> r1 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">int</span> r2 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">int</span> c1 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">int</span> c2 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">由r1,c1;r2,c2组成两个初始值,所以初始值的坐标不能重复</span> <span style="color: rgba(0, 0, 255, 1)">while</span> (r1 == r2 && c1 ==<span style="color: rgba(0, 0, 0, 1)"> c2) { r2 </span>= rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); c2 </span>= rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 生成初始数字(2或者4)</span> <span style="color: rgba(0, 0, 255, 1)">int</span> value1 = rand.nextInt(2) * 2 + 2<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">int</span> value2 = rand.nextInt(2) * 2 + 2<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把数字存进对应的位置</span> Numbers[r1][c1] =<span style="color: rgba(0, 0, 0, 1)"> value1; Numbers[r2][c2] </span>=<span style="color: rgba(0, 0, 0, 1)"> value2; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数字更改,重新绘制图形,为此组件创建图形上下文</span>
UI.paint(UI.getGraphics());
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (e.getSource() ==<span style="color: rgba(0, 0, 0, 1)"> about) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">点击了关于标签</span> JOptionPane.showMessageDialog(UI, "游戏规则:
“
+ "1、开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4
”
+ "2、玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
“
+ "3、玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
”
+ "4、合并所得的所有新生成数字相加即为该步的有效得分
“
+ "5、玩家选择的方向行或列前方有空格则出现位移
”
+ "6、每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)
“
+ "7、棋盘被数字填满,无法进行有效移动,判负,游戏结束
”
+ "8、棋盘上出现2048,判胜,游戏结束。
“
); } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (e.getSource() == back && hasBack == <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) { System.out.println(</span>"回退"<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">点击了回退一步标签,而且只能回退一次,只有再执行一次上下左右操作才可以再次回退</span> hasBack = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断本次回退是回退上一步,还是复活,回退上上步</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (relive == <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">替换上一步的分数</span> score =<span style="color: rgba(0, 0, 0, 1)"> tempscore; lb.setText(</span>"分数:" +<span style="color: rgba(0, 0, 0, 1)"> score); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < BackUp.length; i++<span style="color: rgba(0, 0, 0, 1)">) { Numbers[i] </span>=<span style="color: rgba(0, 0, 0, 1)"> Arrays.copyOf(BackUp[i], BackUp[i].length); } } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">选择了起死回生</span> score =<span style="color: rgba(0, 0, 0, 1)"> tempscore2; lb.setText(</span>"分数:" +<span style="color: rgba(0, 0, 0, 1)"> score); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < BackUp2.length; i++<span style="color: rgba(0, 0, 0, 1)">) { Numbers[i] </span>=<span style="color: rgba(0, 0, 0, 1)"> Arrays.copyOf(BackUp2[i], BackUp2[i].length); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">再给一次复活的机会</span> relive = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重新绘制</span>
UI.paint(UI.getGraphics());
} </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (e.getSource().equals(isSoundBox)) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否选中静音复选框</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isSoundBox.isSelected()) { isSound </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> { isSound </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; } } } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 键盘监听,监听游戏焦点的←,↑,→,↓;方向键键值:左:37上:38右:39下:40</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> keyPressed(KeyEvent event) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> Counter = 0;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 记录数字有效移动位数,判断是否移动了</span> <span style="color: rgba(0, 0, 255, 1)">int</span> NumCounter = 0;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 记录当前有数字的小方格数量,判断是否已满</span> <span style="color: rgba(0, 0, 255, 1)">int</span> NumNearCounter = 0;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 记录相邻格子数字相同的对数</span>
hasBack </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">每次进行真正的移位合并操作之前,记录前一步 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">记录上上步</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (BackUp != <span style="color: rgba(0, 0, 255, 1)">null</span> || BackUp.length != 0<span style="color: rgba(0, 0, 0, 1)">) { tempscore2 </span>= tempscore;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 先把分数备份好 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下面的for循环调用java.util.Arrays.copyOf()方法复制数组,实现备份</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < BackUp.length; i++<span style="color: rgba(0, 0, 0, 1)">) { BackUp2[i] </span>=<span style="color: rgba(0, 0, 0, 1)"> Arrays.copyOf(BackUp[i], BackUp[i].length); } } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">记录上步</span> tempscore = score;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 先把分数备份好 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下面的for循环调用java.util.Arrays.copyOf()方法复制数组,实现备份</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < Numbers.length; i++<span style="color: rgba(0, 0, 0, 1)">) { BackUp[i] </span>=<span style="color: rgba(0, 0, 0, 1)"> Arrays.copyOf(Numbers[i], Numbers[i].length); } </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isWin == <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (event.getKeyCode()) { </span><span style="color: rgba(0, 0, 255, 1)">case</span> 37<span style="color: rgba(0, 0, 0, 1)">: </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向左移动</span> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> (1)在移动的过程中,判断与其相邻的格子,如果相邻的格子为空,则移动,并将当前的格子清0 (2)移动后,若格子相邻并且数值相等,则求和并且清0 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\move.wav").start();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 播放移位音乐</span>
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">经过这个循环,把每行有值的格子,都被搬到最左边了,同一行右侧有值的格子,覆盖左侧值为0的格子</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">per相当于是相邻位置</span> <span style="color: rgba(0, 0, 255, 1)">int</span> pre = l - 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre >= 0 && Numbers[h][pre] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[h][pre] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移动后清0</span> Numbers[h][pre + 1] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>--<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表盘当前左侧相邻相等的值会相加,造成左边值为【和】,相邻右边值为【0】</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (l + 1 < 4 && (Numbers[h][l] == Numbers[h][l + 1]) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">相邻两列数值相加,并要求两列不同时为0</span> && (Numbers[h][l] != 0 || Numbers[h][l + 1] != 0<span style="color: rgba(0, 0, 0, 1)">)) { </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\merge.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数值合并</span> Numbers[h][l] = Numbers[h][l] + Numbers[h][l + 1<span style="color: rgba(0, 0, 0, 1)">]; Numbers[h][l </span>+ 1] = 0<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; score </span>+=<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] == 2048<span style="color: rgba(0, 0, 0, 1)">) { isWin </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">经过这个循环,把每行有值的格子,都被搬到最左边了,同一行右侧有值的格子,覆盖左侧值为0的格子</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = l - 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre >= 0 && Numbers[h][pre] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[h][pre] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[h][pre </span>+ 1] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>--<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">case</span> 39:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向右移动</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\move.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = l + 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre <= 3 && Numbers[h][pre] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[h][pre] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[h][pre </span>- 1] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>++<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (l + 1 < 4 && (Numbers[h][l] == Numbers[h][l + 1<span style="color: rgba(0, 0, 0, 1)">]) </span>&& (Numbers[h][l] != 0 || Numbers[h][l + 1] != 0<span style="color: rgba(0, 0, 0, 1)">)) { </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\merge.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); Numbers[h][l </span>+ 1] =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l] </span>+ Numbers[h][l + 1<span style="color: rgba(0, 0, 0, 1)">]; Numbers[h][l] </span>= 0<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; score </span>+= Numbers[h][l + 1<span style="color: rgba(0, 0, 0, 1)">]; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l + 1] == 2048<span style="color: rgba(0, 0, 0, 1)">) { isWin </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = l + 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre <= 3 && Numbers[h][pre] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[h][pre] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[h][pre </span>- 1] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>++<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">case</span> 38<span style="color: rgba(0, 0, 0, 1)">: </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向上移动</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\move.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = h - 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre >= 0 && Numbers[pre][l] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[pre][l] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[pre </span>+ 1][l] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>--<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (h + 1 < 4 && (Numbers[h][l] == Numbers[h + 1<span style="color: rgba(0, 0, 0, 1)">][l]) </span>&& (Numbers[h][l] != 0 || Numbers[h + 1][l] != 0<span style="color: rgba(0, 0, 0, 1)">)) { </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\merge.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); Numbers[h][l] </span>= Numbers[h][l] + Numbers[h + 1<span style="color: rgba(0, 0, 0, 1)">][l]; Numbers[h </span>+ 1][l] = 0<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; score </span>+=<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] == 2048<span style="color: rgba(0, 0, 0, 1)">) { isWin </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 0; l < 4; l++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 0; h < 4; h++<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = h - 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre >= 0 && Numbers[pre][l] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[pre][l] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[pre </span>+ 1][l] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>--<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">case</span> 40<span style="color: rgba(0, 0, 0, 1)">: </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向下移动</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\move.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = h + 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre <= 3 && Numbers[pre][l] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[pre][l] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[pre </span>- 1][l] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>++<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (h + 1 < 4 && (Numbers[h][l] == Numbers[h + 1<span style="color: rgba(0, 0, 0, 1)">][l]) </span>&& (Numbers[h][l] != 0 || Numbers[h + 1][l] != 0<span style="color: rgba(0, 0, 0, 1)">)) { </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isSound == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">new</span> PlaySound("E:\JavaProject\HandleGame2048(2)\src\main\resources\res\merge.wav"<span style="color: rgba(0, 0, 0, 1)">).start(); Numbers[h </span>+ 1][l] =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l] </span>+ Numbers[h + 1<span style="color: rgba(0, 0, 0, 1)">][l]; Numbers[h][l] </span>= 0<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; score </span>+= Numbers[h + 1<span style="color: rgba(0, 0, 0, 1)">][l]; </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h + 1][l] == 2048<span style="color: rgba(0, 0, 0, 1)">) { isWin </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> l = 3; l >= 0; l--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> h = 3; h >= 0; h--<span style="color: rgba(0, 0, 0, 1)">) </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[h][l] != 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">int</span> temp =<span style="color: rgba(0, 0, 0, 1)"> Numbers[h][l]; </span><span style="color: rgba(0, 0, 255, 1)">int</span> pre = h + 1<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">while</span> (pre <= 3 && Numbers[pre][l] == 0<span style="color: rgba(0, 0, 0, 1)">) { Numbers[pre][l] </span>=<span style="color: rgba(0, 0, 0, 1)"> temp; Numbers[pre </span>- 1][l] = 0<span style="color: rgba(0, 0, 0, 1)">; pre</span>++<span style="color: rgba(0, 0, 0, 1)">; Counter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移位,合并,移位完成后,判断是否有可重复值</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < 3; i++<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> j = 0; j < 3; j++<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断相邻左右位置有没有重复值</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[i][j] == Numbers[i][j + 1<span style="color: rgba(0, 0, 0, 1)">] </span>&& Numbers[i][j] != 0<span style="color: rgba(0, 0, 0, 1)">) { NumNearCounter</span>++<span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断相邻上下位置有没有重复值</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[i][j] == Numbers[i + 1<span style="color: rgba(0, 0, 0, 1)">][j] </span>&& Numbers[i][j] != 0<span style="color: rgba(0, 0, 0, 1)">) { NumNearCounter</span>++<span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[3][j] == Numbers[3][j + 1]<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第四行只需要判断是否与右边有重复</span> && Numbers[3][j] != 0<span style="color: rgba(0, 0, 0, 1)">) { NumNearCounter</span>++<span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[i][3] == Numbers[i + 1][3]<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第四列只需要判断与下边是否有重复</span> && Numbers[i][3] != 0<span style="color: rgba(0, 0, 0, 1)">) { NumNearCounter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断不为0的空余格子数</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i < 4; i++<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> j = 0; j < 4; j++<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 0, 255, 1)">if</span> (Numbers[i][j] != 0<span style="color: rgba(0, 0, 0, 1)">) { NumCounter</span>++<span style="color: rgba(0, 0, 0, 1)">; } } } System.out.println(Counter); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">有效移位数>0,则补充一个新的2或者4</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (Counter > 0<span style="color: rgba(0, 0, 0, 1)">) { lb.setText(</span>"分数:" +<span style="color: rgba(0, 0, 0, 1)"> score); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机产生0~3的数字,选中位置</span> <span style="color: rgba(0, 0, 255, 1)">int</span> r1 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">int</span> c1 = rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 0, 255, 1)">while</span> (Numbers[r1][c1] != 0<span style="color: rgba(0, 0, 0, 1)">) { r1 </span>= rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); c1 </span>= rand.nextInt(4<span style="color: rgba(0, 0, 0, 1)">); } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">产生2或4</span> <span style="color: rgba(0, 0, 255, 1)">int</span> value1 = rand.nextInt(2) * 2 + 2<span style="color: rgba(0, 0, 0, 1)">; Numbers[r1][c1] </span>=<span style="color: rgba(0, 0, 0, 1)"> value1; } </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isWin == <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) { UI.paint(UI.getGraphics()); JOptionPane.showMessageDialog(UI, </span>"恭喜你赢了!
您的最终得分为:” + score);
} </span><span style="color: rgba(0, 0, 255, 1)">if</span> (NumCounter == 16 && NumNearCounter == 0<span style="color: rgba(0, 0, 0, 1)">) { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移动后满格并且没有可合并的小格子,游戏结束relive:复活一次</span> relive = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">; JOptionPane.showMessageDialog(UI, </span>"没地方可以合并咯!!" + "
很遗憾,您输了>_<” + “ 悄悄告诉你,游戏有起死回生功能哦,不信你“退一步”试试?”
+ "
说不定能扭转乾坤捏 (^_~)”);
} UI.paint(UI.getGraphics()); } }
}
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/18168.html