Java 2048 小游戏 源码



import java.awt.Color;
import java.awt.EventQueue;
//import java.awt.BorderLayout;
//import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Icon;
//import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
//import javax.swing.border.*;
  1. import javax.swing.JTextField;
public class Copy2048 extends JFrame{
private JPanel scoresPane; //分数面板
private JPanel mainPane; //主面板
private JLabel labelMaxScores ; //最高分
private JLabel labelScores; //分数
private JLabel tips;         //提示操作标签
private JTextField textMaxScores; //最高分文本框
private JLabel textScores; //分数文本框
private JLabel[][] texts; //方块标签二维数组
private Icon icon2;
private int times = 16; //记录剩余空方块数目
private int scores = 0;     //记录分数
private int l1,l2,l3,l4;   //用于判断游戏是否失败
Font font = new Font("", Font.BOLD,14); //设置分数面板字体类型和大小
Font font2 = new Font("", Font.BOLD,30); //设置主面板字体类型和大小
Random random = new Random();                   //获取随机数

public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
Copy2048 frame = new Copy2048();
frame.setVisible(true);
// Thread thread = new Thread(frame);
// thread.start();
}
catch(Exception e1){
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048(){
super();
setResizable(false);                 //禁止调整窗体大小
getContentPane().setLayout(null); //设置空布局
setBounds(500, 50, 500, 615); //设置界面位置和大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭
setTitle("2048PC版");                   //设置窗体标题

scoresPane = new JPanel(); //创建分数显示面板
scoresPane.setBackground(Color.green); //设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40); //设置分数面板位置和大小
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框粗细和颜色
getContentPane().add(scoresPane); //将得分面板添加到窗体
scoresPane.setLayout(null);     //设置面板空布局

labelMaxScores = new JLabel("最高分:"); //最高分标签
labelMaxScores.setFont(font);     //设置字体类型和大小
labelMaxScores.setBounds(10, 5, 50, 30); //设置最高分标签的位置和尺寸
scoresPane.add(labelMaxScores);         //将最高分标签添加到得分容器中

textMaxScores = new JTextField("暂不可用"); //最高得分标签
textMaxScores.setBounds(60, 5, 150, 30); //设置最高分文本框的位置和尺寸
textMaxScores.setFont(font); //设置最高分字体
textMaxScores.setEditable(false);     //设置为不可编辑
scoresPane.add(textMaxScores); //将最高分标签添加到分数面板中

labelScores = new JLabel("得    分:");
labelScores.setFont(font); //设置分数标签字体类型和大小
labelScores.setBounds(240, 5, 50, 30); //设置分数标签位置和大小
scoresPane.add(labelScores); //将得分标签添加到分数面板中

textScores = new JLabel(String.valueOf(scores)); //将计算所得分数放到分数文本框
textScores.setFont(font); //设置分数字体
textScores.setBounds(290, 5, 150, 30); //设置分数位置和大小
scoresPane.add(textScores); //将得分文本框添加到分数面板中

mainPane = new JPanel();     //创建游戏主面板
mainPane.setBounds(20, 70, 460, 500); //设置主面板位置和尺寸

this.getContentPane().add(mainPane); //添加游戏主面板到容器中
mainPane.setLayout(null); //设置空布局

texts = new  JLabel[4][4]; //创建方块标签二维数组
for(int i = 0; i < 4; i++){ //遍历数组
for(int j = 0; j < 4; j++){
texts[i][j] = new JLabel();     //创建标签
texts[i][j].setFont(font2); //设置方块字体
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER); //设置方块内容居中对齐
texts[i][j].setText(""); //设置方块内容为空
texts[i][j].setBounds(120 * j, 120 * i, 100, 100); //设置方块的大小位置
setColor(i, j, ""); //设置颜色为空
texts[i][j].setOpaque(true);                                   //设置控件不透明
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色
mainPane.add(texts[i][j]);   //将创建的方块标签放在游戏主面板
}
}

tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");//创建提示标签
tips.setFont(font); //设置提示标签字体
tips.setBounds(60,480,400,20); //设置提示标签位置和大小
mainPane.add(tips); //将提示标签放到主面板

textMaxScores.addKeyListener(new KeyAdapter(){ //为最高分标签添加按键监听器
public void keyPressed(  KeyEvent e){
do_label_keyPressed(e); //调用时间处理方法
}
});

Create2(); //最开始打开游戏随机出现的两个2
Create2(); //最开始打开游戏随机出现的两个2
}

/**
* 按键输入事件的处理方法
* @param e
*/
protected  void do_label_keyPressed(final KeyEvent e){             
int code = e.getKeyCode(); //获取按键代码
int a ;         //a 的引入是为了防止连加的情况出现
String str ;
String str1;
int num;
switch(code){ //按键的四种情况
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:   //如果按键代码是左方向键或者A键
for(int i = 0; i < 4; i++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 1; j < 4; j++){       //遍历16个方块
str = texts[i][j].getText();       //获取当前方块标签文本字符
str1 = texts[i][j-1].getText();       //获取当前方块左边的一个标签文本字符

if(str1.compareTo("") == 0){ //如果左边方块文本为空字符
texts[i][j-1].setText(str); //方块左移
setColor(i, j-1,str); //设置颜色
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, ""); //设置当前方块颜色
}
else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//避免连加
num  = Integer.parseInt(str); //获取字符串转化为整型
scores += num; //加分
times ++; //空块加一
str = String.valueOf(2 * num); //计算左边方块最终结果
texts[i][j-1].setText(str); //左边方块文本字符变为两方块之和
setColor(i, j-1, str); //设置颜色
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, ""); //设置当前方块颜色
a = j;
}
}
}
}
l1 = 1; //用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
for(int i = 0; i < 4; i ++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 2; j >= 0; j--){
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText();

if(str1.compareTo("") == 0){
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
for(int j = 0; j < 4; j++){
a = 5;
for(int k = 0; k < 3; k++){
for(int i = 1; i < 4; i++){
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText();

if(str1.compareTo("") == 0){
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a -1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 =1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
for(int j = 0; j < 4; j ++){
a = 5;
for(int k = 0; k < 5; k++){
for(int i = 2; i >= 0; i--){
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText();

if(str1.compareTo("") == 0){
texts[i + 1][j].setText(str);
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a + 1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str );
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
}

/**
* 在随机位置产生一个2号方块的方法
* @param i,j
*/
public void Create2(){
int i ,j;
boolean r = true;
String str;

if(times > 0){
while(r){
i = random.nextInt(4); //随机获取整型0-4(列数)
j = random.nextInt(4); //随机获取整型0-4(行数)
str = texts[i][j].getText(); //获取该随机标签文本
if((str.compareTo("") == 0)){ //如果文本为空
texts[i][j].setIcon(icon2);
texts[i][j].setText("2"); //将其文本内容设为2
setColor(i, j, "2"); //设置颜色

times --; //空块数目减少
r = false;
l1 = l2 = l3 = l4 = 0; //重置
}
}
}
//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){
tips.setText("                            GAME OVER !");

}
}

/**
* 设置标签颜色
* @param i , j ,str
*/
public void setColor(int i, int j, String str){
switch(str){
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
//case "":
//case "4096":
//texts[i][j].setBackground(Color.white);
//break;
default:
texts[i][j].setBackground(Color.white);
break;
}


}


}



import java.awt.Color;
import java.awt.EventQueue;
//import java.awt.BorderLayout;
//import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;


import javax.swing.BorderFactory;
import javax.swing.Icon;
//import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
//import javax.swing.border.*;
import javax.swing.JTextField;


public class Copy2048 extends JFrame{
private JPanel scoresPane; //分数面板
private JPanel mainPane; //主面板
private JLabel labelMaxScores ; //最高分
private JLabel labelScores; //分数
private JLabel tips;         //提示操作标签
private JTextField textMaxScores; //最高分文本框
private JLabel textScores; //分数文本框
private JLabel[][] texts; //方块标签二维数组
private Icon icon2;
private int times = 16; //记录剩余空方块数目
private int scores = 0;     //记录分数
private int l1,l2,l3,l4;   //用于判断游戏是否失败
Font font = new Font("", Font.BOLD,14); //设置分数面板字体类型和大小
Font font2 = new Font("", Font.BOLD,30); //设置主面板字体类型和大小
Random random = new Random();                   //获取随机数

public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
Copy2048 frame = new Copy2048();
frame.setVisible(true);
// Thread thread = new Thread(frame);
// thread.start();
}
catch(Exception e1){
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048(){
super();
setResizable(false);                 //禁止调整窗体大小
getContentPane().setLayout(null); //设置空布局
setBounds(500, 50, 500, 615); //设置界面位置和大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭
setTitle("2048PC版");                   //设置窗体标题

scoresPane = new JPanel(); //创建分数显示面板
scoresPane.setBackground(Color.green); //设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40); //设置分数面板位置和大小
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框粗细和颜色
getContentPane().add(scoresPane); //将得分面板添加到窗体
scoresPane.setLayout(null);     //设置面板空布局

labelMaxScores = new JLabel("最高分:"); //最高分标签
labelMaxScores.setFont(font);     //设置字体类型和大小
labelMaxScores.setBounds(10, 5, 50, 30); //设置最高分标签的位置和尺寸
scoresPane.add(labelMaxScores);         //将最高分标签添加到得分容器中

textMaxScores = new JTextField("暂不可用"); //最高得分标签
textMaxScores.setBounds(60, 5, 150, 30); //设置最高分文本框的位置和尺寸
textMaxScores.setFont(font); //设置最高分字体
textMaxScores.setEditable(false);     //设置为不可编辑
scoresPane.add(textMaxScores); //将最高分标签添加到分数面板中

labelScores = new JLabel("得    分:");
labelScores.setFont(font); //设置分数标签字体类型和大小
labelScores.setBounds(240, 5, 50, 30); //设置分数标签位置和大小
scoresPane.add(labelScores); //将得分标签添加到分数面板中

textScores = new JLabel(String.valueOf(scores)); //将计算所得分数放到分数文本框
textScores.setFont(font); //设置分数字体
textScores.setBounds(290, 5, 150, 30); //设置分数位置和大小
scoresPane.add(textScores); //将得分文本框添加到分数面板中

mainPane = new JPanel();     //创建游戏主面板
mainPane.setBounds(20, 70, 460, 500); //设置主面板位置和尺寸

this.getContentPane().add(mainPane); //添加游戏主面板到容器中
mainPane.setLayout(null); //设置空布局

texts = new  JLabel[4][4]; //创建方块标签二维数组
for(int i = 0; i < 4; i++){ //遍历数组
for(int j = 0; j < 4; j++){
texts[i][j] = new JLabel();     //创建标签
texts[i][j].setFont(font2); //设置方块字体
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER); //设置方块内容居中对齐
texts[i][j].setText(""); //设置方块内容为空
texts[i][j].setBounds(120 * j, 120 * i, 100, 100); //设置方块的大小位置
setColor(i, j, ""); //设置颜色为空
texts[i][j].setOpaque(true);                                   //设置控件不透明
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色
mainPane.add(texts[i][j]);   //将创建的方块标签放在游戏主面板
}
}

tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");//创建提示标签
tips.setFont(font); //设置提示标签字体
tips.setBounds(60,480,400,20); //设置提示标签位置和大小
mainPane.add(tips); //将提示标签放到主面板

textMaxScores.addKeyListener(new KeyAdapter(){ //为最高分标签添加按键监听器
public void keyPressed(  KeyEvent e){
do_label_keyPressed(e); //调用时间处理方法
}
});

Create2(); //最开始打开游戏随机出现的两个2
Create2(); //最开始打开游戏随机出现的两个2
}

/**
* 按键输入事件的处理方法
* @param e
*/
protected  void do_label_keyPressed(final KeyEvent e){             
int code = e.getKeyCode(); //获取按键代码
int a ;         //a 的引入是为了防止连加的情况出现
String str ;
String str1;
int num;
switch(code){ //按键的四种情况
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A:   //如果按键代码是左方向键或者A键
for(int i = 0; i < 4; i++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 1; j < 4; j++){       //遍历16个方块
str = texts[i][j].getText();       //获取当前方块标签文本字符
str1 = texts[i][j-1].getText();       //获取当前方块左边的一个标签文本字符

if(str1.compareTo("") == 0){ //如果左边方块文本为空字符
texts[i][j-1].setText(str); //方块左移
setColor(i, j-1,str); //设置颜色
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, ""); //设置当前方块颜色
}
else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//避免连加
num  = Integer.parseInt(str); //获取字符串转化为整型
scores += num; //加分
times ++; //空块加一
str = String.valueOf(2 * num); //计算左边方块最终结果
texts[i][j-1].setText(str); //左边方块文本字符变为两方块之和
setColor(i, j-1, str); //设置颜色
texts[i][j].setText(""); //当前方块字符置空
setColor(i, j, ""); //设置当前方块颜色
a = j;
}
}
}
}
l1 = 1; //用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
for(int i = 0; i < 4; i ++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 2; j >= 0; j--){
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText();

if(str1.compareTo("") == 0){
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
for(int j = 0; j < 4; j++){
a = 5;
for(int k = 0; k < 3; k++){
for(int i = 1; i < 4; i++){
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText();

if(str1.compareTo("") == 0){
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a -1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 =1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
for(int j = 0; j < 4; j ++){
a = 5;
for(int k = 0; k < 5; k++){
for(int i = 2; i >= 0; i--){
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText();

if(str1.compareTo("") == 0){
texts[i + 1][j].setText(str);
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a + 1){
num  = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str );
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
}

/**
* 在随机位置产生一个2号方块的方法
* @param i,j
*/
public void Create2(){
int i ,j;
boolean r = true;
String str;

if(times > 0){
while(r){
i = random.nextInt(4); //随机获取整型0-4(列数)
j = random.nextInt(4); //随机获取整型0-4(行数)
str = texts[i][j].getText(); //获取该随机标签文本
if((str.compareTo("") == 0)){ //如果文本为空
texts[i][j].setIcon(icon2);
texts[i][j].setText("2"); //将其文本内容设为2
setColor(i, j, "2"); //设置颜色

times --; //空块数目减少
r = false;
l1 = l2 = l3 = l4 = 0; //重置
}
}
}
//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){
tips.setText("                            GAME OVER !");

}
}

/**
* 设置标签颜色
* @param i , j ,str
*/
public void setColor(int i, int j, String str){
switch(str){
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
//case "":
//case "4096":
//texts[i][j].setBackground(Color.white);
//break;
default:
texts[i][j].setBackground(Color.white);
break;
}


}


}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值