Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2015, 08:03   #1
Типичный Селезень
 
Регистрация: 06.01.2015
Сообщений: 4
По умолчанию Перемещение и размножение варваров в ASCII игре(Free Pascal)

Доброго времени суток. Я хочу понять, где в процедуре ошибка. Абсолютно не понимаю, что тут идет не так. Заранее спасибо за ответы и извините за код.

У меня некорректно работает процедура перемещения монстров - при движении друг за другом, в погоне за героем, монстры (те самые варвары) увеличивают своё поголовье таким вот образом:

начало процедуры: @....bb (2 варвара('b') бегут со скоростью 2 клетки('.') в ход за героем('@'), между ними -пустое пространство в 4 клетки)
конец процедуры: @..bb.b (уже 3 варвара движутся за героем)

А должно быть так: @..b..b(задний варвар утыкается в переднего, останавливается, затем передний идет спокойно), или так: @..bb..(оба проходят вперед)

Код процедуры перемещения монстров:

Код:
procedure movemonsters;
begin
    miscl:=0 ;
    fortodostop:=false;
    for y :=1 to scrncy do
       for x:=1 to scrncx do
           begin
               monstersmoved[x,y]:=0;
           end;
    repeat
       fortodostop:=false;
       miscl:=miscl+1;
       for y:=1 to scrncy do
           for x:= 1 to scrncx do
                for x1:=1 to 5 do
                   for y1:= 1 to 5 do
                       if (fortodostop=false) and (monsterindex[x1,y1,x,y]<>'.') and (y1-monstersmoved[x,y]>0)
                       then begin
                            misca:=x1;
                            miscb:=y1;
                            miscc:=x;
                            miscd:=y;
                            monstersymbol:=monsterindex[x1,y1,x,y];
                            fortodostop:=true;
                       end;
       miscx:=miscc;
       miscy:=miscd;
    {gotoxy(1,2);
write('  ',misca,' ',miscb,' ',miscc,' ',miscd,' ',miscx,' ',miscy,' ',monstersymbol,' ',misci,'',misck,' ') ;
    }
       misci:=miscc-herox;
       misck:=miscd-heroy;
    {gotoxy(1,1);
    write('  ',misca,' ',miscb,' ',miscc,' ',miscd,' ',miscx,' ',miscy,' ',monstersymbol,' ',misci,'',misck,' ',movedmonsters,' ') ;
     }
       if misci>0
       then miscc:=miscc-1;
       if misci<0
       then miscc:=miscc+1;
       if misck>0
       then miscd:=miscd-1;
       if misck<0
       then miscd:=miscd+1;

       {archers shoot}
       if (monsters[miscx,miscy]='a') and (abs(misci)<5) and (abs(misck)<5)
       then begin
            gotoxy(1,1);
            write('the archer shoot an arrow at you');
            herohealth:=herohealth-1;
            gotoxy(1,3);
            write(herohealth,' ');
            monstersmoved[miscx,miscy]:=10;
            end
       else

       if (miscc=herox) and (miscd=heroy)
       then begin
           herohealth:=herohealth-miscb;
           gotoxy(1,3);
           write(herohealth,' ');
           monstersmoved[miscx,miscy]:=10;
           end
       else

       if (monsters[miscc,miscd]='.') and (obstacles[miscc,miscd]=false)
       then begin
           monsterindex[misca,miscb,miscx,miscy]:='.';
           screen[miscx,miscy]:= '.' ;
           monsters[miscx,miscy]:='.';
           gotoxy(miscx,miscy) ;
           write('.');

           monstersmoved[miscc,miscd]:=monstersmoved[miscx,miscy];
           monstersmoved[miscx,miscy]:=0;

           monsterindex[misca,miscb,miscc,miscd]:=monstersymbol;
           screen[miscc,miscd]:= monstersymbol;
           monsters[miscc,miscd]:=monstersymbol;
           gotoxy(miscc,miscd);
           write(monstersymbol);
           monstersmoved[miscc,miscd]:=monstersmoved[miscc,miscd]+1;
           end
       else monstersmoved[miscx,miscy]:=10;

    until (fortodostop=false) or (miscl=500);

    {screen[]:=
    monsterindex[]:=
    monstermoved[]:=
    monsters[]:=}
end;
Типичный Селезень вне форума Ответить с цитированием
Старый 06.01.2015, 15:06   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Можно проектом (полный исходник)?
Понять что-то сложно, очень большая процедура, подумайте о декомпозиции.
В Вашем примере непонятно тоже - варвары должны только продвинуться, или же должны ещё размножиться ? По каким правилам они размножаются ? Вы привели в описании "того, что должно быть" - только продвижение, причём 2 разных, которые тоже непонятно по какому принципу выбираются.
В общем, нужны исходник и детальные описания : при какой начальной картинке должна получиться какая конечная, и что получается по факту. Ну и при возможности улучшить код - отрефакторить, прокомментировать и т.д.
phomm вне форума Ответить с цитированием
Старый 06.01.2015, 21:57   #3
Типичный Селезень
 
Регистрация: 06.01.2015
Сообщений: 4
По умолчанию

И снова здравствуйте.
Я сделаю декомпозицию, но сначала хочу понять в чем ошибка.
Код процедуры кажется мне довольно простым, но с добавлением финального else выявляется описанная проблема с "размножением" варваров- они не должны так делать, они должны все лишь двигаться к игроку на 1 клетку, а затем -еще на одну, так как их скорость - 2 (2-ой показатель в массиве monsterindex).

Словами алгоритм в процедуре следующий:

0.повторяем:
1.находим в массиве monsterindex[здоровье,скорость,x,y] персонажа(не точку), чья скорость больше, чем количество совершенных ходов.
2.определяем расстояние до игрока
2.если лучник, то пробует стрелять один раз и останавливается.
3.если герой рядом, то бьет того один раз и останавливается.
4.если герой далеко, то движется к нему.
5.если препятствие на пути останавливается.
0.пока проверка всего массива не выявляет не ходивших песонажей, или не происходит бесконечный цикл(нет, сейчас он не происходит).

Код и программа целиком тут: Ducktype.ucoz.ru. В программе уже 1000+ строк, но она может быть полезна кому-нибудь, кто захочет сделать что-нибудь своё в жанре roguelike. Я лично не нашел исходников других игр в Паскале.
Типичный Селезень вне форума Ответить с цитированием
Старый 06.01.2015, 23:24   #4
OldOwlOll
Форумчанин
 
Аватар для OldOwlOll
 
Регистрация: 28.11.2014
Сообщений: 172
По умолчанию

А что значит фраза
Цитата:
Сообщение от Типичный Селезень Посмотреть сообщение
0.пока проверка всего массива не выявляет не ходивших песонажей,
?
происходит ли "размножение" если варвар наталкивается на другое препятствие?
Делать то, что любишь - это свобода. Любить то, что делаешь - счастье. (с)
Свободу киндерам!
Счастья всем. Бесплатно. И пусть никто не уйдет обиженным. (с)

Последний раз редактировалось OldOwlOll; 06.01.2015 в 23:28.
OldOwlOll вне форума Ответить с цитированием
Старый 07.01.2015, 00:18   #5
Типичный Селезень
 
Регистрация: 06.01.2015
Сообщений: 4
По умолчанию

Цитата:
происходит ли "размножение" если варвар наталкивается на другое препятствие?
нет, препятствия просто останавливают.

Цитата:
А что значит фраза 0.пока проверка всего массива не выявляет не ходивших песонажей
Я имел в виду, что пока проверка всего массива не перестаёт выявлять не ходивших персонажей. (fortodostop=false)
Типичный Селезень вне форума Ответить с цитированием
Старый 12.01.2015, 09:21   #6
Типичный Селезень
 
Регистрация: 06.01.2015
Сообщений: 4
По умолчанию

Доброго времени суток. Вот так работает, спасибо всем, кто ответил.
Код:
procedure movemonsters;
begin

    reala:=0;                    {присваиваем переменным значения "по умолчанию"}
    fortodostop:=false;
    for y :=1 to scrncy do
       for x:=1 to scrncx do
           begin
               monstersmoved[x,y]:=0;
           end;

    repeat                                         {начало цикла repeat-until}
       movecheck:=false;     
       fortodostop:=false;
       for y:=1 to scrncy do                               {поиск монстра}
           for x:= 1 to scrncx do
                for x1:=1 to 5 do
                   for y1:= 1 to 5 do
                       if (fortodostop=false) and
                          (monsterindex[x1,y1,x,y]<>'.')and
                          (y1>monstersmoved[x,y]) then
                          begin
                            misca:=x1;
                            miscb:=y1;
                            miscc:=x;
                            miscd:=y;
                            monstersymbol:=monsterindex[x1,y1,x,y];
                            fortodostop:=true;
                          end;
       miscx:=miscc;
       miscy:=miscd;
                                                         {отслеживание позиции персонажа}
       misci:=miscc-herox;
       misck:=miscd-heroy;
    
       if misci>0
       then miscc:=miscc-1;
       if misci<0
       then miscc:=miscc+1;
       if misck>0
       then miscd:=miscd-1;
       if misck<0
       then miscd:=miscd+1;

       {archers shoot}                                               {лучники стреляют}
       if (monsters[miscx,miscy]='a') and (abs(misci)<5) and (abs(misck)<5)
       then begin
            gotoxy(1,1);
            write('the archer shoot an arrow at you');
            herohealth:=herohealth-1;
            gotoxy(1,3);
            write(herohealth,' ');
            monstersmoved[miscx,miscy]:=monstersmoved[miscx,miscy]+2;
            movecheck:=true;
            end;
                                                                                {рукопашная, если герой рядом}
       if (miscc=herox) and (miscd=heroy) and not movecheck
       then begin
           herohealth:=herohealth-miscb;
           gotoxy(1,3);
           write(herohealth,' ');
           monstersmoved[miscx,miscy]:=monstersmoved[miscx,miscy]+2;
           movecheck:=true;
           end;
                                                                  {перемещение на одну клетку}
       if (monsters[miscc,miscd]='.') and (obstacles[miscc,miscd]=false) and not movecheck
       then begin
           monsterindex[misca,miscb,miscx,miscy]:='.';
           screen[miscx,miscy]:= '.' ;
           monsters[miscx,miscy]:='.';
           gotoxy(miscx,miscy) ;
           write('.');
           monstersmoved[miscc,miscd]:=monstersmoved[miscx,miscy];
           monstersmoved[miscx,miscy]:=0;
           monsterindex[misca,miscb,miscc,miscd]:=monstersymbol;
           screen[miscc,miscd]:= monstersymbol;
           monsters[miscc,miscd]:=monstersymbol;
           gotoxy(miscc,miscd);
           write(monstersymbol);
           monstersmoved[miscc,miscd]:=monstersmoved[miscc,miscd]+1;
           movecheck:=true;
           end;

                                                                     {остановка, если нет возможности ходить}
         if not movecheck
         then monstersmoved[miscx,miscy]:=monstersmoved[miscx,miscy]+1;
                                                                   {отмечаем, что монстр сходил} 
         reala:=reala+(1/miscb);

       until (reala>=monsteramount);


  end;
Типичный Селезень вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение по матрице( Free Pascal) Nastya1221 Помощь студентам 0 04.07.2012 18:08
free pascal Риналь Паскаль, Turbo Pascal, PascalABC.NET 2 05.04.2012 14:55
Turbo Pascal и Free Pascal , в чем разница? antoxann Паскаль, Turbo Pascal, PascalABC.NET 31 09.11.2011 07:52
Free Pascal GreenDay Помощь студентам 0 03.05.2011 08:55
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28