0

我正在尝试控制BugGridWorld 中的 s。我已经尝试了两种方法来做到这一点,但实际上都没有移动或改变错误。他们都编译但没有任何反应。

这是Bug将被控制的:

package info.gridworld.actor;

import info.gridworld.grid.*;
import info.gridworld.grid.Location;

import java.awt.Color;

public class MazeBug extends Bug {

public MazeBug() {
    super(Color.blue);
}
public void forward(){

    Grid<Actor> gr = getGrid();
    if (gr == null)
        return;
    Location loc = getLocation();
    Location next = loc.getAdjacentLocation(getDirection());
    if (gr.isValid(next))
        moveTo(next);
    else
        removeSelfFromGrid();
}

public void turnRight(){
    setDirection(getDirection() + Location.RIGHT);
}

public void turnLeft(){
    setDirection(getDirection() + Location.LEFT);
}
}

这是我尝试使用 Scanner 使用键 W、A 和 D 控制错误的第一种方法(不确定我是否正确使用了扫描仪)

package info.gridworld.actor;

import java.util.Scanner;
import info.gridworld.grid.*;

public class KeyTests extends Actor
{
   public static ActorWorld world = new ActorWorld(new BoundedGrid<Actor>(20, 20));
   public static MazeBug currentBug;

   public static void main(String[] args) {
       world.show();
       world.add(new Location(1,11),new MazeBug());
       while(true){
           Scanner k = new Scanner(System.in);
           String buttonpress = k.nextLine();
           if (buttonpress.equals("w"))
               currentBug.forward();
           if (buttonpress.equals("d"))
               currentBug.turnRight();
           if (buttonpress.equals("a"))
               currentBug.turnLeft();
        }       
    }
}

这是我尝试控制错误的第二种方法

package info.gridworld.actor;

import info.gridworld.grid.*;

public class KeyTests extends Actor
{
    public static ActorWorld world = new ActorWorld(new BoundedGrid<Actor>(20, 20));
    public static MazeBug currentBug;    

    public static void main(String[] args) {

        world.add(new Location(1,11),new MazeBug());    

        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new     java.awt.KeyEventDispatcher() {
            public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
                String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
                if (key.equals("w"))
                   currentBug.forward();
                if (key.equals("d"))
                   currentBug.turnRight();
                if (key.equals("a"))
                   currentBug.turnLeft();
                world.show();
                return true;
            }
        });
        world.show();
    }
}

感谢您在高级方面的任何帮助

4

1 回答 1

0

我几乎可以肯定您的问题是您将控制代码放在 Runner 而不是 Bug 的 act 方法中。

当 GridWorld 步骤时,它所做的只是调用每个Actor's act方法,所以如果你Actor有一个未填充的方法,它只会调用父级,或者什么都不做。你的跑步者,因为它不是一个 ' Actor' 没有任何act方法,并且在第一次运行之后再也不会被查看。

在你的 MazeBug 中试试这个:

public void act()
{
    java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new     java.awt.KeyEventDispatcher() {
        public boolean dispatchKeyEvent(java.awt.event.KeyEvent event) {
            String key = javax.swing.KeyStroke.getKeyStrokeForEvent(event).toString();
            if (key.equals("w"))
               forward();
            if (key.equals("d"))
               turnRight();
            if (key.equals("a"))
               turnLeft();
            return true;
        }
    });
}

注意:我从未使用过 EventListeners,所以无法使用该代码。

于 2014-05-23T15:04:30.083 回答