#java
#Ява
Вопрос:
Я нарисовал ромб с символами ASCII (все»*»), и я пытаюсь поместить метку или слово внутри фигуры. Я уже использовал эту концепцию с другими формами, такими как треугольники, квадраты и т. Д. Таким образом, мой алгоритм имеет параметры высоты, на какой линии формы они хотят, чтобы отображалась метка, а затем сама строковая метка (не заботясь о сканере для ввода пользователем, у меня есть это в другом классе). Я обнаружил, что если я установлю высоту метки, а затем, когда этот цикл завершит печать этикетки (все еще пытаясь понять, как центрировать ее в форме), я найду это.
public static void drawDiamond(int height, int labelHeight, String label) { int halfHeight = height / 2; for (int row = 0; row lt; labelHeight; row ) { for (int column = 0; column lt; height; column ) { if ((column == Math.abs(row - halfHeight)) || (column == (row halfHeight)) || (column == (height - row halfHeight - 1))) { System.out.print("*"); } else { System.out.print(" "); } } System.out.println(); } System.out.println(label); }
Но моя конкретная проблема заключается в том, чтобы продолжать создавать алмаз после печати этикетки. Возможно, лучшим вариантом было бы распечатать весь треугольник, а затем заменить метку в правильной строке, но, поскольку это не одна строка, это головная боль. Извините, что это долго. Есть какие-нибудь мысли?
Редактировать: Я включил дополнительный цикл после того, как итератор строк достигнет высоты метки, а затем распечатает метку. Так что я получаю что-то близкое по форме (за исключением наконечника lol). Но теперь моя проблема заключается в том, чтобы поместить метку в центр фигуры. Я не могу применить грубую силу, добавив печатное пространство со звездочками, потому что размер изменится при вводе пользователем. Я могу попытаться получить доступ к тому, где в предыдущей строке были символы, или каким-то образом определить центр только в силу формы ромба, а затем каким-то образом разместить соответствующую метку.
Комментарии:
1. Где бы и когда бы вы ни думали о ASCII, я настоятельно призываю вас думать о нем как о UTF-8 (его преемнике).
2. Спасибо @ControlAltDel за это разъяснение/исправление. У меня все еще возникают проблемы с тем, чтобы этикетка находилась в центре формы. Я думаю, что мне нужно преобразовать строку в символ [], а затем каким-то образом указать, где были расположены предыдущие символы в предыдущей строке, а затем поместить символы в столбец 1 или -1 в зависимости от того, где высота метки находится по отношению к середине треугольника.
3. Я добавил некоторую логику, которая берет половину столбца (которая каким-то образом последовательно эквивалентна высоте треугольника), а затем помещает метку на полпути минус символы в самой метке. Я довольно близок к этому. За исключением того, что у меня нет звезд на той конкретной строке, где находится этикетка.
4. @dkennedy533 вы пробовали мой ответ?
Ответ №1:
Вы можете использовать height
и labelheight
определить положение, с которого text
начинается. X or vertical
должность будет labelheight/2
. Позвольте мне объяснить, как получить позицию Y or horizontal
на примере.
Предположим, мы хотим расположить текст по центру строки ниже.
---------------- sample | This position will be ( length of line / 2 ) - (length of text / 2). Because if we place text in the center, half the length of the text will be on the left side, subtracting that will give us the left position where our text should start.
Во-первых, получите xPos
и yPos
перед for
циклом.
int xPosWord = labelHeight / 2; int yPosWord = (height) / 2 - (label.length() / 2);
Затем внутри for
цикла проверьте, следует ли печатать текст с использованием row
и column
индекса.
if (row == xPosWord) { if (column gt;= yPosWord amp;amp; column lt; yPosWord label.length()) { System.out.print(label.charAt(column - yPosWord)); continue; } }
Образец вывода для drawDiamond(15, 15, "Sample Text")
:
* * * * * * * * * * * * * * Sample Text * * * * * * * * * * * * * *
Описанный выше подход работает для текста, длина которого не превышает ширину ромба.