zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/ebym/p/15680852.html
Copyright © 2011-2022 走看看