比如给定坐标(0,0)——(0,1)——(1,1)——(1,2)
如何实现一个小球沿指定坐标间的直线运动,从起始点运动到终点?

解决方案 »

  1.   

    下面是我写的一个初步框架,目的是让一个小球任意给定的起点,通过九宫格的一系列路径,到达终点。
    但是写不下去了,大家看看应该怎么完善!万分感谢!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);   }
    }
      

  2.   

    import java.awt.*;
    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();

    }
    }
      

  3.   

    。看错题了,sorry 我在看看
      

  4.   

    给了思路吧,相信这个会比贪吃蛇容易。
    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,退出监听器。
      

  5.   

    不好意思,你说的“row,col跟x,y的换算”我不太明白........我还是,菜鸟一枚......呵呵
      

  6.   

    我开始理解错误,以为你是走格子的,一个二维数组int[][] a=new int[9][9];以为是这种。
    既然你是根据坐标的,就不要考虑换算了。
      

  7.   


    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你知道吧
    }
    }
      

  8.   

    改一下,不知道是不是这里写错了,你没看懂            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;
                }
      

  9.   

    能不能把move函数和主函数帮我写下,我写了个出问题了,现在没法上代码