day11--java练习贪吃蛇

贪吃蛇游戏

一、图形界面

帧,如果时间片足够小,就是动画,一秒30帧

键盘监听

定时器Timer

二、逻辑编写

面板

数据中心

四步曲

定义数据

画上去

监听事件

public class GamePanel extends JPanel implements KeyListener,ActionListener {

    int[] snackx = new int[600];
    int[] snacky = new int[500];
    int length;  //小蛇长度
    boolean isStart;
    String fx ;   //控制方向
    Timer timer = new Timer(500,this);

    //随机生成食物
    int foodx;
    int foody;
    Random random = new Random();

    //失败判定
    boolean falure;

    //积分
    int score;

    public GamePanel(){
        this.setBackground(Color.WHITE);
        init();
        this.setFocusable(true);
        this.addKeyListener(this);
        timer.start();
    }

    public void init() {
        isStart = false;
        length = 3;
        //初始化小蛇坐标
        snackx[0] = 100;snacky[0] = 100;
        snackx[1] = 75;snacky[1] = 100;
        snackx[2] = 50;snacky[2] = 100;
        //初始化方向
        fx = "R";

        //随机生成食物
        foodx = 25 + 25* random.nextInt(37);
        foody = 75 + 25* random.nextInt(27);

        //失败判定初始化
        falure = false;
        //积分初始化
        score = 0;
        //初始化定时器
        timer.setDelay(500);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        //画头
        Data.head.paintIcon(this,g,25,5);
        //画游戏区
        g.setColor(Color.black);
        g.fillRect(25,75,950,675);

        //画食物
        Data.food.paintIcon(this,g,foodx,foody);

        //画小蛇
        //画蛇身
        for (int i = 1; i < length; i++) {
            Data.body.paintIcon(this,g,snackx[i],snacky[i]);
        }

        //画蛇头
        if (fx.equals("R")) {
            Data.right.paintIcon(this, g, snackx[0], snacky[0]);
        }else if (fx.equals("L")) {
            Data.left.paintIcon(this, g, snackx[0], snacky[0]);
        }else if (fx.equals("U")) {
            Data.up.paintIcon(this, g, snackx[0], snacky[0]);
        }else if (fx.equals("D")) {
            Data.down.paintIcon(this, g, snackx[0], snacky[0]);
        }


        //画文字
        if (!isStart){
            g.setFont(new Font("微软雅黑",Font.BOLD,48));
            g.setColor(Color.WHITE);
            g.drawString("按空格开始游戏!",350,300);
        }
        //画失败
        if (falure){
            g.setFont(new Font("微软雅黑",Font.BOLD,48));
            g.setColor(Color.RED);
            g.drawString("失败!按空格重新开始游戏!",250,300);
        }

        //画积分
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.setColor(Color.RED);
        g.drawString("长度:"+length,750,30);
        g.drawString("积分:"+score,750,55);
    }





    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == VK_SPACE){
            if (!falure) {
                isStart = !isStart;
            }else {
                init();
            }
            repaint();
        }

        if (keyCode == VK_UP){
            fx = "U";
        }else if (keyCode == VK_DOWN){
            fx = "D";
        }else if (keyCode == VK_LEFT){
            fx = "L";
        }else if (keyCode == VK_RIGHT){
            fx = "R";
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart && !falure){
            //吃食物
            if (snackx[0] == foodx && snacky[0] == foody){
                length++;
                score = score + 10 + 10*(length/10);
                int level = score / 100;
                System.out.println(level);
                switch (level){
                    case 0:
                        timer.setDelay(500);
                        break;
                    case 1:
                        timer.setDelay(400);
                        break;
                    case 2:
                        timer.setDelay(300);
                        break;
                    case 3:
                        timer.setDelay(200);
                        break;
                    case 4:
                        timer.setDelay(100);
                        break;
                    default:
                        timer.setDelay(50);
                        break;
                }
                //随机生成食物
                foodx = 25 + 25* random.nextInt(37);
                foody = 75 + 25* random.nextInt(27);
            }

            //更新蛇身坐标
            for (int i = length-1; i > 0; i--) {
                snackx[i]= snackx[i-1];
                snacky[i]= snacky[i-1];
            }
            //更新蛇头坐标

            if (fx.equals("R")) {
                if (snackx[0] < 950) {
                    snackx[0] = snackx[0] + 25;
                }else{
                    snackx[0] = 25;
                }
            }else if (fx.equals("L")) {
                if (snackx[0] > 25) {
                    snackx[0] = snackx[0] - 25;
                }else{
                    snackx[0] = 950;
                }
            }else if (fx.equals("U")) {
                if (snacky[0] > 75) {
                    snacky[0] = snacky[0] - 25;
                }else{
                    snacky[0] = 725;
                }
            }else if (fx.equals("D")) {
                if (snacky[0] < 725) {
                    snacky[0] = snacky[0] + 25;
                }else{
                    snacky[0] = 75;
                }
            }

            //失败判定
            for (int i = 1; i < length; i++) {
                if (snackx[0] == snackx[i] && snacky[0] == snacky[i]){
                    falure = true;
                }
            }

            repaint();
            timer.start();
        }
    }
}

posted @ 2022-04-24 00:28  LukeZhang_sz  阅读(42)  评论(0)    收藏  举报