用java实现简易PC版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.*;
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,l5;                //用于判断游戏是否失败
    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();
        Create2();
    }

    /**
     * 按键输入事件的处理方法
     * @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();            //获取当前左1方块标签文本字符

                        if(str1.compareTo("") == 0){                //如果左1方块文本为空字符
                            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)){            //如果当前方块和左1方块文本字符相等
                            num  = Integer.parseInt(str);
                            scores += num;
                            times ++;
                            str = String.valueOf(2 * num);
                            texts[i][j-1].setText(str);        //左1方块文本字符变为两方块之和
                            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 = false;
        String str;

        if(times > 0){
            while(!r){
                i = random.nextInt(4);
                j = random.nextInt(4);
                str = texts[i][j].getText();
                if((str.compareTo("") == 0)){
                    texts[i][j].setIcon(icon2);
                    texts[i][j].setText("2");
                    setColor(i, j, "2");

                    times --;
                    r = true;
                    l1 = l2 = l3 = l4 = 0;
                }
            }
        }
        else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){        //l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
                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:
            break;
        }

    }

}
时间: 2024-11-12 06:16:47

用java实现简易PC版2048的相关文章

Java 多客户端版 2048 源码

byte包 Calss Byte 1 package Byte; 2 import java.io.*; 3 public class Byte implements Serializable{ 4 public static byte[] int2Byte(int []intValue){ 5 int length=intValue.length; 6 byte[] b=new byte[length*4]; 7 for(int i=0;i<length;i++){ 8 for(int j=0

从零開始开发Android版2048 (二)获取手势信息

今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了GestureDetector.这个类能够帮助我们获取一些常见的用户对屏幕的操作.比如单击.双击.按压.拖动等.详细的使用说明.大家能够查API也能够去百度,或者看我之前有一篇使用GestureDetector实现的小样例(http://blog.csdn.net/xiapinnong/article/det

从零开始开发Android版2048 (五) 撤销的实现

本篇的内容是,在前一篇的基础上加入了撤销的功能.撤销其实就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和对应的数字记录下来,当然还有分数,把这些数据写入一个栈中,然后点击撤销操作的时候,将栈顶pop掉,读取下一个栈中的对象,并根据对象中存储的数据重新绘制界面. 下面是我用于存储每次界面情况的类,在这个类中保存了界面中主要的三个数据,空白格.数字格和当前的分数. package com.example.t2048; import java.util.

屌丝也能开发安卓版2048(App Inventor)

想编写安卓游戏,java太难,来试试App Inventor,虽然有人认为他是中学生的玩具,但是也能编写2048这样的火爆游戏,不需要太复杂的算法. 整个游戏有几个模块: 一.游戏初始化 数列转化为图形,使用了canvas和精灵,相对应list,这里注意精灵位置是固定的,只是更改图片,多少分,就对于n.jpg,0分是底色图片.左右移动,使用了flung判断,绝对值判断,水平速度和垂直速度哪个大,用来判断是左右移动还是上下移动. 二.计分模块 一般计分在合并处增加,最高分用了tiny db,游戏结

从零开始开发Android版2048 (三)逻辑判断

最近工作比较忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑判断,经过本篇的讲解,基本上完成了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构.我在实现时,为了省事存储游戏过程中的变量主要用到的是List. 比如说:List<Integer> spaceList = new ArrayList<Integer>();这个spaceList主要用于保存,所有空白格的位置,也就是空白格在GridLayout中的位置(从0到15)

从零開始开发Android版2048 (一)初始化界面

自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学一点忘一点,效率太低.所以从今天開始.我打算实际做点小程序.在开发中不断地学习吧. 恰好近期Android上有个游戏2048比較火,所以就那这个练手吧. 由于对Android还没有太深入的了解,所以我写的东西都会比較基础,所以须要看一些高阶开发的朋友能够绕过了,也希望能够有高手们给我一些指导和建议,

nginx实现手机wap版和电脑pc版网站访问选择

需求:手机平板访问网站,跳转到手机WAP页面,电脑访问网站,跳转到电脑PC页面. 解决方法有好几种,大致分成两类,一是在服务器上实现,二是通过页面js实现.但能在服务器上实现的,就尽量不要在页面上实现.从网上搜索来几个代码先标注下. 方法一:nginx根据http_user_agent判断,在nginx.conf配置: 代码一: server {        listen       80;        server_name  localhost;        #charset koi8

vue.js介绍,常用指令,事件,以及制作简易留言版

一.vue是什么? 一个mvvm框架(库).和angular类似,比较容易上手.小巧,让我们的代码更加专注于业务逻辑,而不是去关注DOM操作 二.vue和angular之间的区别 vue--简单易学 指令以v-xx 一片html代码配合上json,再new出来vue实例 个人维护项目 适合:移动端项目,小巧 angular--上手难 指令以ng-xxx 所有属性和方法都挂在$scope身上 angular由google维护 适合:pc端项目 共同点:不兼容低版本的IE 三.vue的基本使用 1.

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException