• gui界面2048小游戏


    坑的地方

    JLabel色块要调透明

    方向键要用press方法

    主界面

    package game;
    
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import java.awt.GridLayout;
    import java.awt.Color;
    
    public class Game extends JFrame implements KeyListener{
    
        private JPanel contentPane;
        Block[][] block1=new Block[4][4];//色块
        GameSrc game=new GameSrc();//游戏类
        int[][] pane=new int[4][4];//游戏类的数据
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Game frame = new Game();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public Game() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(new GridLayout(4, 4, 5, 5));
            
            game.newgame();
            pane=game.getPane();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    block1[i][j]=new Block();
                    block1[i][j].setValue(pane[i][j]);
                    contentPane.add(block1[i][j]);
                }
            }
            this.addKeyListener(this);
    
        }
    
        @Override
        public void keyTyped(KeyEvent e) {}
    
        @Override
        public void keyPressed(KeyEvent e) {
            // TODO 自动生成的方法存根
            if(e.getKeyCode()==KeyEvent.VK_LEFT){
                game.left();
                pane=game.getPane();
                for(int i=0;i<4;i++){
                    for(int j=0;j<4;j++){
                        block1[i][j].setValue(pane[i][j]);
                    }
                }
                if(game.gameOver()==1){
                    JOptionPane.showMessageDialog(this, "you lose");
                }
            }
            else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
                game.right();
                pane=game.getPane();
                for(int i=0;i<4;i++){
                    for(int j=0;j<4;j++){
                        block1[i][j].setValue(pane[i][j]);
                    }
                }
                if(game.gameOver()==1){
                    JOptionPane.showMessageDialog(this, "you lose");
                }
            }
            else if(e.getKeyCode()==KeyEvent.VK_DOWN){
                game.low();
                pane=game.getPane();
                for(int i=0;i<4;i++){
                    for(int j=0;j<4;j++){
                        block1[i][j].setValue(pane[i][j]);
                    }
                }
                if(game.gameOver()==1){
                    JOptionPane.showMessageDialog(this, "you lose");
                }
            }
            else if(e.getKeyCode()==KeyEvent.VK_UP){
                game.up();
                pane=game.getPane();
                for(int i=0;i<4;i++){
                    for(int j=0;j<4;j++){
                        block1[i][j].setValue(pane[i][j]);
                    }
                }
                if(game.gameOver()==1){
                    JOptionPane.showMessageDialog(this, "you lose");
                }
            }
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO 自动生成的方法存根
            
        }
    
    }
    View Code

    本来逻辑代码

    package game;
    
    import java.util.Random;
    
    public class GameSrc{
        private int pane[][]=new int[4][4];    //棋盘
        int gameOver()    //显示棋盘
        {
            int gameOver=1;//   判断游戏结束条件
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    if(pane[i][j]==0){
                        gameOver=0;
                    }
                }
            }
            return gameOver;
        }
        int[][] getPane(){//返回数据
            return pane;
        }
        void newgame()    //开始游戏
        {
            for(int i=0;i<=3;i++)    //初始化棋盘
                for(int j=0;j<=3;j++)
                    pane[i][j]=0;
            
            Random random = new Random();
            int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
            int n=random.nextInt(4);
            int p=random.nextInt(4);
            int q=random.nextInt(4);
            
            //在随机的位置上产生初值2
            pane[m][n]=pane[p][q]=2;
        }
        void up(){//向上操作
            int i,j,three;
            boolean move=false;
            for(j=0;j<4;j++){  //上移动
                three=0;
                for(i=0;i<4;i++){
                    if(pane[i][j]>0){
                        if(i!=three)
                            move=true;
                        int t=pane[i][j];
                        pane[i][j]=0;
                        pane[three][j]=t;
                        three++;
                    }
                }
            }
            for(j=0;j<4;j++){  //合并数
                for(i=0;i<3;i++){
                    if(pane[i][j]==pane[i+1][j]&&pane[i][j]!=0){
                        move=true;
                        pane[i][j]=pane[i][j]*2;
                        pane[i+1][j]=0;
                        int k=i+1;
                        for(;k+1<=3&&pane[k+1][j]>0;k++){
                            pane[k][j]=pane[k+1][j];
                            pane[k+1][j]=0;
                        }
                    }
                }
            }
            if(move)
                random();//产生随机数
        }
        void low(){ //向下
            int i,j,three;
            boolean move=false;
            for(j=0;j<4;j++){//下移动 
                three=3;
                for(i=3;i>=0;i--){
                    if(pane[i][j]>0){
                        if(i!=three)
                            move=true;
                        int t=pane[i][j];
                        pane[i][j]=0;
                        pane[i+three-i][j]=t;
                        three--;
                    }
                }
            }
            for(j=0;j<4;j++){//合并数
                for(i=3;i>0;i--){
                    if(pane[i][j]==pane[i-1][j]&&pane[i][j]!=0){
                        move=true;
                        pane[i][j]=pane[i][j]*2;
                        pane[i-1][j]=0;
                        int k=i-1;
                        for(;k-1>=0&&pane[k-1][j]>0;k--){
                            pane[k][j]=pane[k-1][j];
                            pane[k-1][j]=0;
                        }
                    }
                }
            }
            if(move)
                random();    
        }
        void left(){//向左
            int i,j,three;
            boolean move=false;
            for(i=0;i<4;i++){//左移动
                three=0;
                for(j=0;j<4;j++){
                    if(pane[i][j]>0){
                        if(j!=three)
                            move=true;
                        int t=pane[i][j];
                        pane[i][j]=0;
                        pane[i][three]=t;
                        three++;
                    }
                }
            }
            for(i=0;i<4;i++){//合并数
                for(j=0;j<3;j++){
                    if(pane[i][j]==pane[i][j+1]&&pane[i][j]!=0){
                        move=true;
                        pane[i][j]=pane[i][j]*2;
                        pane[i][j+1]=0;
                        int k=j+1;
                        for(;k+1<=3&&pane[i][k+1]>0;k++){
                            pane[i][k]=pane[i][k+1];
                            pane[i][k+1]=0;
                        }
                    }
                }
            }
            if(move)
                random();
            
        }
        void right(){//右移
            int i,j,three;
            boolean move=false;
            for(i=0;i<4;i++){
                three=3;
                for(j=3;j>=0;j--){//右移动
                    if(pane[i][j]>0){
                        if(j!=three)
                            move=true;
                        int t=pane[i][j];
                        pane[i][j]=0;
                        pane[i][three]=t;
                        three--;
                    }
                }
            }
            for(i=0;i<4;i++){//合并数
                for(j=3;j>0;j--){
                    if(pane[i][j]==pane[i][j-1]&&pane[i][j]!=0){
                        move=true;
                        pane[i][j]=pane[i][j]*2;
                        pane[i][j-1]=0;
                        int k=j-1;
                        for(;k-1>=0&&pane[i][k-1]>0;k--){
                            pane[i][k]=pane[i][k-1];
                            pane[i][k-1]=0;
                        }
                    }
                }
            }
            if(move)
                random();
        }
        void random(){//产生随机数
            Random random = new Random();
            int m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
            int n=random.nextInt(4);
            for(;pane[m][n]!=0;){
                m=random.nextInt(4);//产生一个0到4(不包括4的随机数)
                n=random.nextInt(4);
            }
            if(random.nextBoolean())
                pane[m][n]=2;
            else 
                pane[m][n]=4;
        }
        
    
    }
    View Code

    色块代码

    package game;
    
    import javax.swing.*; 
    import java.awt.*; 
    public class Block extends JLabel  
    { 
      private int value; 
      public Block()  
      { 
        value = 0;//初始化值为0 
        setFont(new Font("font", Font.PLAIN, 40));//设定字体 
        setBackground(Color.gray);//设定初始颜色为灰色 
      } 
       
      public int getValue()//获取值 
      { 
        return value; 
      } 
       
      public void setValue(int value) 
      { 
        this.value = value; 
        String text = String.valueOf(value); 
        if (value != 0) 
          setText(text); 
        else
          setText("");//如果值为0则不显示
        setOpaque(true);
        setColor(); 
      } 
       
      public void setColor() //根据值的不同设定不同的背景颜色、label字体 
      {
        switch (value)  
          { 
        case 0: 
          setBackground(Color.gray); 
          break; 
        case 2: 
          setBackground(new Color(238, 228, 218)); 
          break; 
        case 4: 
          setBackground(new Color(238, 224, 198)); 
          break; 
        case 8: 
          setBackground(new Color(243, 177, 116)); 
          break; 
        case 16: 
          setBackground(new Color(243, 177, 116)); 
          break; 
        case 32: 
          setBackground(new Color(248, 149, 90)); 
          break; 
        case 64: 
          setBackground(new Color(249, 94, 50)); 
          break; 
        case 128: 
          setBackground(new Color(239, 207, 108)); 
          break; 
        case 256: 
          setBackground(new Color(239, 207, 99)); 
          break; 
        case 512: 
          setBackground(new Color(239, 203, 82)); 
          break; 
        case 1024: 
          setBackground(new Color(239, 199, 57)); 
          break; 
        case 2048: 
          setBackground(new Color(239, 195, 41)); 
          break; 
        case 4096: 
          setBackground(new Color(255, 60, 57)); 
          break; 
          } 
      } 
    }
    View Code
  • 相关阅读:
    openstack controller ha测试环境搭建记录(七)——配置glance
    openstack controller ha测试环境搭建记录(六)——配置keystone
    openstack controller ha测试环境搭建记录(五)——配置rabbitmq集群
    spring classpath & classpath*
    SVN相关
    eclipse安装springboot插件
    Hbase Shell常用命令
    CentOS下安装Hbase
    CentOS安装JDK-tar.gz文件
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/vhyc/p/6062182.html
Copyright © 2020-2023  润新知