如何在Nim游戏中反转输出?

4

我有一个NIM游戏程序,基本上它有四个堆,两个玩家必须从堆中取石头直到其中一个人输掉。现在输出中我的堆看起来像这样。

棋盘: [1, 2, 3, 4]

XXX|XXX代表一颗石头和一个列,一列代表一个堆, 但我需要修改它,使其看起来像这样

                        XXX|XXX
                XXX|XXX XXX|XXX
        XXX|XXX XXX|XXX XXX|XXX
XXX|XXX XXX|XXX XXX|XXX XXX|XXX

这是我的代码

System.out.print("");
for(int i = 0; i < 4; i++) {
    //System.out.println(i);
    for(int j = 0; j < numbers[i];j++) {
        //System.out.println(j);
        System.out.print(" XXX|XXX ");
    }
    System.out.println(" ");
}

它会打印出这个

XXX|XXX

XXX|XXX XXX|XXX

XXX|XXX XXX|XXX XXX|XXX

XXX|XXX XXX|XXX XXX|XXX XXX|XXX

有建议吗?


也许你可以删除你的其他问题,因为它似乎是这个问题的重复。 - Janez Kuhar
2个回答

2

首先,将您的输出想象成一个虚拟的2D String 数组,正如 @gmdev 在他的回答中所提到的:

String[][] output = {
    {"       ", "       ", "       ", "XXX|XXX"},
    {"       ", "       ", "XXX|XXX", "XXX|XXX"},
    {"       ", "XXX|XXX", "XXX|XXX", "XXX|XXX"},
    {"XXX|XXX", "XXX|XXX", "XXX|XXX", "XXX|XXX"}
};

接下来,您需要想办法找出最高堆叠的高度。以下是在Java 8或更高版本中执行此操作的一种方法:

int tallestPileLevel = Arrays.stream(numbers).max().getAsInt();

然后你按行渲染虚拟的二维数组。

外部循环向下遍历您的堆叠级别,内部循环打印:

  • 空气 (" ") --> 如果第i个堆叠没有达到当前的level
  • 石头 ("XXX|XXX") --> 否则

这是一个可用的示例:

import java.util.*;
public class PrintNim {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4};
        int tallestPileLevel = Arrays.stream(numbers).max().getAsInt();
        
        String stone = " XXX|XXX ";
        String air   = "         ";
        
        for (int level = tallestPileLevel; level > 0; level--) {
            for(int i = 0; i < numbers.length; i++) {
                if (numbers[i] < level) {
                    System.out.print(air);
                }
                else {
                    System.out.print(stone);
                }
            }
            System.out.println();
        }
    }
}

2
使用另一个for循环来设置你需要堆放石头的空间。我创建了一个与1块石头长度相同的字符串。该for循环重复3次此字符串,然后重复2次等等。
我添加了代码注释以帮助解释。
public static void main(String[] args) {
    System.out.print("");
    int[] numbers = {1, 2, 3, 4};
    int[] spaceNum = {3, 2, 1, 0}; //to stack the x's you need 3 spaces, then 2, etc.
    String spaces = "         "; //length of 1 stone, i.e " XXX|XXX "
    
    for(int i = 0; i < 4; i++) {
        //this loop uses sapceNum to decide how far to indent before the next loop writes the stones
        for(int k = spaceNum[i]; k > 0; k--) {
            System.out.print(spaces);
        }
        for(int j = 0; j < numbers[i]; j++) {
            System.out.print(" XXX|XXX ");
        }
        System.out.println(" ");
    }
}

输出:

                            XXX|XXX  
                   XXX|XXX  XXX|XXX  
          XXX|XXX  XXX|XXX  XXX|XXX  
 XXX|XXX  XXX|XXX  XXX|XXX  XXX|XXX  

你假设最高的一堆的高度总是4。 - Janez Kuhar
如果堆高度没有排序,你会怎么做?如何使用你的逻辑打印以下堆数组:[1, 4, 3, 2] - Janez Kuhar
@JanezKuhar,我刚看到这个评论,回复晚了很抱歉。我可以轻松地编写一个函数来反转“numbers”数组并使用for循环将其写入“spaceNum”,但由于它只是为游戏设置一个板子,所以我认为数字是固定的。我不想用比必要更多的代码来混淆OP。 - CodingNinja

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