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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2010, 13:23   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос Pascal: игрушка!!!

Уважаемые дамы и господа!!!
Помогите разобраться с програмкой,
я пишу игру "Танчики"
Проблема состоит в том, что танк вылазит за пределы желтого квадрата,
хотя не должен!!!
Я надеюсь надеюсь на ваш зоркий глаз товарищи, надеюсь вы увидите где я ошибся.
Код:
Uses Graph,Crt;
Var 
    x,y:integer;
    key,key2:char;

{ PRORISOVKA  "TANKA" }
Procedure TANKvniz (var x,y:integer);       {tank edet vniz}
 begin
 SetFillStyle(1,2); Bar(160+x,70+y,214+x,114+y); Bar(160+x,70+y,174+x,124+y);
 Bar(200+x,70+y,214+x,124+y); SetFillStyle(1,4); Bar(175+x,85+y,200+x,95+y);
 Bar(185+x,95+y,190+x,124+y);
 end;

Procedure TANKvverh (var x,y:integer);      {tank edet vverh}
 begin
 SetFillStyle(1,2); Bar(160+x,80+y,214+x,124+y); Bar(160+x,70+y,175+x,124+y);
 Bar(200+x,70+y,214+x,124+y); SetFillStyle(1,4); Bar(200+x,110+y,175+x,100+y);
 Bar(185+x,100+y,189+x,70+y);
 end;

Procedure TANKvpravo (var x,y:integer);     {tank edet vpravo}
 begin
 SetFillStyle(1,2); Bar(160+x,70+y,200+x,124+y); Bar(160+x,70+y,214+x,84+y);
 Bar(160+x,124+y,214+x,110+y); SetFillStyle(1,4); Bar(175+x,85+y,185+x,110+y);
 Bar(185+x,100+y,214+x,95+y);
 end;

Procedure TANKvlevo (var x,y:integer);      {tank edet vlevo}
 begin
 SetFillStyle(1,2); Bar(214+x,124+y,174+x,70+y); Bar(214+x,124+y,160+x,110+y);
 Bar(214+x,70+y,160+x,84+y); SetFillStyle(1,4); Bar(199+x,109+y,190+x,85+y);
 Bar(190+x,95+y,160+x,100+y);
 end;

Procedure ZakraskaTanka (x,y:integer);
 begin
 SetFillStyle(1,0);
 Bar(160+x,70+y,214+x,124+y);
 end;

Begin
SetColor (yellow);                 {cvet izobrajeniya "YELLOW" }
Rectangle (150,60,470,380);        {kyb - storona 320          }
x:=0; y:=0;                        {tank v verhnem levom ygly  }
TANKvniz(x,y);

WHILE KEYPRESSED DO READKEY;       {otchistka byfera klaviatyri}

REPEAT
if keypressed then
 Begin
 key:=readkey;
 If key=#0 Then Begin               {esli klavisha rashirennaya }
                key2:=readkey;
                Case key2 of
                #72:Begin           {strelka vverh              }
                    if (y<>-9) or (y<>319) then
                    begin
                    ZakraskaTanka(x,y);
                    y:=y-1;
                    TANKvverh(x,y);
                    end;
                    End;
                #75:Begin           {strelka vlevo              }
                    if (x<>-9) or (x<>319) then
                    begin
                    ZakraskaTanka(x,y);
                    x:=x-1;
                    TANKvlevo(x,y);
                    end;
                    End;
                #77:begin           {strelka vpravo             }
                    if (x<>-9) or (x<>319) then
                    begin
                    ZakraskaTanka(x,y);
                    x:=x+1;
                    TANKvpravo(x,y);
                    end;
                    End;
                #80:Begin           {strelka vniz               }
                    if (y<>-9) or (y<>319) then
                    begin
                    ZakraskaTanka(x,y);
                    y:=y+1;
                    TANKvniz(x,y);
                    end;
                    End;
                end;
                End;
 End;
UNTIL key=#27;
CloseGraph;
End.
sir.andrey вне форума Ответить с цитированием
Старый 09.07.2010, 13:30   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ну ограничивайте движения до желтого квадрата, в чем сложность, разобраться не можете в том что сами написали?
Цитата:
я пишу игру "Танчики"
у вас вон есть процедуры вверх, вправо итд добавьте в них условия типо если танк дошел до ж. квадрата то остановить его

Последний раз редактировалось NiCola999; 09.07.2010 в 13:35.
NiCola999 вне форума Ответить с цитированием
Старый 09.07.2010, 13:41   #3
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
ну ограничивайте движения до желтого квадрата, в чем сложность, разобраться не можете в том что сами написали?

у вас вон есть процедуры вверх, вправо итд добавьте в них условия типо если танк дошел до ж. квадрата то остановить его
Я так и сделал!!!
у меня стоят условия
Код:
#72:Begin           {strelka vverh              }
                    if (y<>-9) or (y<>319) then
                    begin
                    ZakraskaTanka(x,y);
                    y:=y-1;
                    TANKvverh(x,y);
                    end;
                    End;
при y=0
танк будет на 10 от границы, т.е. когда y=-9 танк будет стоять впритык
к границе, но не на ней. ну и все остальные грани так же.

И еще не могу понять, почему мигает изображение?

Последний раз редактировалось Stilet; 13.07.2010 в 08:15.
sir.andrey вне форума Ответить с цитированием
Старый 09.07.2010, 14:37   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Как бы в паскале не DirectX или OpenGL графика, а BGI(16-цветная), да и тем более Turbo Pascal рассчитан под DOS - вот и делайте соответствующие выводы.
И ещё вот. Танк двигается слишком медленно - поставьте не y:=y-1(к примеру), а y:=y-3. Однако, если вы это сделаете, моргать будет ещё сильней

Последний раз редактировалось _-Re@l-_; 09.07.2010 в 14:42.
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.07.2010, 14:39   #5
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Как бы в паскале не DirectX или OpenGL графика, а BGI(16-цветная), да и тем более Turbo Pascal рассчитан под DOS - вот и делайте соответствующие выводы.
Чет я не понял, к чему это...
Вы че, типа не верите что на паскале можно написать игру?
sir.andrey вне форума Ответить с цитированием
Старый 09.07.2010, 14:47   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
И еще не могу понять, почему мигает изображение?
Цитата:
Как бы в паскале не DirectX или OpenGL графика, а BGI(16-цветная), да и тем более Turbo Pascal рассчитан под DOS - вот и делайте соответствующие выводы.
Вы...э-э-э...сами то смотрите, какие вопросы задаёте?Выводы состоят в том, что графика в те времена была несколько другая, чем сейчас, собственно, качество было заметно хуже.
Цитата:
Вы че, типа не верите что на паскале можно написать игру?
Типа я верю, сам писал - однако, это достаточно сложно; уж поверьте, сделать подобное на Delphi куда проще.Допустим, вот вы изменяете направление танка процедурами, которые просто отрисовывают новый танк, но повёрнутый в другую сторону - а вот в Delphi можно просто стирать старое изображение и загружать картинку, на которой танк повёрнут в другую сторону(т.е. есть 4 спрайта, где танк изображён в разных направлениях - и в нужный момент можно загружать нужное изображение).
P.S. Если нужна помощь в реализации какой-нибудь процедуры или фукнции для танчиков, обращайтесь(я не фрилансер, помогаю бесплатно)

Последний раз редактировалось _-Re@l-_; 09.07.2010 в 14:50.
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.07.2010, 14:51   #7
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Плохо

Цитата:
P.S. Если нужна помощь в реализации какой-нибудь процедуры или фукнции для танчиков, обращайтесь(я не фрилансер, помогаю бесплатно)
Спасибо!
Мне надо именно на паскале!!!
И не понятно мне почему танк вылазит за пределы квадрата, по идее он не должен!

Последний раз редактировалось sir.andrey; 09.07.2010 в 14:56.
sir.andrey вне форума Ответить с цитированием
Старый 09.07.2010, 15:02   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вроде как-то так: (допустим, координаты прямоугольника (10,10,100,100) - это координаты крайних углов)
Пусть х и у - координаты крайних сторон танка
Код:
Case key2 of
                #72:Begin           {strelka vverh              }
                    if y>10 then
                    begin
                    ZakraskaTanka(x,y);
                    y:=y-1;
                    TANKvverh(x,y);
                    end;
                    End;
                #75:Begin           {strelka vlevo              }
                    if x>10 then
                    begin
                    ZakraskaTanka(x,y);
                    x:=x-1;
                    TANKvlevo(x,y);
                    end;
                    End;
                #77:begin           {strelka vpravo             }
                    if x<100 then
                    begin
                    ZakraskaTanka(x,y);
                    x:=x+1;
                    TANKvpravo(x,y);
                    end;
                    End;
                #80:Begin           {strelka vniz               }
                    if y<100 then
                    begin
                    ZakraskaTanka(x,y);
                    y:=y+1;
                    TANKvniz(x,y);
                    end;
                    End;
                end;
И помните, что при движении по горизонтали изменяются только координаты абсцисс, а по вертикали только координаты ординат.

Последний раз редактировалось _-Re@l-_; 09.07.2010 в 15:05.
_-Re@l-_ вне форума Ответить с цитированием
Старый 09.07.2010, 15:13   #9
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Как же я затупил...
Ставил везде двойные условия...

_-Re@l-_ спасибо вам огромное!

У меня возникла новая проблема...
Когда вражеский танк стреляет в мой, причем у моего танка
координаты больше чем у вражеского, то полет снаряда меняется,
снаряд летит не прямо, а сдвигаясь, по идее этого не должно происходить.
А раз происходит, то вероятно, меняются переменные stopX и stopY
Помогите мне пожалуйста, я понимаю что это будет не легко.

p.s. Скрин сдвига и txt файл с кодом в архиве.
Вложения
Тип файла: rar л.rar (2.9 Кб, 19 просмотров)

Последний раз редактировалось Stilet; 13.07.2010 в 08:20.
sir.andrey вне форума Ответить с цитированием
Старый 13.07.2010, 08:26   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
то полет снаряда меняется,
снаряд летит не прямо, а сдвигаясь
Знаешь я бы на твоем месте подумал сейчас не об этом а о том что тебе бы стоило переписать игру заново. Танки слишком большие, двигаются медленно, как-то рывками... А у тебя уже код разросся в достаточно тяжелую программу.
Может быть конечно я придираюсь зря, но всетки подумай - твою программу стоит оптимизировать. Возможно проще будет перевести ее на объектную модель.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
графическая игрушка alex(21) Паскаль, Turbo Pascal, PascalABC.NET 19 04.05.2012 22:54
Игрушка Nester Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 15.01.2009 19:02
Игрушка Rusl92 Мультимедиа в Delphi 8 25.09.2008 12:11
игрушка в курсовике EDG_aka_Dima Помощь студентам 2 25.05.2007 06:13
Игрушка Rozalinda Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 14.01.2007 22:00