Java中的蛇游戏-蛇离开空间

我正在制作一个蛇游戏,很好,完成了,我可以导出它和所有东西。只是一个简单的问题;无论什么原因,每次身体部位增加时,蛇都会留下空间。我没有计算出确切的数量,但是每次身体部位增加时,尾巴都会留下更多的空间。我试图寻找问题。

我正在制作一个蛇游戏,很好,完成了,我可以导出它和所有东西。只是一个简单的问题;无论什么原因,每次身体部位增加时,蛇都会留下空间。我没有计算出确切的数量,但是每次身体部位增加时,尾巴都会留下更多的空间。我试图寻找问题。

这是我的第一个游戏项目,所以请不要评判我的 xd。

这些是密码.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.sql.Time;
import java.util.Random;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements ActionListener {
    static final int SCREEN_HEIGHT = 600;
    static final int SCREEN_WIDTH = 600;
    static final int UNIT_SIZE = 25;
    static final int GAME_UNITS = (SCREEN_HEIGHT*SCREEN_WIDTH)/UNIT_SIZE;
    static final int DELAY = 175;
    final int x[] = new int [GAME_UNITS];
    final int y[] = new int [GAME_UNITS];
    int bodyParts = 1;
    int applesEaten;
    int appleX;
    int appleY;
    char direction = 'R';
    boolean running = false;
    Timer timer;
    Random random;
    private Image tail;
    private Image apple;
    private Image head;
    GamePanel() {
        random = new Random();
        this.setPreferredSize(new Dimension(SCREEN_HEIGHT,SCREEN_WIDTH));
        this.setBackground(Color.black);
        this.setFocusable(true);
        this.addKeyListener(new MyKeyAdapter());
        startGame();
        loadImages();
    }
    public void startGame() {
        running = true;
        newApple();
        Timer timer = new Timer(DELAY,this);
        timer.start();
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw(g);
    }
    private void loadImages() {
        ImageIcon iid = new ImageIcon("src/res/tail.png");
        tail = iid.getImage();
        ImageIcon iia = new ImageIcon("src/res/apple.png");
        apple = iia.getImage();
        ImageIcon iih = new ImageIcon("src/res/head.png");
        head = iih.getImage();
    }
    public void draw(Graphics g) {
        g.setColor(Color.red);
        for (int i = 0; i < SCREEN_HEIGHT/UNIT_SIZE; i++) {
            //g.drawLine(i*UNIT_SIZE, 0 , i*UNIT_SIZE, SCREEN_HEIGHT);
           // g.drawLine(0, i*UNIT_SIZE, SCREEN_WIDTH, i*UNIT_SIZE); //grids
        }
        g.drawImage(apple, appleX, appleY, this);  //apple
        for (int z = 0; z < bodyParts; z++) {
            if (z == 0) {
                g.drawImage(head, x[z], y[z], this);
            } else {
                g.drawImage(tail, x[z], y[z], this);
            }
        }
        Toolkit.getDefaultToolkit().sync();
    }
    public void newApple() {
        appleX = random.nextInt((SCREEN_WIDTH/UNIT_SIZE))*UNIT_SIZE;
        appleY = random.nextInt((SCREEN_HEIGHT/UNIT_SIZE))*UNIT_SIZE;
    }
    public void move() {
        for(int z = bodyParts;z>0;z--) {
            x[z] = x[(z-1)];
            y[z] = y[(z-1)];
            switch(direction) {
            case 'U':
                y[0] -= UNIT_SIZE;
                break;
            case 'D':
                y[0] += UNIT_SIZE;
                break;
            case 'L':
                x[0] -= UNIT_SIZE;
                break;
            case 'R':
                x[0] += UNIT_SIZE;
                break;
            }
        }
    }
    public void checkApple() {
        if((x[0] == appleX) && (y[0] == appleY)) {
            bodyParts++;
            applesEaten++;
            newApple();
        }
    }
    public void checkCollisions() {
        //checks if head collides with body
        for(int i = bodyParts;i<0;i--) {
            if((x[0] == x[i])&& (y[0] == y[i])) {
                running = false;
            }
        }
        //checks if head touches left border
        if(x[0] < 0) {
            running = false;
        }
        //check if head touches right border
        if(x[0] > SCREEN_WIDTH) {
            running = false;
        }
        //check if head touches top border
        if(y[0] < 0) {
            running = false;
        }
        //check if head touches bottom border
        if(y[0] > SCREEN_HEIGHT) {
            running = false;
        }
        if(!running) {
            timer.stop();
        }
    }
    public void gameOver(Graphics g) {
        
        
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(running) {
            move();
            checkApple();
            checkCollisions();
            loadImages();
        }
        repaint();
    }
    public class MyKeyAdapter extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            switch(e.getKeyCode()) {
            case KeyEvent.VK_LEFT:
                if(direction != 'R') {
                    direction = 'L';
                }
                break;
            case KeyEvent.VK_RIGHT:
                if(direction != 'L') {
                    direction = 'R';
                }
                break;
            case KeyEvent.VK_UP:
                if(direction != 'D') {
                    direction = 'U';
                }
                break;
            case KeyEvent.VK_DOWN:
                if(direction != 'U') {
                    direction = 'D';
                }
                break;
            }
        }
    }
}

这是当 bodyParts =2bodyParts = 2;

并且,这是当 bodyParts =3bodyParts = 3;

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(929)
Web服务和ssh之间有什么区别
上一篇
数量的 Java百分比
下一篇

相关推荐

  • java游戏下载器:下载最新的Java游戏,体验不一样的乐趣!

    Java游戏下载器是一种用于从网络上下载Java游戏的客户端程序。它可以帮助用户快速、安全地下载Java游戏,并将它们保存到本地磁盘上。…

    2023-01-13 07:05:24
    0 73 27
  • java质数判断:如何使用Java判断质数

    质数(prime number)又称素数,指在大于1的自然数中,除了1和它本身以外不再有其他因数。Java代码如下:…

    2023-01-27 13:26:28
    0 93 22
  • java游戏盒子:玩转Java游戏盒子,体验不一样的乐趣!

    Java游戏盒子是一种特殊的Java应用程序,它可以把多个Java小游戏集中在一起,方便玩家管理和运行这些游戏。代码如下:…

    2023-01-28 09:18:41
    0 91 68
  • java递归详解一种解决问题的有效方法

    Java递归是一种编程技术,它允许一个函数调用自身。它使用一个或多个参数,以便在每次调用时将其状态更改,以便最终到达基本情况,从而终止递归。…

    2023-01-26 11:53:11
    0 38 25
  • java监控:如何使用Java监控提升应用性能

    Java监控是一种方法,用于监视Java应用程序的性能和可用性。它可以帮助开发人员了解Java应用程序的运行情况,并在发生问题时及时采取行动。Java监控可以通过多种方式来实现,例如使用Java虚拟机(JVM)内置的监控工具,使用第三方监控工具,或者使用自定义代码来实现。…

    2023-01-07 14:45:39
    0 98 63
  • java开发游戏培训从入门到精通

    示例示例Java开发游戏培训是一种使用Java语言开发游戏的培训课程,旨在帮助学习者掌握如何使用Java语言开发游戏。该培训课程将介绍Java语言的基本概念,包括变量、数据类型、流程控制、函数、类、对象、继承、接口、异常处理等。学习者还将学习如何使用Java语言开发游戏,包括游戏设计、游戏开发、游戏测试和游戏发布等。…

    2023-01-02 03:08:06
    0 21 28
  • java在线中文视频从入门到精通

    Java在线中文视频是指使用Java语言开发的在线视频,它可以在互联网上播放和浏览,而无需下载。它可以使用HTML5、Flash Player或其他技术来实现。…

    2023-01-20 12:32:35
    0 83 77
  • java数据库是什么:如何使用Java来构建强大的数据库系统

    Java数据库是一种使用Java编写的数据库,它可以在Java虚拟机上运行,并且可以使用Java API来访问和操作数据库。它允许开发人员使用Java语言来创建和管理数据库,而无需学习SQL。…

    2023-01-20 02:42:24
    0 11 53

发表评论

登录 后才能评论

评论列表(65条)