• JAVA学习day07


    贪吃蛇

    重新看了一遍JPanel,跟着做了贪吃蛇,比较简单的一个项目,由于先前工程实践已用JPanel写过三个游戏,所以跟着敲一边代码只算是练个手,今日总觉没学到什么,不过很期待每天的多线程,当时没学明白现在有机会重新理一遍甚是高兴。

    代码

    Data

    //数据中心
    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);
    }
    

    GamePanel

    • 没想到老师居然直接用本类继承接口,直接把本类做成监听器来addListener。。。。感觉实在是杂乱,有点不到位。
    • 学会timer的使用Timer timer = new Timer(*dalay:*100,*listener:*this);,用timer.start()控制开始;
    //游戏的面板
    public class GamePanel extends JPanel implements KeyListener, ActionListener {
    
        //定义蛇的数据结构
        int length;//蛇的长度
        int[] snakeX = new int[600];//蛇的x坐标25*25
        int[] snakeY = new int[600];//蛇的y坐标25*25
        String direction;//方向
    
        //食物的坐标
        int foodX;
        int foodY;
        Random random = new Random();
    
        //成绩
        int Score;
    
        //游戏当前状态:开始,停止
        boolean isStart = false;//游戏状态默认不开始
        boolean isFail = false;//游戏默认不失败
    
        //定时器 以毫秒为单位
        Timer timer = new Timer(100,this);//100ms执行一次
    
        //构造器
        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;
            direction = "R";//初始方向向右
    
            //食物初始化
            foodX = 25+25*random.nextInt(34);
            foodY = 75+25*random.nextInt(24);
    
            Score = 0;
        }
    
    
        //绘制面板,游戏中的所有东西都靠这个画笔
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);//清屏
    
            //绘制静态的面板
            this.setBackground(Color.WHITE);
    
            Data.header.paintIcon(this,g,25,11);//头部广告栏画上去
            g.fillRect(25,75,850,600);//默认的游戏界面
    
            //画积分
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,18));
            g.drawString("长度"+length,750,35);
            g.drawString("分数"+Score,750,55);
    
            //画食物
            Data.food.paintIcon(this,g,foodX,foodY);
    
            //把小蛇画上去
            if(direction.equals("R")){
                Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右,通过方向判断
            }else if (direction.equals("L")){
                Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右,通过方向判断
            }else if (direction.equals("U")){
                Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右,通过方向判断
            }else if (direction.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;
                }
            }
    
            //小蛇移动
            if(keyCode==KeyEvent.VK_UP){
                direction = "U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                direction = "D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                direction = "L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                direction = "R";
            }
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if(isStart && isFail == false){//如果游戏是开始状态,就让小蛇动!
    
                //吃食物
                if(snakeX[0]==foodX && snakeY[0]==foodY){
    
                    //长度+1
                    length++;
                    //分数+10
                    Score=Score+10;
                    //再次随机食物
                    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(direction.equals("R")){
                    snakeX[0]=snakeX[0]+25;
                    if(snakeX[0]>850){snakeX[0]=25;}//边界判断
                }else if (direction.equals("L")){
                    snakeX[0]=snakeX[0]-25;
                    if(snakeX[0]<25){snakeX[0]=850;}//边界判断
                }else if (direction.equals("U")){
                    snakeY[0]=snakeY[0]-25;
                    if(snakeY[0]<75){snakeY[0]=650;}
                }else if(direction.equals("D")){
                    snakeY[0]=snakeY[0]+25;
                    if(snakeY[0]>650){snakeY[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 keyTyped(KeyEvent e) {
        }
        @Override
        public void keyReleased(KeyEvent e) {
        }
    
    
    }
    
    

    StartGame

    
    //游戏的主启动类
    public class StartGame {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
    
            frame.setBounds(10,10,915,745);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            //正常游戏界面应该都在面上
            frame.add(new GamePanel());
    
            frame.setVisible(true);
        }
    }
    
    

    图片资源

    body

    down

    food

    header

    left

    right

    up

  • 相关阅读:
    画图(三,进阶之绘制表盘)
    浅谈 Fork/Join
    VS中卸载Visual Assist X
    VS中显示行号
    zabbix server安装(二)
    zabbix监控的基础概念、工作原理及架构(一)
    k8s role
    如何构建 Redis 高可用架构?
    Mysqldump参数大全
    kubespray 一键安装k8s集群
  • 原文地址:https://www.cnblogs.com/ebym/p/15680852.html
Copyright © 2020-2023  润新知