编程语言
首页 > 编程语言> > Java基础学习191223(异常捕获机制,自定义异常,GUI图形化编程,贪吃蛇)

Java基础学习191223(异常捕获机制,自定义异常,GUI图形化编程,贪吃蛇)

作者:互联网

Java基础学习191223

[学习视频转自狂神说Java] (https://blog.kuangstudy.com)

异常捕获机制

异常处理五个关键字

Java把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。Throwable包含Error和Exception两大类。

​ 快捷键ctrl+alt+t

package study.exception;

public class demo01 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {//try监控区域
            System.out.println(a/b);
        } catch (Exception e) {//catch捕获异常
            e.printStackTrace();
        } finally {//处理善后工作
            System.out.println("Finally");
        }
    }
}

主动抛出的异常,一般在方法中使用throw,方法上使用throws

package study.exception;

public class test {
    public static void main(String[] args) {
        try {
            new test().Test(1, 0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }

    public void Test(int a, int b) throws ArithmeticException {
        if (b == 0) {
            throw new ArithmeticException();
        }
    }
}

自定义异常

package study.exception;
//自定义异常类
public class Myexception extends Exception {
    //传递数字大于10则抛出异常
    private int detail;
    public Myexception(int a){
        this.detail = a;
    }
    //toString :异常的打印信息
    public String toString(){
        return "Myexception{"+"detail="+detail+"}";
    }
}
package study.exception;

public class test1 {
    //可能会存在异常的方法
    static void test(int a)throws  Myexception{
        System.out.println("传递的参数为:"+a);
        if (a>10){
            throw new Myexception(a);
        }
        System.out.println("ok");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (Myexception e) {
            System.out.println("Myexception=>"+e);
        }
    }
}

GUI编程

AWT

  1. Frame 是一个顶级窗口
  2. Panel无法单独显示,必须添加到某个容器中
  3. 布局管理器
    1. 流式
      1. 东西南北中
      2. 表格
  4. 大小,定位,背景颜色,可见性,监听
  5. 先思考如何设计在写代码,重要在于如何拼接

Swing

编程思路

  1. 定义数据
  2. 画上去
  3. 监听事件
    1. 键盘
    2. 事件

创建对象alt+enter

贪吃蛇

package study.snake;

import javax.swing.*;
//游戏的主启动类
public class StartGame {
    public static void main(String[] args) {
        JFrame frame = new JFrame("贪吃蛇小游戏");
        frame.setBounds(10,10,900,720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


        //正常游戏界面应该在画板上
        frame.add(new GamePanel());
        frame.setVisible(true);
    }
}
package study.snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
  //定义蛇的数据结构
    int length;//蛇的长度
    int[] snakeX =new int[600];
    int[] snakeY =new int[500];
    String fx;
    //食物的坐标
    int foodx;
    int foody;
    //成绩
    int score ;
    Random random = new Random();
    //游戏当前的状态 开始,停止
    boolean isStart = false;//默认是不开始
    boolean isFail = false;//游戏失败状态判断

    //定时器  ,100ms执行一次,监视这个对象
    Timer timer = new Timer(100,this);



    //初始化,构造器
    public GamePanel(){
        init();
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();//游戏一开始就开始定时
    }

    //初始化方法
    public void init(){
        length = 3;
        snakeX[0] = 100;snakeY[0] = 100;//脑袋的坐标
        snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标
        snakeX[2] = 50;snakeY[2] = 100;//第二个身体的坐标
        fx ="R";//初始的方向向右
        //随机食物
        foodx = 25 + 25*random.nextInt(34);
        foody = 75 + 25*random.nextInt(24);

        score = 0;
    }




    //绘制面板,我们游戏中的所有东西,都是用这个画笔来画

    @Override
    public void paintComponents(Graphics g) {
        super.paintComponents(g);//清屏
        this.setBackground(Color.WHITE);
        Data.header.paintIcon(this,g,25,11);//头部广告栏画上去
        g.fillRect(25,75,850,600);

        //画食物
        Data.food.paintIcon(this,g,foodx,foody);
        //画积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度"+length,750,35);
        g.drawString("分数"+score,750,50);

        //把小蛇画上去
        if (fx.equals("R")){
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头的坐标
        }else if (fx.equals("L")){
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头的坐标
        }else if (fx.equals("U")){
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头的坐标
        }else if (fx.equals("D")){
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头的坐标
        }


        for (int i = 1; i <length ; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);//身体的坐标
        }

        //游戏状态
        if (isStart==false){
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格开始游戏",300,300);
        }
        if (isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("失败,按下空格重新开始",300,300);
        }
    }



    @Override//键盘监听事件
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();//获得键盘按键是哪一个
        if (keyCode == KeyEvent.VK_SPACE){
            if (isFail){
                //重新开始
                isFail = false;
                init();
            }else {//如果按下的是空格键
                isStart =! isStart;//取反
            }
            repaint();
        }
        //小蛇移动
        if (keyCode==KeyEvent.VK_UP){
            fx = "U";
        }if (keyCode==KeyEvent.VK_DOWN){
            fx = "D";
        }if (keyCode==KeyEvent.VK_LEFT){
            fx = "L";
        }if (keyCode==KeyEvent.VK_RIGHT){
            fx = "R";
        }

    }


    @Override//事件监听   .....  需要通过固定事件来刷新
    public void actionPerformed(ActionEvent e) {
    if (isStart && isFail == false){//如果游戏是开始状态就让小蛇动起来
        //吃食物
        if (snakeX[0]==foodx && snakeY[0]==foody){
            //长度加一
            length++;
            score = score+10;
            //z再次随机食物
            foodx = 25 + 25*random.nextInt(34);
            foody = 75 + 25*random.nextInt(24);

        }

        for (int i = length-1; i>0; i--) {//后一节移到前一节位置
            snakeX[i] = snakeX[i-1];
            snakeY[i] = snakeY[i-1];
        }
        //走向
        if (fx.equals("R")){
            snakeX[0] = snakeX[0] +25;
            if (snakeX[0]>850){//边界判断
                snakeX[0] = 25;
            }
        }else if (fx.equals("L")){
            snakeX[0] = snakeX[0]-25;
            if (snakeX[0]<25){//边界判断
                snakeX[0] = 850;}
        }else if (fx.equals("U")){
            snakeY[0] = snakeY[0]-25;
            if (snakeY[0]<75){//边界判断
                snakeX[0] = 650;}
        }else if (fx.equals("D")){
            snakeY[0] = snakeY[0]+25;
            if (snakeX[0]>650){//边界判断
                snakeX[0] = 75;}
        }
        //失败判断,头和身体重合就死
        for (int i = 1; i <length ; i++) {
            if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
                isFail = true;
            }
        }

        repaint();//重画页面
    }
    timer.start();//定时器开启

    }
    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

}
package study.snake;

import javax.swing.*;
import java.net.URL;

//数据中心
public class Data {

    //相对路径 tx.jpg
    //绝对路径  加上/
    public static URL headerURL = Data.class.getResource("statics/header.png");
    public static ImageIcon header = new ImageIcon(headerURL);

    public static URL upURL = Data.class.getResource("statics/up.png");
    public static URL downURL = Data.class.getResource("statics/down.png");
    public static URL leftURL = Data.class.getResource("statics/left.png");
    public static URL rightURL = Data.class.getResource("statics/right.png");

    public static ImageIcon up = new ImageIcon(upURL);
    public static ImageIcon down = new ImageIcon(downURL);
    public static ImageIcon left = new ImageIcon(leftURL);
    public static ImageIcon right= new ImageIcon(rightURL);

    public static URL bodyURL = Data.class.getResource("statics/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);
    public static URL foodURL = Data.class.getResource("statics/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);
}

标签:ImageIcon,自定义,int,snakeX,public,static,new,异常,图形化
来源: https://www.cnblogs.com/litingblog/p/12088902.html