Java Swing中的蛇游戏-我的蛇只会成长
我试图在Swing中玩经典的蛇游戏,我设法让蛇移动,但当它移动时,它会变得无限长,因为它从不擦去尾巴 我一直在使用Java Swing中的蛇游戏-我的蛇只会成长,java,swing,custom-painting,embedded-resource,Java,Swing,Custom Painting,Embedded Resource,我试图在Swing中玩经典的蛇游戏,我设法让蛇移动,但当它移动时,它会变得无限长,因为它从不擦去尾巴 我一直在使用validate()和repaint()但没有任何效果 这是我的代码: import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.Key
validate()
和repaint()
但没有任何效果
这是我的代码:
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();
}
}
}
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.ImageIcon;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类控件扩展了JPanel实现KeyListener、ActionListener{//Amb aquestes dues实现,fem que el programa pugui rebre per teclat
//迈达塞普
private int[]longXserp=new int[750];
私有整数[]longYserp=新整数[750];
//拉塞普市政府
私有整数序列=3;
//动画
私有int moviments=0;
//控制
私有布尔值esquerra=false;
私有布尔值dreta=false;
私有布尔值amunt=false;
私有布尔值avall=false;
//运动场
私人图像图标serpesquerra;
私人图像图标serpdreta;
私人图像图标serpamunt;
私人图像图标serpavall;
私人定时器;
私有int velocitatserp=100;
专用图像图标serp;
公共控制(){
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);
定时器=新定时器(velocitatserp,this);
timer.start();
}
公共空间油漆(图g){//Mètode amb el que imprimim per pantalla.Ha d'anomenar-se“油漆”,没有,没有功能
if(moviments==0){
longXserp[2]=50;
longXserp[1]=75;
longXserp[0]=100;
longYserp[2]=100;
longYserp[1]=100;
longYserp[0]=100;
}
serpdreta=新图像图标(“src/grafics/serpdreta.png”);
serpdreta.paintIcon(this,g,longXserp[0],longYserp[0]);
对于(int a=0;a=0;d--){
longYserp[d+1]=longYserp[d];
}
对于(int e=serplong;e>=0;e--){
如果(e==0){
longXserp[e]=longXserp[e]+25;
}
否则{
longXserp[e]=longXserp[e-1];
}
如果(longXserp[e]>850){
longXserp[e]=25;
}
}
repaint();//Mètode per refrescar els gráfics tornant a cridar al Mètode paint().美国的一家实体店可以出售sobre els gráfics
}
如果(埃斯奎拉){
对于(int d=serplong-1;d>=0;d--){
longYserp[d+1]=longYserp[d];
}
对于(int d=serplong;d>=0;d--){
如果(d==0){
longXserp[d]=longXserp[d]-25;
}
否则{
longXserp[d]=longXserp[d-1];
}
if(longXserp[d]<25){
longXserp[d]=850;
}
}
重新油漆();
}
如果(阿蒙特){
对于(int d=serplong-1;d>=0;d--){
longXserp[d+1]=longXserp[d];
}
对于(int d=serplong;d>=0;d--){
如果(d==0){
longYserp[d]=longYserp[d]-25;
}
否则{
longYserp[d]=longYserp[d-1];
}
if(longYserp[d]<75){
longYserp[d]=625;
}
}
重新油漆();
}
如果(avall){
对于(int d=serplong-1;d>=0;d--){
longXserp[d+1]=longXserp[d];
}
对于(int d=serplong;d>=0;d--){
public void paint(Graphics g) { ..
public void paintComponent(Graphics g) {
super.paintComponent(g); ..