给了思路吧,相信这个会比贪吃蛇容易。 List<Point> list = new ArrayList<Piont>();class Piont{ int x; int y; } class Ball{ Direct dir; int x; int y; } 初始化的时候把点加入。row,col跟x,y的换算你会把。 这是主要的类,用个监听器监听Ball的位置,假设你要的效果是小球缓慢持续移动。当小球的x,y等于list.get(0)时,计算方向,如果方向不同,改变方向。把list.remove(0);继续监听,循环。当list.size=0,退出监听器。
import java.util.List; class WatcherThread implements Runnable { boolean flag = true; private Ball ball; private List<Point> points; WatcherThread(Ball ball, List<Point> points) { this.ball = ball; this.points = points; } @Override public void run() { while (flag) { if (points.size() >= 1) { if (ball.getX()== points.get(0).getX() && ball.getY() == points.get(0).getY()) { flag = false; } else { if (ball.getX() == points.get(0).getX() && ball.getY() == points.get(0).getY()) { // 拿Point.get(0)那个Point.get(1)出来比较,就可以确定方向。 Direction dir = getDir(points.get(0),points.get(1));//这样方向就得到了。 ball.dir = dir; points.remove(0); } } } try { Thread.sleep(20); ball.move(); } catch (InterruptedException e) { e.printStackTrace(); }
} } private Direction getDir(Point point, Point point1){//线程监听临界状况,在判断方向。 if(point1.getX()>point.getX()){ return Direction.LEFT; } if(point1.getY()>point.getY()){ return Direction.UP; } if(point1.getY()<point.getY()){ return Direction.DOWN; } if(point1.getX()<point.getX()){ return Direction.RIGHT; } return null; } } enum Direction{//支持上下左右,你可以扩展的。 UP,LEFT,RIGHT,DOWN; } class Point { 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 Ball { static final int SPEED=50; Direction dir; 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; } void move(){ //根据方向和速度,怎么move你知道吧 } }
改一下,不知道是不是这里写错了,你没看懂 if (points.size() >= 1){ if (ball.getX()== points.get(0).getX() && ball.getY() == points.get(0).getY()&&points.size()<= 1) {//等于1说明就剩下最后一步,只要等他move完,线程就可以停止了。 flag = false; }else { if (ball.getX() == points.get(0).getX() && ball.getY() == points.get(0).getY()) { // 拿Point.get(0)那个Point.get(1)出来比较,就可以确定方向。 Direction dir = getDir(points.get(0),points.get(1)); ball.dir = dir; points.remove(0); } } } else{ flag = false; }
但是写不下去了,大家看看应该怎么完善!万分感谢!package Drow;import java.awt.Graphics;
import javax.swing.*;public class PtoP extends JFrame
{
public static int N=100;
private int x1=200,y1=200,x2=300,y2=300;
private int radius=10;
private int advance=1;
PtoP()
{
setLocation(300,300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(800,700);
setVisible(true);
}
public static void main(String[] args)
{
PtoP r=new PtoP();
do{
try{
Thread.sleep(50);
}catch(Exception e){}
r.run();
} while(true);
}
public void run()
{
if(x1!=x2){
if(x1<x2)
{
x1=x1+advance;
repaint();
}
else
{
x1=x1-advance;
repaint();
}
}
else
{
if(y1<y2)
{
y1=y1+advance;
repaint();
}
else
{
y1=y1-advance;
repaint();
}
}
}
public void paint(Graphics g)
{
super.paint(g);
g.fillOval(x1-radius/2, y1-radius/2, radius, radius);
g.drawLine(2*N,2*N,5*N,2*N);
g.drawLine(2*N,3*N,5*N,3*N);
g.drawLine(2*N,4*N,5*N,4*N);
g.drawLine(2*N,5*N,5*N,5*N);
g.drawLine(2*N,2*N,2*N,5*N);
g.drawLine(3*N,2*N,3*N,5*N);
g.drawLine(4*N,2*N,4*N,5*N);
g.drawLine(5*N,2*N,5*N,5*N); }
}
import javax.swing.*;
import java.awt.event.*;
/*
* 让一个小球可以运动
*/
public class Demo extends JFrame {
myPanel panel=null;
Demo()
{
panel=new myPanel(10,10,10);
this.add(panel);
this.addKeyListener(panel);
this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
Demo d=new Demo();
}
}
class myPanel extends JPanel implements KeyListener
{
int x;
int y;
int speed;
myPanel(int x,int y,int speed)
{
this.x=x;
this.y=y;
this.speed=speed;
}
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.pink);
g.fillOval(x,y,10,10);
} public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
if((y+speed)<=400)
y+=speed;
}
else if(e.getKeyCode()==KeyEvent.VK_UP)
{
if((y-speed)>=0)
y-=speed;
}
else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
if(x+speed<=300)
x+=speed;
}
else if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
if(x-speed>=0)
x-=speed;
}
this.repaint();
}
}
List<Point> list = new ArrayList<Piont>();class Piont{
int x;
int y;
}
class Ball{
Direct dir;
int x;
int y;
}
初始化的时候把点加入。row,col跟x,y的换算你会把。
这是主要的类,用个监听器监听Ball的位置,假设你要的效果是小球缓慢持续移动。当小球的x,y等于list.get(0)时,计算方向,如果方向不同,改变方向。把list.remove(0);继续监听,循环。当list.size=0,退出监听器。
既然你是根据坐标的,就不要考虑换算了。
import java.util.List;
class WatcherThread implements Runnable {
boolean flag = true;
private Ball ball;
private List<Point> points; WatcherThread(Ball ball, List<Point> points) {
this.ball = ball;
this.points = points;
} @Override
public void run() {
while (flag) {
if (points.size() >= 1) {
if (ball.getX()== points.get(0).getX()
&& ball.getY() == points.get(0).getY()) {
flag = false;
} else {
if (ball.getX() == points.get(0).getX()
&& ball.getY() == points.get(0).getY()) {
// 拿Point.get(0)那个Point.get(1)出来比较,就可以确定方向。
Direction dir = getDir(points.get(0),points.get(1));//这样方向就得到了。
ball.dir = dir;
points.remove(0);
}
}
}
try {
Thread.sleep(20);
ball.move();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private Direction getDir(Point point, Point point1){//线程监听临界状况,在判断方向。
if(point1.getX()>point.getX()){
return Direction.LEFT;
}
if(point1.getY()>point.getY()){
return Direction.UP;
}
if(point1.getY()<point.getY()){
return Direction.DOWN;
}
if(point1.getX()<point.getX()){
return Direction.RIGHT;
}
return null;
}
}
enum Direction{//支持上下左右,你可以扩展的。
UP,LEFT,RIGHT,DOWN;
}
class Point {
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 Ball {
static final int SPEED=50;
Direction dir;
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;
}
void move(){
//根据方向和速度,怎么move你知道吧
}
}
if (ball.getX()== points.get(0).getX()
&& ball.getY() == points.get(0).getY()&&points.size()<= 1) {//等于1说明就剩下最后一步,只要等他move完,线程就可以停止了。
flag = false;
}else {
if (ball.getX() == points.get(0).getX()
&& ball.getY() == points.get(0).getY()) {
// 拿Point.get(0)那个Point.get(1)出来比较,就可以确定方向。
Direction dir = getDir(points.get(0),points.get(1));
ball.dir = dir;
points.remove(0);
} }
}
else{
flag = false;
}