绘制两棵特定高度的 ASCII 云杉树

2023-12-12

我正在尝试编写生成这种形状的 ASCII 艺术的代码:

           *
          ***
         *****
        *******      *
       *********    ***
      ***********  *****
     ********************
    **********************
   ************************
  **************************
 ****************************
******************************

代码需要能够根据输入高度生成此形状。 正如您从示例形状中看到的,我的代码使用行高 12 正确生成了 ASCII 艺术图。但是,对于行高 3、5、6、7、10、11、15...,它不会正确生成 ASCII 形状。我尝试自己调试这个问题,但我找不到失败的行高之间的共性,这使我无法用我的算法解决问题。

这是我用来生成 ASCII 艺术形状的 Java 代码(当然没有硬编码的行高 12):

int h = 12;
for (int i = 0; i < h; i++) {
    for (int j = 0; j < h - i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < i; j++) {
        System.out.print("*");
    }
    for (int j = i; j >= 0; j--) {
        System.out.print("*");
    }
    for (int j = 0; j < h / 2 - i; j++) {
        System.out.print(" ");
    }
    for (int j = h / 2 - i; j > 0; j--) {
        System.out.print(" ");
    }
    for (int j = 0; j <= h / 2; j++) {
        if (i >= h / 2)
            System.out.print("*");
    }
    for (int j = 0; j < i - h / 5; j++) {
        if (i >= h / 4 && i < h / 2)
            System.out.print("*");
    }
    for (int j = i - h / 5 - 1; j > 0; j--) {
        if (i >= h / 4 && i < h / 2)
            System.out.print("*");
    }
    System.out.println();
}

究竟是什么导致我的 ASCII 艺术生成器代码在某些行高上失败,以及如何修复该代码问题,以便它正确生成任何正整数的 ASCII 艺术?


这概括了问题Shape任何 ASCII 艺术形状的接口,以及Spruce记录云杉形状的位置和高度的类intersects(x,y)确定云杉上是否有任何坐标。

然后传入list就可以更灵活的绘图了Spruce并确定所有大小的并集的每个点的命中/未命中。 ASpruce可以整齐地定义为JDK16记录:

public record Spruce(int left, int height) implements Shape {
    public int right() { return left+2*height-2; }
    public int top()   { return height;          }

    // Check any coordinate hits / misses this Spruce:
    public boolean intersects(int x, int y) {
        return 1 <= y && y <= height && x >= left + y - 1 && x <= left + 2 * height - 1 - y;
    }
}

...以及一个简单的主线来绘制尽可能多的Spruce/ 其他Shape如所须:

public static void main(String[] args) {
    Shape.draw(new Spruce(1, 4), new Spruce(6, 6));
    Shape.draw(new Spruce(2, 6), new Spruce(10, 4));
    Shape.draw(new Spruce(3, 10), new Spruce(30, 9), new Spruce(18, 5));
}

返回:

Spruce[left=1, height=4]
Spruce[left=6, height=6]

          *     
         ***    
   *    *****   
  ***  *******  
 ************** 
****************

Spruce[left=2, height=6]
Spruce[left=10, height=4]

      *         
     ***        
    *****   *   
   ******* ***  
  ************* 
 ***************

Spruce[left=3, height=10]
Spruce[left=30, height=9]
Spruce[left=18, height=5]

           *                                  
          ***                        *        
         *****                      ***       
        *******                    *****      
       *********                  *******     
      ***********    *           *********    
     *************  ***         ***********   
    ********************       *************  
   **********************     *************** 
  ************************   *****************
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绘制两棵特定高度的 ASCII 云杉树 的相关文章

随机推荐