天天看点

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

}

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));

}

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 !");

}

}

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

}

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));

}

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 !");

}

}

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;

}

}

}