【问题标题】:Hare Tortoise Race Visual Display兔龟赛跑视觉展示
【发布时间】:2016-04-03 14:45:29
【问题描述】:

我正在做一个使用面向对象编程的项目,在该项目中,我让一只乌龟和一只兔子沿着水平方向赛跑。我见过使用 applet 和 swing 的其他版本,但我还没有被介绍过,所以我更喜欢使用更简单的图形。

每只动物都有一组动作,其出现概率为 x%(我稍后会详细说明)。

对于兔子,有五种方法:BigHop() - 向右移动 9 格,SmallHop() - 向右移动 1 格,BigSlip() - 向左 12 格,SmallSlip() - 向左移动 2 格,FallAsleep() -根本没有活动。现在,“最左边”的位置是 1,所以如果兔子在第 6 格,大滑仍然只能回到 1。(不是 -6)

对于乌龟,有三种方法:FastPlod() - 向右 3 格,SlowPlod() - 向右 1 格,Slip() - 向左 6 格,同样的规则适用于滑动。

到目前为止,该程序包含一个 Hare 类、一个 Tortoise 类和一个 Race 类。

这是 Hare 类:

 public class Hare {
        private int position;

        public void setPosition(int s){
            position = s;
        }

        public int getPosition(){
            return position;
        }

        public void BigHop(){
            position += 9;
        }

        public void SmallHop(){
            position += 1;
        }

        public void BigSlip(){
            if (position > 12){
                position -= 12;
            }
            else{
                position = 1;
            }
        }

        public void SmallSlip(){
            if (position > 2){
                position -= 2;
            }
            else{
                position = 1;
            }
        }

        public void FallAsleep(){
            position = position;
        }
    }

龟类:​​

public class Tortoise {
    private int position;

    public void setPosition(int s){
        position = s;
    }

    public int getPosition(){
        return position;
    }

    public void FastPlod(){
        position += 3;
    }

    public void SlowPlod(){
        position += 1;
    }


    public void Slip(){
        if (position > 6){
            position -= 6;
        }
        else{
            position = 1;
        }
    }
}

Race 类实际上执行了比赛。

public class Race {
    public static void main(String[] args){
        Hare myHare = new Hare();
        Tortoise myTortoise = new Tortoise();

        myHare.setPosition(1);
        myTortoise.setPosition(1);

        System.out.println("AND THEY'RE OFF!!");

        while (myHare.getPosition() > 0){
            int n = (int)(Math.random()*10);
            switch (n){
                case 1:
                    myHare.BigHop();
                    myTortoise.FastPlod();
                case 2:
                    myHare.BigHop();
                    myTortoise.FastPlod();
                case 3:
                    myHare.SmallHop();
                    myTortoise.FastPlod();
                case 4:
                    myHare.SmallHop();
                    myTortoise.FastPlod();
                case 5:
                    myHare.SmallHop();
                    myTortoise.FastPlod();
                case 6:
                    myHare.BigSlip();
                    myTortoise.SlowPlod();
                case 7:
                    myHare.SmallSlip();
                    myTortoise.SlowPlod();
                case 8:
                    myHare.SmallSlip();
                    myTortoise.SlowPlod();
                case 9:
                    myHare.FallAsleep();
                    myTortoise.Slip();
                case 10:
                    myHare.FallAsleep();
                    myTortoise.Slip();
            }
            if (myHare.getPosition() == myTortoise.getPosition()){
                System.out.println("OUCH!!");
            }
            if (myHare.getPosition() == 50 | myTortoise.getPosition() == 50){
                if (myHare.getPosition() == 50){
                    System.out.println("HARE WINS!!");
                    break;
                }
                else{
                    if (myHare.getPosition() == myTortoise.getPosition()){
                        System.out.println("IT'S A TIE!!");
                        break;
                    }
                    else{
                        System.out.println("TORTOISE WINS!!");
                        break;
                    }
                }
            }
        }

逻辑本身有效。比赛的构建方式是赛道上有五十个空间(赛道本身没有以图形方式构建,这是我遇到的麻烦)。每只动物的动作都是使用switch 构造随机执行的。例如,30% 的时间,乌龟会 SlowPlod()。

因为失误太多,跑起来要花点时间,但最终我还是赢了(通常是乌龟)。所以,逻辑本身是有效的。

但是,现在这是我显示的唯一输出:

AND THEY'RE OFF!! TORTOISE WINS!!

当然,这没有数百个“哎哟!!”当两只动物共享相同的位置时会发生这种情况。所以我希望能够在 50 个空格的轨道上显示两只动物的位置。我曾想过使用'_'作为每个空格,但我不知道如何编码乌龟或兔子的运动。

例如,可能的输出是这样的:

_ _ _ _ _ _ _ _ T _ _ _ _ _ _ _ _ _ _ _ H _ _ _

OUCH!!

我只是不确定如何构建这样的轨道并编码 T 和 H 的运动。

我将不胜感激。

【问题讨论】:

  • 如果我的大写弄乱了突出显示,我很抱歉。 Java 还是新手。

标签: java oop switch-statement


【解决方案1】:

您的switch 中似乎漏掉了break;

        switch (n) {
            case 1:
                myHare.BigHop();
                myTortoise.FastPlod();
                break;
            case 2:
                myHare.BigHop();
                myTortoise.FastPlod();
                break;
            ...
            }

您将需要在 Race 类中编写另一个方法。

private static void printTrack(Player player, char symbol) {
    int position = player.getPosition();
    for (int i = 0; i < position; i++)
        System.out.print('_');

    System.out.print(symbol);

    for (int i = position + 1; i < 50; i++)
        System.out.print('_');

    System.out.println();
}

但在此之前,你需要创建一个(抽象)类或一个名为Player的接口,并将HareTortoise类修改为继承自Player

public abstract class Player {
    protected int position;

    public void setPosition(int s){
        position = s;
    }

    public int getPosition(){
        return position;
    }
}

修改HareTortoise如下

public class Hare extends Player {
    /* 
    private int position;

    public void setPosition(int s){
        position = s;
    }

    public int getPosition(){
        return position;
    }
    */
    // The rest should be the same
    // Do the same with the class "Tortoise"
    ...
}

switch之后,你可以调用该方法。

        switch (n) {
            ...
        }
        printTrack(myHare, 'H');
        printTrack(myTortoise, 'T');
        ...

在您的代码中某处有一个| 运算符。您需要将其替换为||

看看这是否有效。

【讨论】:

  • 如果我每次都打破循环,那么程序就变得没用了,对吧?因为我需要一直运行它,直到其中一只动物达到 50 岁。如果我每次都打破它,那么每只动物就只有一个动作。
  • break 用于 switch 语句。如果您不中断,则代码中低于您想要的语句的每个语句也将被执行。所以,现在,兔子睡着了,乌龟一举一动都在滑倒(案例 10),还有一些其他的动作,这不是你想要的。
  • 实际上break 内的switch 关键字并没有打破循环。它突破了switch。您需要在另一个case 标签之前使用break 关键字,否则其他case 标签下面的代码也会运行。当然,前提是您不打算这样做。
  • 哦,好的。对,对不起,我忘记了。谢谢。
【解决方案2】:

您可以使用决策/重复结构中的打印语句来执行此操作。您可以循环遍历每个可能的位置,如果动物在该位置,则打印相应的字母,否则打印下划线。

for (int i = 1; i <= maxPos; i++) {
    if (i == myTortoise.getPosition())
        System.out.print("T")
    else
        System.out.print("_")
    System.out.print(" ")
}
System.out.println()

上面的代码会打印乌龟的进度;用myHare"H" 代替野兔。将此代码插入 while 循环的顶部或底部,以在每次移动后打印进度。

【讨论】:

  • 谢谢!这看起来很棒。如果我在底部插入它,我是否必须在顶部插入初始迭代?
  • 是的。更好的解决方案是将其放入函数 private static void printProgress 并在循环之前和循环结束时调用它。
  • 我试过你的代码,它工作得很好,但我遇到了这个小故障,在最后一帧(决定获胜者的地方),程序自动将两只动物移到最后一帧位置并宣布野兔获胜。所以,现在,每一次,野兔都是赢家。有什么建议吗?
  • 你是不是不小心输入了setPosition()?根据您的代码,不确定它们会如何在最后一帧“传送”。
  • 我放的唯一setPosition() 是在开始时将两者设置为第一个位置。会不会是 while 循环中的错误?
【解决方案3】:

如果您不想使用 Swing 或某种图形界面,您唯一能做的就是一遍又一遍地打印位置。但这当然会向您的控制台发送垃圾邮件。

假设您不介意您的控制台收到垃圾邮件,您可以执行以下操作:

public static void main(String[] args){
    printPositions(3, 3, 10);
}

public static void printPositions(int hare, int tortoise, int totalTrackLenght){
    //print the position of hare
    for(int i = 1; i < hare; i++){//print leading empty spaces
        System.out.print("_ ");
    }
    System.out.print("H ");//print hare
    for(int i = hare; i < totalTrackLenght; i++){//print trailing empty spaces
        System.out.print("_ ");
    }
    //print the postion of tortoise in a similar way
    System.out.println();//remember to start on a new line
    for(int i = 1; i < tortoise; i++){//print leading empty spaces
        System.out.print("_ ");
    }
    System.out.print("T ");//print tortoise
    for(int i = tortoise; i < totalTrackLenght; i++){//print trailing empty spaces
        System.out.print("_ ");
    }
    System.out.println();//finish the line
    if(hare == tortoise){//Are they in the same spot?
        System.out.println("OUCH!");
    }
}

可以从您的“主循环”中为每一帧调用此方法。

我希望这会有所帮助:)

【讨论】:

  • 谢谢!我会试试这个,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2021-04-20
  • 2016-05-12
  • 1970-01-01
  • 2021-02-10
  • 2021-09-26
相关资源
最近更新 更多