我正在尝试用Java制作一个高度由可变变量控制的沙漏,以ASCII艺术的形式呈现。
我正在尝试用Java制作一个高度由可变变量控制的沙漏,以ASCII艺术的形式呈现。
我的代码看起来像这样:\n
public class HourGlass{ public static final int x = 5; public static void wall(){ System.out.println("|\"\"\"\"\"\"\"\"\"|"); } public static void top(){ for (int i = 1;i<=x;i++){ for (int j =1; j<=i; j++){ System.out.print(" "); } System.out.print("\\"); for (int k = 1; k <= 9-2*i ;k++){ System.out.print(":"); } System.out.print("/\n"); } } public static void bottom(){ for (int i = 1;i <= x; i++){ for (int j = 1; j<= 5-i; j++){ System.out.print(" "); } System.out.print("/"); for (int k = 1; k <= 2*i-1; k++){ System.out.print(":"); } System.out.print("\\\n"); } } public static void main(String[] args){ wall(); top(); bottom(); wall(); } }
\n我得到的结果是:\n
|"""""""""| \:::::::/ \:::::/ \:::/ \:/ \/ /:\ /:::\ /:::::\ /:::::::\ /:::::::::\ |"""""""""|
\n如何修复并使顶部和底部可以自动缩放?我已经尝试解决这个问题,但我被困住了,没有找到解决办法。
问题的出现原因是程序员想要制作一个可以通过改变变量来控制高度的Java ASCII艺术沙漏。在给出的代码中,程序员提供了一个使用递归方法创建重复字符字符串的函数。然后,程序员提供了两种不同类型的沙漏打印方法,一种用于偶数列数的沙漏,另一种用于奇数列数的沙漏。通过调用这些方法并传递所需的高度,可以打印出相应高度的沙漏。
解决方法是使用提供的重复字符字符串函数创建一个可以重复打印的字符行,然后按照指定的格式打印字符行来形成沙漏的形状。程序员提供了两个不同形状的沙漏打印方法,分别适用于偶数列数和奇数列数的沙漏。通过调用这些方法,可以根据所需的高度打印出相应高度的沙漏。
以下是完整的
我发现如果有一个方法可以创建一个重复字符的字符串,这些练习对我来说编码更容易。还有其他的写法,但是这是一种使用最少代码的递归方法:
private static String repeat(char c, int count) { return (count == 0 ? "" : c + repeat(c, count - 1)); }
例如,如果你调用`repeat('*', 5)`它会返回`*****`。
有了这个方法,你可以很容易地打印出一个沙漏。我有一点不确定沙漏的中心应该是什么样子的,所以这里有两种方法。
偶数列数的沙漏
public static void printHourGlassEven(int size) { System.out.println('|' + repeat('"', size * 2) + '|'); for (int i = 1; i <= size; i++) System.out.println(repeat(' ', i) + '\\' + repeat(':', (size - i) * 2) + '/'); for (int i = size; i >= 1; i--) System.out.println(repeat(' ', i) + '/' + repeat(':', (size - i) * 2) + '\\'); System.out.println('|' + repeat('"', size * 2) + '|'); }
测试:
printHourGlassEven(5);
输出:
|""""""""""| \::::::::/ \::::::/ \::::/ \::/ \/ /\ /::\ /::::\ /::::::\ /::::::::\ |""""""""""|
奇数列数的沙漏
public static void printHourGlassOdd(int size) { System.out.println('|' + repeat('"', size * 2 - 1) + '|'); for (int i = 1; i < size; i++) System.out.println(repeat(' ', i) + '\\' + repeat(':', (size - i) * 2 - 1) + '/'); System.out.println(repeat(' ', size) + 'X'); for (int i = size - 1; i >= 1; i--) System.out.println(repeat(' ', i) + '/' + repeat(':', (size - i) * 2 - 1) + '\\'); System.out.println('|' + repeat('"', size * 2 - 1) + '|'); }
测试:
printHourGlassOdd(5);
输出:
|"""""""""| \:::::::/ \:::::/ \:::/ \:/ X /:\ /:::\ /:::::\ /:::::::\ |"""""""""|
这就是我在回答中所说的。这种方法远不如刚才的方法僵化。这个实现允许制作任何大小的完美沙漏。
问题的出现原因是作者想要在Java中创建一个由可变变量控制高度的沙漏形状的ASCII艺术,但代码存在一些问题。作者提到代码可以变得不那么僵化,但这不是问题的关键。为了使顶部和底部相匹配,需要忽略顶部行中不出现冒号的部分。作者还对变量x进行了更改,将其更改为大写X,因为它是一个常量,并对top()和wall()代码进行了一些微调。
解决方法是作者修改了代码并给出了修改后的代码。作者将变量x更改为常量X,并对top()和wall()方法进行了修改。wall()方法用于打印墙壁部分,top()方法用于打印顶部部分。修改后的代码中,顶部部分的行数由变量X控制,通过循环嵌套打印出沙漏形状的顶部部分。
希望这可以帮助解决问题。