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;

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

(613)
如何用颤振将一个容器夹在另一个容器上 (lofg)
上一篇
Apple-暂停/退款应用内自动续订订阅
下一篇

相关推荐

  • java语法手册:Java 8 新特性

    Java语法手册是一份指导文档,用于提供有关Java编程语言的语法规则和示例代码。它包括Java语言的基础知识,如变量,数据类型,控制结构,函数,类,接口,异常处理,注释,泛型,集合,IO流等。它还提供了有关Java标准库,如java.util,java.io,java.lang等的信息。…

    2023-04-23 09:52:54
    0 24 41
  • java double转long:如何使用Java将Double转换为Long

    将double类型转换为long类型,可以使用java.lang.Math的round()方法。该方法将参数四舍五入为最接近的long值。…

    2023-04-25 14:05:17
    0 28 73
  • java开发笔记本配置从入门到精通

    示例示例基本配置:• 操作系统:Windows 或 Mac OS X…

    2023-11-22 04:42:27
    0 86 91
  • java转置矩阵:Java实现的矩阵转置功能

    转置矩阵是指将一个矩阵的行向量和列向量互换,即将原来的m行n列变成n行m列。Java代码如下:…

    2023-04-26 05:37:19
    0 24 66
  • java 参数加密:使用Java实现的安全参数加密

    示例示例Java 参数加密是指在 Java 中通过使用加密算法来加密参数值,以防止参数被篡改或泄露。代码示例:…

    2023-06-15 11:25:06
    0 77 91
  • java rsa私钥加密:使用RSA私钥加密保护数据安全

    Java RSA私钥加密是一种非对称加密算法,它使用一对公钥和私钥,其中公钥用于加密数据,而私钥用于解密数据。下面提供一个使用Java实现RSA私钥加密的代码示例:…

    2024-10-10 03:33:34
    0 41 59
  • java可以做硬件开发吗实现技术革新的利器

    示例示例答: 不能。Java是一种面向对象的跨平台编程语言,它本身不支持硬件开发,也不能直接操作硬件设备。例如,Java不能直接操作CPU或内存,也不能直接操作串口、I2C或SPI等硬件接口。Java不能用于硬件开发。…

    2023-04-26 04:54:53
    0 53 91
  • java开发软件培训多少钱:java开发软件培训价格攻略

    Java开发软件培训的价格因地区、机构、课程内容而异,一般在几百元到几千元不等。例如,深圳市某软件培训机构提供的Java开发软件培训课程,课程费用为1580元/人。…

    2023-05-25 16:13:41
    0 61 44

发表评论

登录 后才能评论

评论列表(17条)