Создайте графику с помощью Pascal

Я пытаюсь создать какуро с помощью Pascal, программа должна сделать какуро пустым (что-то вроде это) и верните его завершенным (что-то вроде это). Я уже загрузил данные (из файла) и перешел к одному 2d-массиву.

Проблема, которую я обнаружил, связана с диагонально разделенными квадратами, я не знаю, как я могу напечатать это деление и число на каждой из сторон с помощью консоли Pascal.

Пробовал использовать графические библиотеки Pascal, но алгоритм должен работать на нескольких компьютерах с разными компиляторами, а Pascal не имеет унифицированных библиотек, только crt и с этим не помогает (или не могу найти).

Также я пробую что-то вроде ASCII, создавая сетку с -- и '|`, но когда я печатаю значения с двумя цифрами, искажаю весь вывод, код такой:

for c := 1 to maxc do
begin
  for f := 1 to maxf do
  begin
    WriteLn('+---+');
    WriteLn('|\',tablero[v,f,c],'|');
    WriteLn('| \ |');
    WriteLn('|', tablero[h,f,c], '  \|');
    WriteLn('+---+');
  end;
  WriteLn();
end;

И проблема в выводе вы можете увидеть это:

+---+
|\-1|
| \ |
|23 \|
+---+
+---+
|\0|
| \ |
|0 \|
+---+

Я думал о создании еще одного 2d-массива внутри моего 2d-массива, но если я это сделаю, я получу что-то вроде:

+---+
|   |
|---|
|   | 
+---+

Делить пополам, и это нужно делать по диагонали, так что тоже не очень хорошо работает.


person nastrand    schedule 30.11.2013    source источник
comment
Я думаю, теперь это хорошо, если чего-то не хватает, просто дайте мне знать.   -  person nastrand    schedule 01.12.2013
comment
Можете ли вы также добавить написанный вами код, который у вас не работает? Вы говорите, что пробовали что-то вроде ascii; опубликуйте код, который вы пробовали, но это не сработало.   -  person Ken White    schedule 01.12.2013
comment
У меня нет точного кода, но у меня есть код, который я написал с ответом Скотта Хантера, через минуту я отредактирую первый пост и добавлю его.   -  person nastrand    schedule 01.12.2013


Ответы (1)


Используйте спецификатор MinWidth для ваших целочисленных значений.

WriteLn(intValue:2);   // displays the number with a width of 2

Для значений с плавающей запятой вы также можете добавить значение количества десятичных знаков:

WriteLn(floatVal:5:2); 

Вы можете найти документацию для спецификатора в System.Write — это документация Delphi, но Delphi давно уходит своими корнями в Turbo Pascal, а Write/WriteLn являются устаревшими функциями Pascal и не изменились.

Параметр записи имеет вид:

OutExpr [: MinWidth [: DecPlaces ] ]

где OutExpr — выходное выражение.

MinWidth и DecPlaces представляют собой целочисленные выражения типа:

MinWidth указывает минимальную ширину поля, которая должна быть больше 0. Записываются ровно символы MinWidth (с использованием начальных пробелов, если необходимо), за исключением случаев, когда OutExpr имеет значение, которое должно быть представлено в большем количестве символов, чем MinWidth. В этом случае записывается достаточно символов для представления значения OutExpr. Аналогично, если MinWidth опущен, то записывается необходимое количество символов для представления значения OutExpr.

DecPlaces задает количество десятичных разрядов в представлении с фиксированной точкой одного из типов Real. Его можно указать только в том случае, если OutExpr является одним из типов Real и если также указан MinWidth. Если указано значение MinWidth, оно должно быть больше или равно 0.

Вот краткий пример:

NT = 12;
NB = -1;

WriteLn('+---+');         
WriteLn('|\', NT:2, '|'); 
WriteLn('| \ |');         
WriteLn('|', NB:2, '\|'); 
WriteLn('+---+');         
ReadLn;

Это производит

+---+
|\12|
| \ |
|-1\|
+---+

Если вам нужно больше выходных данных, чем две ширины, вам нужно увеличить коробку:

+-----+
|\ 120|
| \   |
|  \  |
|   \ |
|123 \|
+-----+
person Ken White    schedule 02.12.2013
comment
Работает отлично! я вставил в цикл и использовал функцию GoToXY библиотеки crt для создания сетки, единственная проблема возникает, когда координаты Y (высота) превышают 20 пикселей (я думаю, потому что размер экрана паскаля 80 * 25), я буду смотреть как это исправить. Спасибо за помощь :D - person nastrand; 07.12.2013