正在尝试做一个贪吃蛇的小程序,但遇到了一个奇怪的形象
当程序段位以下这样时,小蛇不会越出边界
final Timer t = new Timer(1000, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int n = Rects.size() - 1;
                if(Rects.get(n).getMaxX() < 230 && Rects.get(n).getMinX() > 10 &&
                        Rects.get(n).getMaxY() < 280 && Rects.get(n).getMinY() > 10)
                {
                    Automatism(d);
                    if(Rects.get(n).getMaxX() == 230 || Rects.get(n).getMinX() == 10||
                            Rects.get(n).getMaxY() == 280 || Rects.get(n).getMinY() == 10)
                        ReturnToLastState();
                    repaint();
                }
        });
        t.start();
但改成这样时,居然会越出边界一格。
final Timer t = new Timer(1000, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int n = Rects.size() - 1;
                Rectangle2D rect0 = Rects.get(n);
                if(rect0.getMaxX() < 230 && rect0.getMinX() > 10 &&
                        rect0.getMaxY() < 280 && rect0.getMinY() > 10)
                {
                    Automatism(d);
                    if(rect0.getMaxX() == 230 || rect0.getMinX() == 10||
                            rect0.getMaxY() == 280 || rect0.getMinY() == 10)
                        ReturnToLastState();
                    repaint();
                }
            }
        });
        t.start();
请各位高手指点指点全部代码如下
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */package TCS;import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
import javax.swing.*;/**
 *
 * @author Administrator
 */
public class TCS1 {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Frame f = new Frame();
        f.setSize(250, 320);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}class Frame extends JFrame
{
    public Frame()
    {
        Component c = new Component();
        add(c);
        c.setFocusable(true);
    }
}class Component extends JComponent
{
    public Component()
    {        Rects = new ArrayList<Rectangle2D>();
        for(int i = 0; i < 5; i++)
        {
            Rectangle2D rect = new Rectangle2D.Double(30 + i * 10, 30, 10, 10);
            Rects.add(rect);
        }        final Timer t = new Timer(1000, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int n = Rects.size() - 1;
                if(Rects.get(n).getMaxX() < 230 && Rects.get(n).getMinX() > 10 &&
                        Rects.get(n).getMaxY() < 280 && Rects.get(n).getMinY() > 10)
                {
                    Automatism(d);
                    if(Rects.get(n).getMaxX() == 230 || Rects.get(n).getMinX() == 10||
                            Rects.get(n).getMaxY() == 280 || Rects.get(n).getMinY() == 10)
                        ReturnToLastState();
                    repaint();
                }
//                Rectangle2D rect0 = Rects.get(n);
//                if(rect0.getMaxX() < 230 && rect0.getMinX() > 10 &&
//                        rect0.getMaxY() < 280 && rect0.getMinY() > 10)
//                {
//                    Automatism(d);
//                    if(rect0.getMaxX() == 230 || rect0.getMinX() == 10||
//                            rect0.getMaxY() == 280 || rect0.getMinY() == 10)
//                        ReturnToLastState();
//                    repaint();
//                }
            }
        });
        t.start();
        
        addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                t.stop();
                if(d == Direction.UP && e.getKeyCode() == KeyEvent.VK_LEFT)
                {
                    d = Direction.LEFT;
                    Automatism(d);
                }
                else if(d == Direction.UP && e.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    d = Direction.RIGHT;
                    Automatism(d);
                }
                else if(d == Direction.LEFT && e.getKeyCode() == KeyEvent.VK_UP)
                {
                    d = Direction.UP;
                    Automatism(d);
                }
                else if(d == Direction.LEFT && e.getKeyCode() == KeyEvent.VK_DOWN)
                {
                    d = Direction.DOWN;
                    Automatism(d);
                }
                else if(d == Direction.DOWN && e.getKeyCode() == KeyEvent.VK_LEFT)
                {
                    d = Direction.LEFT;
                    Automatism(d);
                }
                else if(d == Direction.DOWN && e.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    d = Direction.RIGHT;
                    Automatism(d);
                }
                else if(d == Direction.RIGHT && e.getKeyCode() == KeyEvent.VK_UP)
                {
                    d = Direction.UP;
                    Automatism(d);
                }
                else if(d == Direction.RIGHT && e.getKeyCode() == KeyEvent.VK_DOWN)
                {
                    d = Direction.DOWN;
                    Automatism(d);
                }
                if(JudgeTheBorderline() == false)
                {
                    ReturnToLastState();
                    t.stop();
                }
                else
                {
                    repaint();
                    t.start();
                }
            }
        });
    }    public void paintComponent(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        //边框
        Line2D upLine = new Line2D.Double(20, 20, 220, 20);
        Line2D leftLine = new Line2D.Double(20, 20, 20, 270);
        Line2D downLine = new Line2D.Double(20, 270, 220, 270);
        Line2D rightLine = new Line2D.Double(220, 20, 220, 270);
        g2d.draw(upLine);
        g2d.draw(leftLine);
        g2d.draw(downLine);
        g2d.draw(rightLine);        for(Rectangle2D r : Rects)
        {
            g2d.draw(r);
            g2d.fill(r);
        }
    }
    //前进一格
    public void Automatism(Direction d)
    {
        Last = (ArrayList<Rectangle2D>)Rects.clone();        int n = Rects.size() - 1;
        Rectangle2D rect = Rects.get(n);
        
        if(d == Direction.UP)
            rect = new Rectangle2D.Double(rect.getX(), rect.getY() - 10, 10, 10);
        else if(d == Direction.LEFT)
            rect = new Rectangle2D.Double(rect.getX() - 10, rect.getY(), 10, 10);
        else if(d == Direction.DOWN)
            rect = new Rectangle2D.Double(rect.getX(), rect.getY() + 10, 10, 10);
        else if(d == Direction.RIGHT)
            rect = new Rectangle2D.Double(rect.getX() + 10, rect.getY(), 10, 10);
        
        Rectangle2D r1 = Rects.get(n);
        Rects.set(n, rect);
        n--;
        
        while(n >= 0)
        {
            Rectangle2D r2 = Rects.get(n);
            Rects.set(n, r1);
            r1 = r2;
            n--;
        }
    }
    //返回前一个状态
    public void ReturnToLastState()
    {
        Rects = (ArrayList<Rectangle2D>)Last.clone();
    }
    //判断前进时是否会与自身相撞
    public boolean JudgeTheBorderline()
    {
        int n = Rects.size() - 1;
        Rectangle2D rect = Rects.get(n);
        for(int i = 0; i < n - 1; i++)
        {
            if(rect.equals(Rects.get(i)))
                return false;
        }
        return true;
    }    private Direction d = Direction.RIGHT;
    private ArrayList<Rectangle2D> Rects;
    private ArrayList<Rectangle2D> Last;
}
//用于键盘方向键的判断
enum Direction
{
    UP,
    LEFT,
    DOWN,
    RIGHT
}