Java中的赌徒破产ASCII图绘制

6
|  * |
| *  |
|  * |
| *  |
|  * |
| *  |
|  * |
|  * |
| *  |
| *  |
|  * |
| *  |
|*   |

我需要打印类似于上面ASCII图的内容,用于解决赌徒破产问题。其中赌注和目标作为参数传入。最左边的|代表0美元,最右边的|代表目标金额,*代表手头现金。我的程序如下:

  public class RuinPath {

  public static void main(String[] args) {
        // TODO - Your solution

    int stake = Integer.parseInt(args[0]);    // gambler's stating bankroll
    int goal = Integer.parseInt(args[1]);    // gambler's desired bankroll

    {
      int i = 0;
      if (i == 0) {
        System.out.print("|");
        i++;
        while (i < stake) {
          System.out.print(" ");
          i++;

          if (i == stake) {
            System.out.print("*");
            i++;

            while (i > stake && i < goal) {
              System.out.print(" ");
              i++;

              if (i == goal) {
                System.out.print("|");
                i = 0;
                System.out.println();

                {

                  if (Math.random() < 0.5) {

                    stake++;     // win $1
                  } else {
                    stake--;    // lose $1

                  }

                  if (stake == 1 || stake == goal - 1);
                  break;

                }
              }
            }
          }
        }
      }
    }
  }
}

这个程序输出的是:
|    *    |
    *     |
     *    |
      *   |
       *  |
      *   |
       *  |
      *   |
       *  |
      *   |
       *  |
      *   |
       *  |
        * |
         *

为什么我的程序无法循环,以便我可以通过左侧的|表示0美元一直到结束?我将i设置为0;在循环结束时,所以当它再次回到循环时,它应该重新循环,直到赌注达到1或少于目标。但它会从程序的中间重新开始循环,而不是从开头重新循环。

2
一个熟练的程序员由于你随意的缩进而很难不犯这样的错误。 - Paul Draper
2
http://prettyprinter.de - Paul Draper
2个回答

1

这是一个更易于理解的拆分解决方案:

import java.io.PrintStream;

public class SO {
  private static int gambleWithCaution(int stake) {
    if (Math.random() < 0.5) {
      return stake+1; // win $1
    } else {
      return stake-1;    // lose $1
    }
  }

  private static void renderStanding(int stake, int goal) {
    System.out.print('|');
    for(int dollar = 1; dollar< goal; dollar++) {
      if(dollar == stake) {
        System.out.print('*');
      } else {
        System.out.print(' ');
      }
    }
    System.out.println('|');
  }

  public static void main(String ... args) {
    int stake = Integer.parseInt(args[0]);    // gambler's stating bankroll
    int goal = Integer.parseInt(args[1]);    // gambler's desired bankroll

    while(stake > 0 && stake < goal) {
      renderStanding(stake, goal);
      stake = gambleWithCaution(stake);
    }
    System.out.println((stake > goal) ? "You Won!" : "You Lost");
  }
}

使用值为35,您将获得以下输出:

|  * |
| *  |
|*   |
| *  |
|  * |
|   *|
|  * |
|   *|
You Won!

现在这部分已经分离出来了,你可以进行一些有趣的操作,比如创建一个赌博功能,如下所示:
private static int gambleWithReclessAbandon(int stake, int goal, double abandon) {
  int onTheLine = (int)(Math.random() * (int)(stake * abandon));
  if(stake < (0.5)*goal) {
    //If you are at less than 50% of your goal then just put it all on the line
    //and let it ride :)
    onTheLine = stake;
  }
  if (Math.random() < 0.5) {
    return stake+onTheLine; // win $
  } else {
    return stake-onTheLine; // lose $
  }
}

这可以这样调用:
//Gamble up to 80% of your current stake
stake = gambleWithReclessAbandon(stake, goal, 0.80);

使用相同的两个值,这是我第一次尝试时看到的内容(我很接近:)):

|  * |
|  * |
|   *|
| *  |
|   *|
You Lost

2
很好的方法。我猜这是为了作业,所以我必须说,学习的最重要的事情之一是如何将问题分解成更小的集合,更容易在头脑中进行可视化和编码。 - sb8244
有没有一种更简单的方式来编写相同的程序?比如不使用printStream,因为我正在学习Java初级课程,虽然我看到它可以工作并且我的测试通过了,但我还是无法理解代码。我也在努力学习,而不仅仅是寻找正确答案。谢谢! - user2874403
我从 renderStanding() 函数中获取了 System.out PrintStream。我倾向于以这种方式编写输出函数,因为这样可以让我在未来灵活地输出到数据库、JFrames 或任何其他东西 :) - Jason Sperske
还有这样一个很棒的演讲,名为“简单并不容易”,由Stuart Halloway主讲,非常好地演示了为什么以及如何拆分一个程序。虽然它并非特定于Java,但如果您想学习将程序结构化为部分的原因,那么完全值得花费时间去观看。 - Jason Sperske

1
你的逻辑有些复杂。此外,你的缩进会使任何调试变得极其困难。
只需一步一步进行:
public class RuinPath {
    public static void main(String[] args) {
        int stake = Integer.parseInt(args[0]);  // Starting bankroll
        int goal  = Integer.parseInt(args[1]);  // Desired bankroll

        while (stake > 0 && stake < goal) {
            System.out.print("|");

            // Print out the spaces. Using a for loop and 
            //   printing a "*" if the counter variable 
            //   is equal to stake is good way to do it.

            // Flip a coin and increment/decrement the stake

            System.out.print("|\n");
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接