解决方案 »

  1.   

    就是没用用list.add();方法改变第二块,而是调用list.get()和list.set()来改变蛇身的属性,为什么会不一样?这一部分没弄懂,能详细解释下吗
      

  2.   

    我贴下代码吧
    package game;import java.awt.Color;
    import java.awt.FlowLayout;
    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 java.util.ArrayList;
    import java.util.List;
    import java.util.Random;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class SnakeFrame extends JFrame {
    public SnakeFrame() {
    setTitle("贪吃蛇小游戏");
    setSize(600,500);
    setLocation(300, 100);

    panel = new SnakeWin();

    panel.setLayout(new FlowLayout(FlowLayout.LEFT));//设置流式布局管理器

    startButton = new JButton("开始");
    stopButton = new JButton("退出");

    panel.add(startButton);
    panel.add(stopButton);


    startButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO 自动生成的方法存根
    startButton.setEnabled(false);
     start = true;
     egg = new Egg();
     snake = new Snake();
     snake.setSx(20);
     snake.setSy(10);
     list.add(snake);
     requestFocus(true);
     Thread thread = new Thread(panel);
     thread.start();
     repaint();  
    }
    });
    stopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
     System.exit(0);
    }
    });


    add(panel);

    addKeyListener(panel);

    }
    class SnakeWin extends JPanel implements KeyListener,Runnable{
    public void paintComponent(Graphics g){
    super.paintComponent(g);                      //多了个s我艹啊啊啊啊啊啊啊就消除不了了
    g.drawRect(10, 40, 550, 400);
    if(start){
    g.setColor(Color.BLUE);
    g.fillRect(10+egg.getEx()*10, 40+egg.getEy()*10, 10, 10);
    g.setColor(Color.GREEN);
    for(int i=0;i < list.size();i++)
    g.fillRect(10+list.get(i).getSx()*10, 40+list.get(i).getSy()*10, 10, 10);
    }

    }
    public void eat(){
    if(list.get(0).getSx() == egg.getEx() && list.get(0).getSy() == egg.getEy()){
    egg.ex = egg.er.nextInt(55);
    egg.ey = egg.er.nextInt(40);
    Snake snakeBody = new Snake();
    snakeBody.setSx(list.get(list.size()-1).getSx());
    snakeBody.setSy(list.get(list.size()-1).getSy());
    list.add(snakeBody);
    }
    }
    public void move(int dx,int dy){
    if(judgeBound(list.get(0),dx,dy)){
    bodyMove();
    list.get(0).setSx(list.get(0).getSx()-dx);
    list.get(0).setSy(list.get(0).getSy()-dy);
    eat();
    repaint();
    }
    else{//死亡方法

    }
    } public void bodyMove(){
    Snake snakeBody = new Snake();
    for(int i = 0;i < list.size();i++){
    if(i == 1){
    // list.set(i, list.get(i-1)); //奇怪了!!!!!!!!!!!!没想明白???????,需要测试!!!!
    list.get(i).setSx(list.get(0).getSx()); 
    list.get(i).setSy(list.get(0).getSy());
    }else if(i > 1){
    snakeBody = list.get(i-1);
    list.set(i-1,list.get(i));
    list.set(i,snakeBody);
    }
    }
    }
    public void up(){
    move(0,1);
    dir = 1;
    }
    public void down(){
    move(0,-1);
    dir = 2;
    }
    public void left(){
    move(1,0);
    dir = 3;
    }
    public void right(){
    move(-1,0);
    dir = 4;
    }
    public boolean judgeBound(Snake s,int dx,int dy){
    if(s.getSx()-dx > 54 || s.getSy()-dy > 39 || s.getSx()-dx < 0 || s.getSy()-dy < 0)
    return false;
    for(int i=0;i < list.size();i++){
    if(i>1 && list.get(0).getSx() == list.get(i).getSx() && list.get(0).getSy() == list.get(i).getSy()){
    return false;
    }
    }
    return true;
    }
    public void run() {
    while(start){
    switch (dir) {
    case 1:
    move(0,1);
    break;
    case 2:
    move(0,-1);
    break;
    case 3:
    move(1,0);
    break;
    case 4:
    move(-1,0);
    break;
    default:
    move(0,1);
    break;
    }
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }
    }
    } public void keyPressed(KeyEvent e) {
    if(start){
    switch (e.getKeyCode()) {
    case KeyEvent.VK_UP:
    up();
    break;
    case KeyEvent.VK_DOWN:
    down();
    break;
    case KeyEvent.VK_LEFT:
    left();
    break;
    default:
    right();
    break;
    }
    }
    } @Override
    public void keyReleased(KeyEvent e) {
    // TODO 自动生成的方法存根

    } @Override
    public void keyTyped(KeyEvent e) {
    // TODO 自动生成的方法存根

    }
    }

    private int dir = 1; 
    private List<Snake> list = new ArrayList<Snake>();
    Snake snake;
    Egg egg;
    Random r = new Random();
    private JButton startButton;
    private JButton stopButton;
    private boolean start = false;
    private SnakeWin panel;
    }
      

  3.   

    没注释,可能不是太好看,bodyMove方法里我注释掉的那部分
    list是snake对象的arraylist集合,snake对象有2个数据域,就是每块蛇身的x坐标和y坐标
    list.set(i, list.get(i-1));和
    list.get(i).setSx(list.get(0).getSx()); 
    list.get(i).setSy(list.get(0).getSy());
    本质上有什么区别?
      

  4.   

    上面i-1不一定等于0
    下面都是拿的list的第一个
      

  5.   

    兄弟,前面有 if(i == 1)好不
      

  6.   

    兄弟,前面有 if(i == 1)好不 
    代码太长没看 只看了你说的!
      

  7.   

    兄弟,前面有 if(i == 1)好不 
    代码太长没看 只看了你说的!
    我代码还有部分没贴
    算了,我再想想