本文实例为大家分享了java实现2048游戏源代码,供大家参考,具体内容如下
一.主要功能:
1、游戏初始化:新建游戏4×4的16宫格画布,随机格子上生成2或者4两个数字
2、格子的移动:先判断能否移动,移动后判断能否合并,合并后改变格子颜色和数字
3、新格子的生成:移动一次,就在剩余的空格子中随机生成一个2或者4
4、判赢:16宫格中合并出了“2048”则为游戏胜利
5、判输:16宫格中没有剩余空格子且不能再向任何方向移动则为游戏失败
二.项目的主要结构:
在项目2018游戏中,有4个源文件,此外,还有3个.png和两个.wav格式的音乐文件。一个音乐是按键移动的声音,另外一个是碰撞后的消除的声音。然后游戏的最高分保存是在Recording源文件中,之后附上所需的图片文件和音乐文件:
来了来了.
三.代码
1、Game.java
package shixun;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Game extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
Game UI = new Game();
UI.IntUI();
}
// 用于存放数据的数组,构成游戏4*4界面的数值
private int Numbers[][] = new int[4][4] ;
private void IntUI() {
this.setTitle("2048小游戏");
this.setLocation(450, 100);
this.setSize(400, 500);
this.setLayout(null);
// 开始游戏按钮
ImageIcon imgicon = new ImageIcon("res/start.png");
JButton bt = new JButton(imgicon);
bt.setFocusable(false);
bt.setBorderPainted(false);
bt.setFocusPainted(false);
bt.setContentAreaFilled(false);
bt.setBounds(5, 10, 120, 30);// 设置按钮的x,y坐标位置和宽度与高度
this.add(bt);
//后退一步按钮
ImageIcon backicon = new ImageIcon("res/backicon.png");
JButton back = new JButton(backicon);
back.setFocusable(false);
back.setBorderPainted(false);
back.setFocusPainted(false);
back.setContentAreaFilled(false);
back.setBounds(270, 10, 120, 30);// 设置按钮的x,y坐标位置和宽度与高度
this.add(back);
// 关于按钮
ImageIcon imgicon2 = new ImageIcon("res/about.png");
JButton about = new JButton(imgicon2);
about.setFocusable(false);
about.setBorderPainted(false);
about.setFocusPainted(false);
about.setContentAreaFilled(false);
about.setBounds(160, 10, 70, 30);
this.add(about);
// 分数显示
JLabel lb = new JLabel("分数:0");
lb.setBounds(40, 45, 120, 30);
lb.setFont(new Font("幼圆", Font.CENTER_BASELINE, 18));
lb.setForeground(new Color(0x000000));
this.add(lb);
//最高分数
Recorder.getRecording();
int maxscore = Recorder.getMaxscore_2048();
JLabel M=new JLabel("最高分:0");
M.setBounds(150,45,120,30);
M.setFont(new Font("幼圆", Font.CENTER_BASELINE, 18));
M.setForeground(new Color(0x000000));
this.add(M);
//静音
JCheckBox isSoundBox=new JCheckBox("静音");
isSoundBox.setBounds(290, 45, 120, 30);
isSoundBox.setFont(new Font("幼圆", Font.CENTER_BASELINE, 18));
isSoundBox.setFocusable(false);
isSoundBox.setBorderPainted(false);
isSoundBox.setFocusPainted(false);
isSoundBox.setContentAreaFilled(false);
this.add(isSoundBox);
this.setDefaultCloseOperation(3);
this.setResizable(false);
this.setVisible(true);// 显示界面
// 创建事件处理类
MyListener cl = new MyListener(this,Numbers,lb,M, bt, about,back,isSoundBox);
bt.addActionListener(cl);
about.addActionListener(cl);
back.addActionListener(cl);
isSoundBox.addActionListener(cl);
this.addKeyListener(cl);
}
// 重写窗体
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(new Color(0xBBADA0));
g.fillRoundRect(15, 110, 370, 370, 15, 15);// 大矩形框
g.setColor(new Color(0xCDC1B4));
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
g.fillRoundRect(25 + i * 90, 120 + j * 90, 80, 80, 15, 15);// 小矩形框
}
}
// 调整数字的位置并上色
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (Numbers[j][i] != 0) {
int FontSize = 30;
int MoveX = 0, MoveY = 0;
switch (Numbers[j][i]) {
case 2:
g.setColor(new Color(0xeee4da));
FontSize = 30;
MoveX = 0;
MoveY = 0;
break;
case 4:
g.setColor(new Color(0xede0c8));<