鱼C论坛

 找回密码
 立即注册
查看: 1596|回复: 1

在这代码哪里加上异常处理合适

[复制链接]
发表于 2021-12-23 14:49:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
package game;

import game.Frame;

public class Maingame {
        public static void main(String[] args) {
            Frame game2048= new Frame();
               
        }
}



package game;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
public class Frame extends JFrame//调用窗口类的方法就要引用Jframe。

{
            private static int[][] block_Data = new int[4][4];
          //定义newData数组用于暂存处理中的数组
                  private static int[][] newData=new int[4][4];
          //定义newData2数组用于暂存移动前中的数组
                  private static int[][] newData2=new int[4][4];
            private static JLabel[][] block_Lable = new JLabel[4][4];        //与数组对应的标签
        //构造函数
        public Frame()
        {
                //初始化窗体大小位置等
                initBasic();
                //初始化空块
                initEmptyBlocks();
                //初始化两个初始值  到block_Data数组中,并设置block_Label中对应块的图像
                initData();
                //鼠标监听,设置窗口可关闭
                this.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e){
                                System.exit(0);
                        }
                });
                //键盘监听,获取方向键执行操作
                this.addKeyListener(new KeyAdapter(){
                public void keyPressed(KeyEvent event)
                {    int k =event.getKeyCode();
                //暂时先存好移动前的数组
                   for(int m=0; m<4; m++)
                      {  for(int n=0; n<4; n++)
                             {newData2[m][n]=block_Data[m][n];}
                      }
                        switch(k)
                        {
                        case 37:left(); break;
                        case 38:up();   break;
                        case 39:right();break;
                        case 40:down(); break;
                        }
                        yesornoMove();
               
                        boolean havemove =yesornoMove();
                        if(havemove==true)
                        {Frame.createOneRandomNumber();}
                        upDateUI(block_Data);
                        gamestate();
                }
        });
                //可视化
                setVisible(true);
        }
        private void initBasic()
        {
                this.setTitle("2048小游戏");       
                this.setSize(750, 800);               
                this.setLocation(700, 100);       
                this.setLayout(null);               
                this.setDefaultCloseOperation(EXIT_ON_CLOSE);        //设置窗体x为默认关闭窗口
        }       
        
        private void initEmptyBlocks()
        {
               
            
                for(int i=0; i<4; i++)
                {
                        for(int j=0; j<4; j++)
                        {
                               
                                block_Lable[j][i] = new JLabel(" ",JLabel.CENTER);
                                Font font = new Font("Verdana",Font.BOLD , 55);      
                                block_Lable[j][i].setFont(font);      
                                block_Lable[j][i].setForeground(Color.darkGray);       //设置文字的颜色
                                block_Lable[j][i].setBounds(10+i*180, 10+j*180, 160, 160);
                                block_Lable[j][i].setOpaque(true);
                                block_Lable[j][i].setBackground(Color.lightGray);
                                this.add(block_Lable[j][i]);
                        }
                }
        }
            
        //游戏开始时需调用两次生成随机块的方法
        public static void initData()
                {
                        for(int n=0; n<2; n++)
                        {
                                createOneRandomNumber();
                        }
                }
               
        public static void createOneRandomNumber()
                {
                        int i,j;
                        Random random = new Random();
                        //0到4之间的随机int值,包含0而不包含4,直到二维数组中有个元素为0
                        i = random.nextInt(4);
                        j = random.nextInt(4);
                        while(true)
                        {
                                if(block_Data[i][j] == 0)
                                {
                                        break;
                                }
                                else
                                {
                                        i = random.nextInt(4);
                                        j = random.nextInt(4);
                                }
                        }
                        block_Data[i][j]=2;
                        if(block_Data[i][j]!=0)
                        block_Lable[i][j].setText(block_Data[i][j]+"");
                        else
                        block_Lable[i][j].setText(" ");
                }
        public static void upDateUI(int[][] block_Data)
                {
               
                        for(int i=0; i<4; i++)
                        {
                                for(int j=0; j<4; j++)
                                {
                                        if(block_Data[i][j]!=0)
                                                block_Lable[i][j].setText(block_Data[i][j]+"");
                                                else
                                                block_Lable[i][j].setText(" ");
                                }
                        }
                }
        public static void reSetBlocks()
                {
                        for(int i=0; i<4; i++)
                        {
                                for(int j=0; j<4; j++)
                                {
                                        block_Data[i][j] = 0;
                                        if(block_Data[i][j]!=0)
                                                block_Lable[i][j].setText(block_Data[i][j]+"");
                                                else
                                                block_Lable[i][j].setText(" ");
                                }
                        }
                }
                        public void gamestate()
                        {
                                //胜利
                                for(int i=0; i<4; i++)
                                {
                                        for(int j=0; j<4; j++)
                                        {
                                                if(block_Data[i][j] == 1024)
                                                {
                                                       
                                                        int result = JOptionPane.showConfirmDialog(null, "你赢啦,再来一局?", "游戏结果",JOptionPane.YES_NO_OPTION);
                                                        //选择YES重新开始游戏
                                                        if(result == 0)
                                                        {
                                                                Frame.reSetBlocks();
                                                                Frame.initData();
                                                        }
                                                        //选择NO则退出游戏程序
                                                        else
                                                        {
                                                                System.exit(0);
                                                        }
                                                       
                                                }
                                        }
                                }
                                //失败
                                if(block_DataIsFull() && !canMove())
                                {
                                        int result = JOptionPane.showConfirmDialog(null, "竟然输了,再来一局?", "游戏结果", JOptionPane.YES_NO_OPTION);
                                        if(result == 0)
                                        {
                                                Frame.reSetBlocks();
                                                Frame.initData();
                                        }
                                        else
                                        {System.exit(0);}
                                        //return;
                                }
                        }
                        //空格是否以满函数
                        private boolean block_DataIsFull()
                        {
                                for(int i=0; i<4; i++)
                                {
                                        for(int j=0; j<4; j++)
                                        {
                                                if(block_Data[i][j] == 0)
                                                {
                                                        return false;
                                                }
                                        }
                                }
                                return true;
                        }
                        //是否可移动函数(格子已满情况下)
                        private boolean canMove()
                        {
                                for(int i=0; i<3; i++)
                                {
                                        for(int j=0; j<3; j++)
                                        {
                                                if(block_Data[i][j]==block_Data[i+1][j]||block_Data[i][j]==block_Data[i][j+1])
                                                        return true;
                                        }
                                }
                                for(int i=0; i<3; i++)
                                {
                                        //第4行左右相邻是否有相等的
                                        if(block_Data[3][i]==block_Data[3][i+1])
                                                return true;
                                        if(block_Data[i][3]==block_Data[i+1][3])
                                                return true;
                                }
                                //以上情况均没有,即不可移动
                                return false;
                        }
       
                       
                        private static boolean yesornoMove()
                        {
                                for(int i=0; i<4; i++)
                              {  
                                        for(int j=0; j<4; j++)
                                     {  if(block_Data[i][j]!=newData2[i][j])
                                        return true;
                                     }
                              }
                                return false;
                        }
                       
                        public  static void reverse()
                        {
                                for(int i=0; i<=3; i++)
                                        for(int j=0; j<=3; j++)
                            newData[i][j]=block_Data[3-i][3-j];
                               
                                for(int i=0; i<4; i++)
                                        for(int j=0; j<4; j++)
                                                block_Data[i][j]=newData[i][j];       
                        }
                       
                        public static void transpose()
                        {
                                for(int i=0; i<4; i++)
                                        for(int j=0; j<4; j++)
                                                newData[i][j]=block_Data[j][i];
                                for(int i=0; i<4; i++)
                                        for(int j=0; j<4; j++)
                                                block_Data[i][j]=newData[i][j];       
                        }
                        //移动覆盖函数(有0就移动并覆盖**默认左移**)
                        public static void coverup()
                        {
                        for(int k=0;k<=2;k++)
                                for(int i=0; i<4; i++)
                                        for(int j=0; j<3; j++)
                                                if(block_Data[i][j]==0)
                                                {
                                                        block_Data[i][j]=block_Data[i][j+1];
                                                        block_Data[i][j+1]=0;
                                                }
                               
                        }
                        //合并函数,每行有相同的就加起来**默认左移**
                        //放到靠左的元素里,靠右一个位置置0,默认coverup函数已执行
                        public static void merge()
                        {
                                for(int i=0; i<4; i++)
                                        for(int j=0; j<3; j++)
                                        if(block_Data[i][j]==block_Data[i][j+1]&&block_Data[i][j]!=0)
                                                {
                                                block_Data[i][j]=block_Data[i][j]*2;
                                                block_Data[i][j+1]=0;
                                                }
                        }
                        public static void up()
                        {
                                transpose();
                                coverup();
                                merge();
                                coverup();
                                transpose();
                        }
                public static void down()
                        {
                     transpose();
                     reverse();
                     coverup();
                         merge();
                         coverup();
                         reverse();
                                 transpose();
                        }
                public static void left()
                        {
                        coverup();
                        merge();
                        coverup();
                        }
                public static void right()
                        {
                        reverse();
                        coverup();
                        merge();
                        coverup();
                        reverse();
                        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-23 15:42:20 From FishC Mobile | 显示全部楼层
我想加一个异常处理。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表