java实现2048小游戏

来源:互联网 发布:淘宝订单同步接口 编辑:程序博客网 时间:2024/05/22 15:09

“package com.lanou.wo;

import java.sql.Array;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
//2048算法类
public class Erlingsiba {
// 2048游戏
// 1,创建地图
int[][] ditu = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
int[][] dituh = new int[4][4];
String[][] ditu1 = new String[4][4];
String tr;
Scanner scanner = new Scanner(System.in);
boolean flag = true;

// 数组产生随机数public void sunJi() {    while (true) {        Random random = new Random();        int a = random.nextInt(10);        if (a == 4) {            a = 4;        } else {            a = 2;        }        int i = random.nextInt(4);        int j = random.nextInt(4);        if (ditu[i][j] == 0) {            ditu[i][j] = a;            break;        }    }    for (int i = 0; i < ditu.length; i++) {        for (int j = 0; j < ditu[i].length; j++) {            ditu1[i][j] = String.valueOf(ditu[i][j]);        }    }}public void kaishi() {    if (flag) {        sunJi();        for (int i = 0; i < dituh.length; i++) {            for (int j = 0; j < dituh[i].length; j++) {                dituh[i][j] = ditu[i][j];            }        }    } else {        System.out.println("没有移动没产生随机数");    }}// 判断是否移动,当前分数    if(flag==false){      return true;       }    int max = 0;    int min = 1;    for (int i = 0; i < dituh.length; i++) {        for (int j = 0; j < dituh[i].length; j++) {            ditu[i][j] = dituh[i][j];            ditu1[i][j] = String.valueOf(ditu[i][j]);            if (max < dituh[i][j]) {                max = dituh[i][j];            }            if (min > dituh[i][j]) {                min = dituh[i][j];            }        }    }    tr = String.valueOf(max);  return false;}void shang() {    // 上移动    for (int i = 0; i < dituh.length; i++) {        int f = 0;        for (int j = 0; j < dituh[i].length; j++) {            if (dituh[j][i] != 0) {                f = f + 1;                int t = 0;                int b = j - 1;                while (b >= 0) {                    if (dituh[b][i] == 0) {                        dituh[b][i] = dituh[j][i];                        dituh[j][i] = 0;                        j--;                        b--;                    } else if (dituh[b][i] == dituh[j][i]) {                        if (f % 2 == 0) {                            dituh[b][i] = dituh[j][i] * 2;                            dituh[j][i] = 0;                            j--;                            b--;                            t++;                            break;                        } else {                            f++;                            break;                        }                    } else {                        if (f >= 2 && f % 2 == 0 && t == 0) {                            f++;                        }                        break;                    }                }            }        }    }} // 下移动void xia() {    for (int i = 0; i < dituh.length; i++) {        int f = 0;        for (int j = 3; j >= 0; j--) {            if (dituh[j][i] != 0) {                int b = j + 1;                f++;                int t = 0;                while (b < dituh.length) {                    if (dituh[b][i] == 0) {                        dituh[b][i] = dituh[j][i];                        dituh[j][i] = 0;                        j++;                        b++;                    } else if (dituh[b][i] == dituh[j][i]) {                        if (f % 2 == 0) {                            dituh[b][i] = dituh[j][i] * 2;                            dituh[j][i] = 0;                            t++;                            j++;                            b++;                            break;                        } else {                            f++;                            break;                        }                    } else {                        if (f >= 2 && f % 2 == 0 && t == 0) {                            f++;                        }                        break;                    }                }            }        }    }}void zuo() {    for (int i = 0; i < dituh.length; i++) {        int f = 0;        for (int j = 0; j < dituh[i].length; j++) {            if (dituh[i][j] != 0) {                f++;                int t = 0;                int b = j - 1;                while (b >= 0) {                    if (dituh[i][b] == 0) {                        dituh[i][b] = dituh[i][j];                        dituh[i][j] = 0;                        j--;                        b--;                    } else if (dituh[i][b] == dituh[i][j]) {                        if (f % 2 == 0) {                            dituh[i][b] = dituh[i][j] * 2;                            dituh[i][j] = 0;                            t++;                            j--;                            b--;                            break;                        } else {                            f++;                            break;                        }                    } else {                        if (f >= 2 && f % 2 == 0 && t == 0) {                            f++;                        }                        break;                    }                }            }        }    }}// 右移动void you() {    for (int i = 0; i < dituh.length; i++) {        int f = 0;        for (int j = 3; j >= 0; j--) {            if (dituh[i][j] != 0) {                f++;                int t = 0;                int b = j + 1;                while (b < dituh[i].length) {                    if (dituh[i][b] == 0) {                        dituh[i][b] = dituh[i][j];                        dituh[i][j] = 0;                        j++;                        b++;                    } else if (dituh[i][b] == dituh[i][j]) {                        if (f % 2 == 0) {                            dituh[i][b] = dituh[i][j] * 2;                            dituh[i][j] = 0;                            t++;                            j++;                            b++;                            break;                        } else {                            f++;                            break;                        }                    } else {                        if (f >= 2 && f % 2 == 0 && t == 0) {                            f++;                        }                        break;                    }                }            }        }    }}

}

package com.lanou.wo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.RenderingHints.Key;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

import org.omg.CORBA.BooleanHolder;
import org.omg.CORBA.portable.BoxedValueHelper;
//2048JFrame布局类
public class TextMian extends JFrame {
Erlingsiba en = new Erlingsiba();

JLabel jl1 = new JLabel("");JLabel jl2 = new JLabel("");JLabel jl3 = new JLabel("");JLabel jl4 = new JLabel("");JLabel jl5 = new JLabel("");JLabel jl6 = new JLabel("");JLabel jl7 = new JLabel("");JLabel jl8 = new JLabel("");JLabel jl9 = new JLabel("");JLabel jl10 = new JLabel("");JLabel jl12 = new JLabel("");JLabel jl13 = new JLabel("");JLabel jl14 = new JLabel("");JLabel jl15 = new JLabel("");JLabel jl16 = new JLabel("");JLabel jl11 = new JLabel("");// 用JLabel标签来代表每个数字的块空间JLabel[][] jl = { { jl1, jl2, jl3, jl4 }, { jl5, jl6, jl7, jl8 }, { jl9, jl10, jl11, jl12 },        { jl13, jl14, jl15, jl16 } };JPanel w = new JPanel();JPanel p = new JPanel();Box box1 = Box.createVerticalBox();Box box2 = Box.createVerticalBox();JLabel fen = new JLabel("当前得分");JLabel fen1 = new JLabel("0");JLabel bu = new JLabel("当前步数");JLabel bu1 = new JLabel("0");int bushu = 0;String str;private void init() {    fen.setFont(new Font("微软雅黑", 1, 30));    fen.setForeground(Color.YELLOW);    fen1.setFont(new Font("微软雅黑", 1, 30));    fen1.setForeground(Color.YELLOW);    fen1.setSize(60, 30);    bu.setFont(new Font("微软雅黑", 1, 30));    bu.setForeground(Color.yellow);    bu1.setFont(new Font("微软雅黑", 1, 30));    bu1.setForeground(Color.yellow);    box1.add(fen);    box1.add(fen1);    box2.add(bu);    box2.add(bu1);    w.add(box1);    w.add(box2);}public void jlzu() {    p.setLayout(new GridLayout(4, 4, 5, 5));    // 给标签里加数字    for (int i = 0; i < jl.length; i++) {        for (int j = 0; j < jl[i].length; j++) {            if (en.ditu1[i][j].equals("0")) {                jl[i][j].setText("");            } else {                jl[i][j].setText(en.ditu1[i][j]);            }            String str = jl[i][j].getText();            // 数字根据位数来改变数字的大小            if (str.length() == 1) {                jl[i][j].setFont(new Font("微软雅黑", 1, 50));            } else if (str.length() == 2) {                jl[i][j].setFont(new Font("微软雅黑", 1, 35));            } else if (str.length() == 3) {                jl[i][j].setFont(new Font("微软雅黑", 1, 25));            } else if (str.length() == 4) {                jl[i][j].setFont(new Font("微软雅黑", 1, 18));            }            jl[i][j].setBackground(Color.getHSBColor(204, 192, 170));            // Font("字体",0正常1代表粗体,字的大小);            jl[i][j].setForeground(Color.blue);// 字体颜色            jl[i][j].setHorizontalAlignment(SwingConstants.CENTER);// 字体居中            jl[i][j].setOpaque(true);// 显现颜色            p.add(jl[i][j]);        }    }}//判断是否结束public void gameOver() {    boolean flag = true;    for (int i = 0; i < jl.length; i++) {        for (int j = 0; j < jl[i].length; j++) {            if (jl[i][j].getText().equals("")) {                flag = false;            }            if(i==0&&j>0&&j<jl[i].length-1){                if(jl[i][j].getText().equals(jl[i+1][j].getText())||jl[i][j].getText().equals(jl[i][j+1].getText())||jl[i][j].getText().equals(jl[i][j-1].getText())){                    flag=false;                }            }else if(i== jl.length-1&&j>0&&j<jl[i].length-1){                if(jl[i][j].getText().equals(jl[i-1][j].getText())||jl[i][j].getText().equals(jl[i][j+1].getText())||jl[i][j].getText().equals(jl[i][j-1].getText())){                    flag=false;                }            }else if(j== 0&&i>0&&i<jl.length-1){                if(jl[i][j].getText().equals(jl[i][j+1].getText())||jl[i][j].getText().equals(jl[i+1][j].getText())||jl[i][j].getText().equals(jl[i-1][j].getText())){                    flag=false;                }            }else if(j==jl[i].length-1 &&i>0&&i<jl.length-1){                if(jl[i][j].getText().equals(jl[i][j-1].getText())||jl[i][j].getText().equals(jl[i+1][j].getText())||jl[i][j].getText().equals(jl[i-1][j].getText())){                    flag=false;                }               }else if(i>0&&i<jl.length-1&&j<0&&j<jl[i].length-1){                if(jl[i][j].getText().equals(jl[i][j-1].getText())||jl[i][j].getText().equals(jl[i][j+1].getText())||jl[i][j].getText().equals(jl[i+1][j].getText())||jl[i][j].getText().equals(jl[i-1][j].getText())){                    flag=false;                }               }               }    }    if (flag) {        JOptionPane.showMessageDialog(null, "游戏结束,点击确认重新开始");        // 重新开始,就是将地图数字全部变为0重新生成随机数        for (int i = 0; i < en.ditu.length; i++) {            for (int j = 0; j < en.ditu[i].length; j++) {                en.ditu[i][j] = 0;                en.ditu1[i][j] = "0";            }        }        en.sunJi();        en.kaishi();        jlzu();        bushu = 0;        en.tr = "0";        bu1.setText(str);        fen1.setText(en.tr);        str = String.valueOf(bushu);        bu1.setText(str);    }}public TextMian() {    super("2048");    en.sunJi();    en.kaishi();    jlzu();    p.addKeyListener(new KeyAdapter() {        @Override        public void keyPressed(KeyEvent e) {            // 按键操作 进行上下左右来改变数字            switch (e.getKeyCode()) {            case KeyEvent.VK_UP:                en.shang();                break;            case KeyEvent.VK_DOWN:                en.xia();                break;            case KeyEvent.VK_LEFT:                en.zuo();                break;            case KeyEvent.VK_RIGHT:                en.you();                break;            default:                break;            }                    if(en.yihou()){                bushu--;            }            en.kaishi();            fen1.setText(en.tr);            bushu++;            str = String.valueOf(bushu);            bu1.setText(str);            jlzu();            if(en.tr.equals("2048")){                JOptionPane.showMessageDialog(null, "恭喜你玩到了2048,继续加油");            }            gameOver();        }    });    p.setFocusable(true);    this.setSize(400, 600);    this.setLocation(200, 200);    init();    p.setPreferredSize(new Dimension(360, 360));// 确定JOanel容器的大小    p.setBackground(Color.getHSBColor(187, 173, 160));    p.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 添加边框    p.setOpaque(true);    w.setPreferredSize(new Dimension(200, 200));    w.setBackground(Color.BLUE);    w.setOpaque(true);    this.add(w, BorderLayout.NORTH);// 给JFrame添加容器w,在布局    this.add(p, BorderLayout.SOUTH);    this.setVisible(true);    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {    new TextMian();}

}

`