正在尝试做一个贪吃蛇的小程序,但遇到了一个奇怪的形象
当程序段位以下这样时,小蛇不会越出边界
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
}
当程序段位以下这样时,小蛇不会越出边界
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
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货