绘制两棵特定高度的 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 云杉树 的相关文章

  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • 获取TextView的高度

    我有一些文字将被放入TextView 我这样做是使用setText 现在我需要找到文本在文本中占据的行数或高度TextView 我尝试使用getHeight 但它总是返回 0 无论如何 有没有办法获得文本中存在的文本的高度TextView
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 给定一个单词列表 - 在 java 中完成单词的好的算法是什么?权衡:速度/效率/内存占用

    我正在探索潜在的免费 付费应用程序的硬件 软件要求 最终目标是移动 Java 应用程序 该应用程序将从这个简单的目标开始 给定数据库中相关单词的列表 能够对单个字符串输入进行单词补全 换句话说 我已经知道数据库的内容 但算法的内存占用 速度
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计

随机推荐