Maison  >  Article  >  Java  >  Comment implémenter le jeu Snake en Java

Comment implémenter le jeu Snake en Java

醉折花枝作酒筹
醉折花枝作酒筹avant
2021-04-16 15:01:513930parcourir

Cet article vous donnera une introduction détaillée à la méthode d'implémentation du jeu Snake en Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comment implémenter le jeu Snake en Java

1. Structure du programme

  Le diagramme de structure du programme est le suivant :
Comment implémenter le jeu Snake en Java

2. 🎜 >

2.1 Classe de données

    Fonction : Connectez le dossier statique, convertissez les images du package de ressources statiques en icônes pour dessiner facilement sur le panneau.
  • Implémentation : utilisez la méthode class.getResource(String path).
  Le code est le suivant :

package com.snake;import javax.swing.*;import java.net.URL;public class Data {
    //贪吃蛇头部
    public static URL upUrl = Data.class.getResource("/statics/up.png");
    public static ImageIcon up = new ImageIcon(upUrl);
    public static URL downUrl = Data.class.getResource("/statics/down.png");
    public static ImageIcon down = new ImageIcon(downUrl);
    public static URL leftUrl = Data.class.getResource("/statics/left.png");
    public static ImageIcon left = new ImageIcon(leftUrl);
    public static URL rightUrl = Data.class.getResource("/statics/right.png");
    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);}

2.2 Classe StartGame

    Fonction : Créer une fenêtre de jeu et ajouter un panneau de jeu dans la fenêtre.
  • Implémentation : utilisez la classe JFrame pour créer une fenêtre de jeu et utilisez sa méthode add() pour ajouter un objet d'instanciation de classe GamePanel.
  Le code est le suivant :

package com.snake;import javax.swing.*;import java.awt.*;public class StartGame {
    public static void main(String[] args){
        //建立游戏窗口
        JFrame frame = new JFrame("Java-贪吃蛇小游戏");//标题
        frame.setSize(900,720);//窗口大小
        frame.setLocationRelativeTo(null);//窗口显示屏幕中间
        frame.setResizable(false);//固定窗口大小
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭事件
        frame.add(new GamePanel());//添加游戏内容
        frame.setVisible(true);//设置窗体可见
    }}

2.3 Classe GamePanel

    Fonction : Implémenter la page dynamique du jeu.
  • Implémentation : (1) méthode init() : initialiser la position du petit serpent ;
  •             (2) méthode eat() : utiliser des graines aléatoires pour randomiser la position de la nourriture et prendre une décision .La position de la nourriture ne peut pas être la même que celle du serpent. Les positions coïncident ;
    (3) Héritez de la classe JPanel, remplacez la méthode paintComponent(Graphics g) et dessinez la barre de titre, la position du serpent (dessinez le serpent). tête selon la variable de direction de la tête du serpent), et le corps du serpent dans la méthode, la barre de points, les éléments de rappel de jeu et les éléments de jugement d'échec
    (4) Implémentez la méthode keyPressed(KeyEvent e) dans l'interface KeyListener, obtenez saisie au clavier et modifiez l'état du jeu ou la variable de direction de la tête de serpent en fonction de la saisie au clavier ;
    (5) Implémentez la méthode actionPerformed(ActionEvent e) dans l'interface ActionListener, effectuez des opérations de mouvement du serpent en fonction de l'état et de la direction du jeu ; variables (notez que les opérations de tournage direct sont désactivées) et déterminent la consommation de nourriture et la mort. Utilisez le minuteur pour modifier dynamiquement le jeu et utilisez la méthode repaint() pour mettre à jour l'interface en temps réel.
      Le code est le suivant :
  • package com.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[] snakeX = new int[500];//贪吃蛇横坐标
        int[] snakeY = new int[500];//贪吃蛇纵坐标
        int foodX;//食物横坐标
        int foodY;//食物蛇纵坐标
        int length;//贪吃蛇的长度
        String  direction;//贪吃蛇头方向
        int score;//积分
        Random r = new Random();
        Timer timer = new Timer(100,this);
        boolean isStart;
        boolean isFail;
        //构造函数
        public GamePanel(){
            init();
            this.setFocusable(true);
            this.addKeyListener(this);
            timer.start();
        }
        private void init(){
            length=3;
            snakeX[0]=100;snakeY[0]=100;
            snakeX[1]=75;snakeY[1]=100;
            snakeX[2]=50;snakeY[2]=100;
            direction = "R";
            eat(foodX,foodY);
            isStart = false;
            isFail = false;
            score = 0;
    
        }
        private void eat(int x,int y){
            x= 25 + 25*r.nextInt(34);
            y= 75 + 25*r.nextInt(24);
            for (int i = 0; i < length; i++) {
                if(snakeX[i]==x&&snakeY[i]==y){
                    x = 25 + 25*r.nextInt(34);
                    y = 75 + 25*r.nextInt(24);
                }
            }
            foodX = x;foodY = y;
        }
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.setBackground(Color.white);//设置背景板为白色
            //画标题
            g.setColor(Color.GREEN);
            g.setFont(new Font("幼圆",Font.BOLD,50));
            g.drawString("贪吃蛇游戏",300,60);
            //绘制游戏区域
            g.setColor(Color.GRAY);
            g.fillRect(25,75,850,600);
            //画贪吃蛇头部
            if(direction=="R"){
                Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
            }
            else if(direction=="L"){
                Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
            }
            if(direction=="U"){
                Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
            }
            else if(direction=="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]);
            }
            //画食物
            Data.food.paintIcon(this,g,foodX,foodY);
            //绘制积分栏
            g.setColor(Color.BLACK);
            g.setFont(new Font("幼圆",Font.BOLD,20));
            g.drawString("长度:"+length,730,30);
            g.drawString("得分:"+score,730,60);
            //游戏开始提醒
            if(isStart==false){
                g.setColor(Color.BLACK);
                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_LEFT&&direction!="R"){
                direction = "L";
            }
            else if(keyCode==KeyEvent.VK_RIGHT&&direction!="L"){
                direction = "R";
            }
            else if(keyCode==KeyEvent.VK_UP&&direction!="D"){
                direction = "U";
            }
            else if(keyCode==KeyEvent.VK_DOWN&&direction!="U"){
                direction = "D";
            }
        }
        @Override
        public void keyReleased(KeyEvent e) {
    
        }
        @Override
        public void keyTyped(KeyEvent e) {
        }
    
    
        @Override
        public void actionPerformed(ActionEvent e) {
            //判断游戏状态
            if(isStart&&!isFail){
                //移动身体
                for (int i = length-1; i > 0 ; i--) {
                    snakeX[i] = snakeX[i-1];
                    snakeY[i] = snakeY[i-1];
                }
                //移动头部
                if(direction=="R"){
                    snakeX[0] += 25;
                    if(snakeX[0]>850){
                        snakeX[0] = 25;
                    }
                }
                else  if(direction=="L"){
                    snakeX[0] -= 25;
                    if(snakeX[0]<25){
                        snakeX[0] = 850;
                    }
                }
                else  if(direction=="U"){
                    snakeY[0] -= 25;
                    if(snakeY[0]<75){
                        snakeY[0] = 650;
                    }
                }
                else  if(direction=="D"){
                    snakeY[0] += 25;
                    if(snakeY[0]>650){
                        snakeY[0] = 75;
                    }
                }
                //吃食物
                if(snakeX[0]==foodX&&snakeY[0]==foodY){
                    length++;
                    score += 10;
                    eat(foodX,foodY);
                }
                //死亡判定
                for (int i = 1; i < length; i++) {
                    if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                        isFail=true;
                    }
                }
                repaint();
            }
            timer.start();
        }}
3. Affichage du jeu

Comment implémenter le jeu Snake en Java

Recommandé : "

Tutoriel vidéo Java "

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer