Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-为什么不';我的鼠标不能正常移动吗?_Java_Methods_Interface_Abstract Class - Fatal编程技术网

Java-为什么不';我的鼠标不能正常移动吗?

Java-为什么不';我的鼠标不能正常移动吗?,java,methods,interface,abstract-class,Java,Methods,Interface,Abstract Class,我目前正在制作一个程序,显示一种动物在野外的运动。这些动物用一个字符标记(例如:“M”代表鼠标),每个动物都有自己的移动方式。我遇到麻烦的方法是一种可以让我的老鼠移动的方法 它们应该沿着对角线(先北后东或西、先东后北或南)移动一定的时间,然后改变对角线方向。 鼠标沿对角线移动的次数由myCount控制。如果myCount小于myTarget,则小鼠应沿对角线移动。当myCount等于myTarget时,小鼠改变方向。然后myCount被设置回0。在改变对角线方向之前,我想让我的鼠标沿对角线移

我目前正在制作一个程序,显示一种动物在野外的运动。这些动物用一个字符标记(例如:“M”代表鼠标),每个动物都有自己的移动方式。我遇到麻烦的方法是一种可以让我的老鼠移动的方法

  • 它们应该沿着对角线(先北后东或西、先东后北或南)移动一定的时间,然后改变对角线方向。
    • 鼠标沿对角线移动的次数由
      myCount
      控制。如果
      myCount
      小于
      myTarget
      ,则小鼠应沿对角线移动。当
      myCount
      等于
      myTarget
      时,小鼠改变方向。然后
      myCount
      被设置回0。在改变对角线方向之前,我想让我的鼠标沿对角线移动8次
  • 然而,相反我的老鼠有时会朝对角线方向移动一点,但它们总是先上后下或先左后右反复移动大约5次
是我的程序输出的样子。(S是不会移动的石头,在这种情况下,它们被视为另一种生物)

界面:

public interface Critter
{
   public static final int NORTH = 0;
   public static final int WEST = 1;
   public static final int SOUTH = 2;
   public static final int EAST = 3;
   public static final int CENTER = 4;

   public char getChar();
   public int getMove(CritterInfo theInfo);
}
public abstract class AbstractCritter implements Critter
{
   private char myCritterName;

   public AbstractCritter(final char theChar)
   {
      myCritterName = theChar;
   }
   public char getChar()
   {
      return myCritterName;
   }
}
import java.util.*;
public class Mouse extends AbstractCritter
{
   private int myDirection;
   private int myCount;
   private boolean myFirst;
   private int myTarget;
   private Random myRand;
   private int myCheck;

   public Mouse()
   {
      super('M');
      myRand = new Random();
      myDirection = myRand.nextInt(4);
      myCount = 0;
      myFirst = false;
      myTarget = 16;
      myCheck = 0;
   }
   public int getMove(CritterInfo theInfo)
   {
      if (myCount == myTarget)
      {
         myCount = 0;
         int direction = myRand.nextInt(4);
         myFirst = false;

      }
      int direction = myDirection;
      int direction2 = myRand.nextInt(4);
      myCount++;

      if (!myFirst)
      {

         myCheck = myRand.nextInt(2);
         if (myDirection == NORTH || myDirection == SOUTH)
         {
            if (myCheck == 0)
            {
               direction2 = EAST;
            }
            else
            {
               direction2 = WEST;
            }
         }
         else if (myDirection == EAST || myDirection == WEST)
         {
            if (myCheck == 0)
               {
                  direction2 = NORTH;
               }
               else
               {
                  direction2 = SOUTH;
               }
         }
         myFirst = true;
      }

      if (myCount % 2 == 0)
      {
         return direction;
      }
      else
      {
         return direction2;
      }
   }
}
抽象类:

public interface Critter
{
   public static final int NORTH = 0;
   public static final int WEST = 1;
   public static final int SOUTH = 2;
   public static final int EAST = 3;
   public static final int CENTER = 4;

   public char getChar();
   public int getMove(CritterInfo theInfo);
}
public abstract class AbstractCritter implements Critter
{
   private char myCritterName;

   public AbstractCritter(final char theChar)
   {
      myCritterName = theChar;
   }
   public char getChar()
   {
      return myCritterName;
   }
}
import java.util.*;
public class Mouse extends AbstractCritter
{
   private int myDirection;
   private int myCount;
   private boolean myFirst;
   private int myTarget;
   private Random myRand;
   private int myCheck;

   public Mouse()
   {
      super('M');
      myRand = new Random();
      myDirection = myRand.nextInt(4);
      myCount = 0;
      myFirst = false;
      myTarget = 16;
      myCheck = 0;
   }
   public int getMove(CritterInfo theInfo)
   {
      if (myCount == myTarget)
      {
         myCount = 0;
         int direction = myRand.nextInt(4);
         myFirst = false;

      }
      int direction = myDirection;
      int direction2 = myRand.nextInt(4);
      myCount++;

      if (!myFirst)
      {

         myCheck = myRand.nextInt(2);
         if (myDirection == NORTH || myDirection == SOUTH)
         {
            if (myCheck == 0)
            {
               direction2 = EAST;
            }
            else
            {
               direction2 = WEST;
            }
         }
         else if (myDirection == EAST || myDirection == WEST)
         {
            if (myCheck == 0)
               {
                  direction2 = NORTH;
               }
               else
               {
                  direction2 = SOUTH;
               }
         }
         myFirst = true;
      }

      if (myCount % 2 == 0)
      {
         return direction;
      }
      else
      {
         return direction2;
      }
   }
}
我遇到问题的方法:

public interface Critter
{
   public static final int NORTH = 0;
   public static final int WEST = 1;
   public static final int SOUTH = 2;
   public static final int EAST = 3;
   public static final int CENTER = 4;

   public char getChar();
   public int getMove(CritterInfo theInfo);
}
public abstract class AbstractCritter implements Critter
{
   private char myCritterName;

   public AbstractCritter(final char theChar)
   {
      myCritterName = theChar;
   }
   public char getChar()
   {
      return myCritterName;
   }
}
import java.util.*;
public class Mouse extends AbstractCritter
{
   private int myDirection;
   private int myCount;
   private boolean myFirst;
   private int myTarget;
   private Random myRand;
   private int myCheck;

   public Mouse()
   {
      super('M');
      myRand = new Random();
      myDirection = myRand.nextInt(4);
      myCount = 0;
      myFirst = false;
      myTarget = 16;
      myCheck = 0;
   }
   public int getMove(CritterInfo theInfo)
   {
      if (myCount == myTarget)
      {
         myCount = 0;
         int direction = myRand.nextInt(4);
         myFirst = false;

      }
      int direction = myDirection;
      int direction2 = myRand.nextInt(4);
      myCount++;

      if (!myFirst)
      {

         myCheck = myRand.nextInt(2);
         if (myDirection == NORTH || myDirection == SOUTH)
         {
            if (myCheck == 0)
            {
               direction2 = EAST;
            }
            else
            {
               direction2 = WEST;
            }
         }
         else if (myDirection == EAST || myDirection == WEST)
         {
            if (myCheck == 0)
               {
                  direction2 = NORTH;
               }
               else
               {
                  direction2 = SOUTH;
               }
         }
         myFirst = true;
      }

      if (myCount % 2 == 0)
      {
         return direction;
      }
      else
      {
         return direction2;
      }
   }
}

如果您创建一个
enum
来保存鼠标可能处于的两种不同状态,那么就不会那么混乱了。每移动8次,在这两种状态之间切换,然后使用
enum
本身告诉您应该使用哪些移动规则

逻辑的关键部分是这一行:

int offset = 2 - ((index / 2) * 2);
如果方向是北、南,索引将是
0,1
,如果方向是东、西,索引将是
2,3
。对于
北部、南部
,除以2再乘以2等于
0,对于
东部、西部
,等于
2。然后我们使用
2-
该值将其翻转,然后随机添加
1
以再次选择正交方向

代码如下:

import java.util.*;
public class Mouse extends AbstractCritter {
  private static final int[] allDirections = { NORTH, SOUTH, EAST, WEST };
  private static final Random myRand = new Random();

  private final int myTarget = 16;
  private int myCount = 0;
  private int firstDirection;
  private int secondDirection;

  public Mouse() {
    super('M');
    randomizeDirection();
  }

  public int getMove(CritterInfo info)
  { 
    myCount++;
    if(myCount == myTarget) {
      randomizeDirection();
      myCount = 0;
    }
    return myCount % 2 == 0 ? firstDirection : secondDirection;
  }

  private void randomizeDirection() {
    int index = myRand.nextInt(4);
    firstDirection = allDirections[index];
    int offset = 2 - ((index / 2) * 2); // this turns 0, 1 -> 2; 2, 3 -> 0
    secondDirection = allDirections[offset + myRand.nextInt(2)];
  } 
}