java贪吃蛇问题求助
看教程写了个不完整的贪吃蛇程序,可是除了点问题找不到哪里错了,请高手帮忙看下,蛇走过的痕迹不会抹去。。。。。程序代码:
第一个class 是snakeWin package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.util.List; public class snakeWin extends JPanel implements ActionListener,KeyListener{ JButton newGame , stopGame; int point=0 , Speed=0; boolean Start = false; Random r = new Random(); int rx = 0 , ry = 0 ; List<snakeAct> list = new ArrayList<snakeAct>(); public snakeWin() { newGame = new JButton("开始"); stopGame = new JButton("退出"); this.setLayout(new FlowLayout(FlowLayout.LEFT)); newGame.addActionListener(this); stopGame.addActionListener(this); this.addKeyListener(this); this.add(newGame); this.add(stopGame); } public void paintComponent(Graphics g) { super.paintComponents(g); g.drawRect(10 , 40 , 400 , 300); g.drawString("分数: " +point, 150, 25); g.drawString("速度: " +Speed, 220, 25); g.setColor(new Color(0,255,0)); if(Start){ g.fillRect(10+rx*10, 40+ry*10, 10, 10); g.setColor(new Color(255,0,0)); for(int i=0 ; i<list.size(); i++){ g.fillRect(10+list.get(i).getX()*10, 40+list.get(i).getY()*10, 10, 10); } } } public void actionPerformed(ActionEvent e) { if (e.getSource()==newGame){ newGame.setEnabled(false); Start = true; rx = r.nextInt(40);ry = r.nextInt(30); snakeAct tempAct = new snakeAct(); tempAct.setX(20); tempAct.setY(15); list.add(tempAct); requestFocus(true); repaint(); } if (e.getSource()==stopGame){ System.exit(0); } } private void eat(){ if(rx==list.get(0).getX()&&ry==list.get(0).getY()) { rx = r.nextInt(40);ry = r.nextInt(30); snakeAct tempAct = new snakeAct(); tempAct.setX(list.get(list.size()-1).getX()); tempAct.setY(list.get(list.size()-1).getY()); list.add(tempAct); } } public void otherMove(){ snakeAct tempAct = new snakeAct(); for(int i=0; i<list.size(); i++){ if(i==1){ list.get(i).setX(list.get(0).getX()); list.get(i).setY(list.get(0).getY()); }else if(i>1){ tempAct = list.get(i-1); list.set(i-1, list.get(i)); list.set(i, tempAct); } } } public void move(int x , int y){ if (minYes(x,y)){ list.get(0).setX(list.get(0).getX()+x); list.get(0).setY(list.get(0).getY()+y); eat(); repaint(); }else { } } public boolean minYes(int x , int y){ if(!maxYes(list.get(0).getX()+x,list.get(0).getY()+y)) return false; return true; } public boolean maxYes(int x , int y){ if(x<0||x>=40||y<0||y>=30) { return false; } return true; } public void keyPressed(KeyEvent e) { if (Start){ switch (e.getKeyCode()){ case KeyEvent.VK_UP: move(0 , -1); break; case KeyEvent.VK_DOWN: move(0 , 1); break; case KeyEvent.VK_LEFT: move(-1 , 0); break; case KeyEvent.VK_RIGHT: move(1 , 0); break; default: break; } } } @Override public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } 第二个class是snakeMain package game; import javax.swing.*; public class snakeMain extends JFrame { public snakeMain() { snakeWin win = new snakeWin(); add(win); setTitle("贪吃蛇1.0V~~~杨扬鹏作品"); setSize(435,390); setLocation(200,200); setVisible(true); } public static void main(String args[]){ new snakeMain(); } }第三个class是snakeAct package game; public class snakeAct { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }三个class放在game包里面,下面是问题的截图:
走过得痕迹不会消失