![]() |
![]() |
Zveruga |
![]()
Сообщение
#1
|
|||
![]() Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Рома Репутация: ![]() ![]() ![]() |
Привет, Всем
![]() Пытаюсь написать игру ханойские башни для сдачи курсовой (заочник) ![]() ![]() Алгоритм такой: Все пастроенно на массиве N строк и 3 столбца, далее этот массив заполняется так: 1 0 0 2 0 0 ....... N 0 0 далее нажатиями клавиш я перезаполняю массив по принципу ханойской башни. В результате добавлю гафическое отображение всех этих действий. диски будут привязаны к элементам массива, строкам и столбцам. Вообщем пока не доработанно из за ожного сбоя. Внимание вопрос: ![]() вот исходник алгоритма заполнения матрици.
uses crt;
var
hb:array[1..9,1..3] of integer;
stop:boolean;
key:char;
i,j,n,m,k,l,a:integer;
begin
clrscr;
write('vvedite chislo diskov ');
readln(m);
{writeln;}
l:=1;
k:=1;
n:=3;
a:=0;
for i:=1 to m do
begin
for j:=1 to n do
begin
hb[i,j]:=k;
write(hb[i,j]:3);
k:=0;
end;
l:=l+1;
k:=k+l;
writeln;
end;
writeln;
{readkey;}
writeln;
stop:=false;
while stop=false do
begin
if keypressed then
key:=readkey;
if (key='q') or (key='Q') then stop:=true;
if (key='1') then j:=1;
if (key='2') then j:=2;
if (key='3') then j:=3;
{принажамтии клавиши вверх "а" присваевается знаяение элемента матрици
вот тут то и проблема, привыборе второго столбца, в нем все элементы "0",
"а" присваевается значение 10, привыборе третьего столбца "а" присваевается
значение 3 откуда эти значения беруться я вообще понять не могу
помогите пожалуйста разобраться в принципе из за этого графическое
представление всего этого действия и остановилось}
if (ord(key)=72) then
begin
i:=0;
repeat
begin
i:=i+1;
a:=hb[i,j];
end;
until hb[i,j]>0;
hb[i,j]:=0;
end;
if (ord(key)=80) then
begin
i:=0;
repeat
begin
i:=i+1;
end;
until (hb[i,j]>0) or (i=m);
if hb[i,j]=0 then
begin
hb[i,j]:=a;
a:=0;
end
else
begin
if (a>=hb[i,j]) or (a=0) then writeln('NO') else
begin
i:=i-1;
hb[i,j]:=a;
a:=0;
end;
end;
end;
if (ord(key)=13) then
begin
for i:=1 to m do
begin
for j:=1 to n do
begin
write(hb[i,j]:3);
end;
writeln;
end;
writeln(a);
end;
key:=readkey;
end;
end.
Как сделю все полностью закончу вывложу полный исходник может кому пригодится ![]()
|
|||
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Как сделю все полностью закончу вывложу полный исходник может кому пригодится Четвертый-то? Вообще-то в FAQ-е лежит 3 программы "Ханойские башни", это так, на всякий случай, для любителей вечно изобретать велосипеды... |
Zveruga |
![]()
Сообщение
#3
|
![]() Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Рома Репутация: ![]() ![]() ![]() |
Четвертый-то? Вообще-то в FAQ-е лежит 3 программы "Ханойские башни", это так, на всякий случай, для любителей вечно изобретать велосипеды... Я не любитель изобретать велосипед, но когда темы к курсовым работам всегда одни и теже деваться не куда, а если брать чье-то решение не всегда оканчивается хорошо ![]() Гораздо приятнее сделать что-то самому, чем брать уже готовое решение ![]() Будет 4-ый экземпляр, что в этом плохого? ![]() и проблема вот в этом ![]() принажамтии клавиши вверх "а" присваевается знаяение элемента матрици вот тут то и проблема, привыборе второго столбца, в нем все элементы "0", "а" присваевается значение 10, привыборе третьего столбца "а" присваевается значение 3 откуда эти значения беруться я вообще понять не могу помогите пожалуйста разобраться в принципе из за этого графическое представление всего этого действия и остановилось Сообщение отредактировано: Zveruga - 20.11.2007 10:22 |
Lapp |
![]()
Сообщение
#4
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Будет 4-ый экземпляр, что в этом плохого? ![]() Для начала, несколько общих замечаний. 1. Научись форматировать. Я минут пять провел в двиганьи твоих строк туда-сюда, прежде чем программа приобрела нормальный вид. 2. Используй оператор case, во многих случаях это проясняет программу. Например, твое: if (key='q') or (key='Q') then stop:=true;
if (key='1') then j:=1;
if (key='2') then j:=2;
if (key='3') then j:=3;
- все можно заменить на такую конструкцию: case key of
'q','Q': stop:=true;
'1': j:=1;
'2': j:=2;
'3': j:=3;
end;
3. Оператор repeat ... until сам по себе представляет операторные скобки, begin и end внутри него не нужны. 4. Вместо Stop=false рекомендую писать not Stop. 5. Выводи чуть больше пояснений. Когда прога останавливается молча - непонятно, что жать.. Теперь по твоей проблеме. В том блоке, который ты пытался выделить жирным (я исправил, никогда больше не делай так в программном тексте), есть явная ошибка. Ты проверяешь условие на элемент матрицы, но НЕ проверяешь индекс. Поэтому ты легко выскакиваешь за пределы массива. Если у тебя включена опция Range Check, то это приведет к ошибке, а если не включена - то к непредсказуемому поведению проги (что, как я понимаю, и случилось). Рекомендую держать Range Check включенным на этапе отладки. Исправь и приноси новый вариант программы. Будем разбираться дальше ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 24.07.2025 14:21 |