gpt4 book ai didi

java - Java Swing 中的贪吃蛇游戏——我的蛇只会长大

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:27 24 4
gpt4 key购买 nike

我正在尝试在 Swing 中做经典的 Snake 游戏,我设法让 Snake 移动,但是当它移动时,它变得无限长,因为它永远不会擦掉它的尾部。

我一直在使用 validate()repaint() 但没有任何效果。

Problem

这是我的代码:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class controls extends JPanel implements KeyListener, ActionListener { // Amb aquestes dues implementacions, fem que el programa pugui rebre per teclat

// Mida serp
private int[] longXserp = new int[750];
private int[] longYserp = new int[750];

// Longitut inicial de la serp
private int serplong = 3;

// Moviments que fem
private int moviments = 0;

// Controls
private boolean esquerra = false;
private boolean dreta = false;
private boolean amunt = false;
private boolean avall = false;

// Gràfics de moviment
private ImageIcon serpesquerra;
private ImageIcon serpdreta;
private ImageIcon serpamunt;
private ImageIcon serpavall;

private Timer timer;
private int velocitatserp = 100;
private ImageIcon serp;

public controls() {
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
timer = new Timer(velocitatserp, this);
timer.start();
}

public void paint(Graphics g) { // Mètode amb el que imprimim per pantalla. Ha d'anomenar-se "paint", o si no, no funcionarà

if(moviments == 0) {

longXserp[2] = 50;
longXserp[1] = 75;
longXserp[0] = 100;

longYserp[2] = 100;
longYserp[1] = 100;
longYserp[0] = 100;
}


serpdreta = new ImageIcon("src/grafics/serpdreta.png");
serpdreta.paintIcon(this, g, longXserp[0], longYserp[0]);

for(int a = 0; a < serplong; a++) {

if(a == 0 && esquerra) {

serpesquerra = new ImageIcon("src/grafics/serpesquerra.png");
serpesquerra.paintIcon(this, g, longXserp[a], longYserp[a]);
}

if(a == 0 && dreta) {

serpdreta = new ImageIcon("src/grafics/serpdreta.png");
serpdreta.paintIcon(this, g, longXserp[a], longYserp[a]);
}

if(a == 0 && amunt) {

serpamunt = new ImageIcon("src/grafics/serpamunt.png");
serpamunt.paintIcon(this, g, longXserp[a], longYserp[a]);
}

if(a == 0 && avall) {

serpavall = new ImageIcon("src/grafics/serpavall.png");
serpavall.paintIcon(this, g, longXserp[a], longYserp[a]);
}

if(a != 0) {
serp = new ImageIcon("src/grafics/serp.png");
serp.paintIcon(this, g, longXserp[a], longYserp[a]);
}

}

g.dispose();
}


@Override
public void keyPressed(KeyEvent ke) {

if(ke.getKeyCode() == KeyEvent.VK_RIGHT){ // Si polses la tecla X, la seva variable boolean es posa en true
moviments++;
dreta = true;

if(!esquerra) {
dreta = true;
}

else {
dreta = false;
esquerra = true;
}

amunt = false;
avall = false;
}

if(ke.getKeyCode() == KeyEvent.VK_LEFT){
moviments++;
esquerra = true;

if(!dreta) {
esquerra = true;
}

else {
esquerra = false;
dreta = true;
}

amunt = false;
avall = false;
}

if(ke.getKeyCode() == KeyEvent.VK_UP){
moviments++;
amunt = true;

if(!avall) {
amunt = true;
}

else {
amunt = false;
avall = true;
}

esquerra = false;
dreta = false;
}

if(ke.getKeyCode() == KeyEvent.VK_DOWN){
moviments++;
avall = true;

if(!amunt) {
avall = true;
}

else {
amunt = true;
avall = false;
}

esquerra = false;
dreta = false;
}

}
@Override
public void keyReleased(KeyEvent ke) {
// TODO Auto-generated method stub

}
@Override
public void keyTyped(KeyEvent ke) {
// TODO Auto-generated method stub

}
@Override
public void actionPerformed(ActionEvent ae) {

timer.start();

if(dreta) {

for(int d = serplong-1; d>=0; d--) {
longYserp[d+1] = longYserp[d];
}

for(int e = serplong; e>= 0; e--) {
if(e==0) {
longXserp[e] = longXserp[e] + 25;
}

else {
longXserp[e] = longXserp[e-1];
}

if(longXserp[e] > 850) {
longXserp[e] = 25;

}
}

repaint(); // Mètode per refrescar els gràfics tornant a cridar al mètode paint(). Es usa quan es realitzan canvis sobre els gràfics
}

if(esquerra) {

for(int d = serplong-1; d>=0; d--) {
longYserp[d+1] = longYserp[d];
}

for(int d = serplong; d>= 0; d--) {
if(d==0) {
longXserp[d] = longXserp[d] - 25;
}

else {
longXserp[d] = longXserp[d-1];
}

if(longXserp[d] < 25) {
longXserp[d] = 850;

}
}

repaint();
}

if(amunt) {

for(int d = serplong-1; d>=0; d--) {
longXserp[d+1] = longXserp[d];
}

for(int d = serplong; d>= 0; d--) {
if(d==0) {
longYserp[d] = longYserp[d] - 25;
}

else {
longYserp[d] = longYserp[d-1];
}

if(longYserp[d] < 75) {
longYserp[d] = 625;

}
}

repaint();
}

if(avall) {

for(int d = serplong-1; d>=0; d--) {
longXserp[d+1] = longXserp[d];
}

for(int d = serplong; d>= 0; d--) {
if(d==0) {
longYserp[d] = longYserp[d] + 25;
}

else {
longYserp[d] = longYserp[d-1];
}

if(longYserp[d] > 625) {
longYserp[d] = 75;

}
}

repaint();
}
}
}

这几天我一直在努力找出问题所在。上面的代码有什么问题?

最佳答案

public void paint(Graphics g) { ..

这应该是:

public void paintComponent(Graphics g) { 
super.paintComponent(g); ..

注意两个重要区别:

  1. 为属于或扩展JComponent 的任何类覆盖paintComponent
  2. 自定义绘画时调用super方法删除之前的绘画。

现在我更仔细地查看代码的其他提示:

  1. serpdreta = new ImageIcon("src/grafics/serpdreta.png"); 这种资源加载不应该在 paint 方法中完成,预计在最短时间内完成.而是在构建类时加载图像并将它们存储为类的字段,以便在需要时使用。
  2. 但是当应用程序时,这条路径可能会失败。变成了一个 jar 。 src 目录通常不包含在内。
  3. 应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。一个必须通过 URL 而不是文件访问。查看info. page for embedded resource了解如何形成 URL。
  4. 如果应用程序。需要绘制图像,创建 Image 而不是 ImageIcon
  5. 为了在加载图像时获得更好的反馈,请使用 ImageIO.read(..) 而不是创建 ImageIcon,因为它会在 ImageIO 将提供有关任何问题原因的有用信息。
  6. 对于 Swing,我们通常使用 key bindings而不是较低级别的 KeyListener

关于java - Java Swing 中的贪吃蛇游戏——我的蛇只会长大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48663569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com