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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2007, 23:44   #1
Lazzy
 
Аватар для Lazzy
 
Регистрация: 14.12.2007
Сообщений: 3
Стрелка цель игры - управляя корабликом стрелками, пройти дистанцию за наименьшее время.

Привета!
Задача формулировалась преподом довольно размыто, поэтому может присутствовать некоторая вольность в выполнении, что не может не радовать. Смысл в том, чтоб написать на Pascal (к сожалению) игру, в которой есть кораблики, соревнующиеся между собой Препод седой уже, кстати. Он хотел там видеть возможность выбора направления ветра и хода корабликов галсами при встречном ветре, но реализовать управление парусами, по-моему, слишком сложно, а как без этого галсами ходить? Поэтому реализация мне видится так: вид сверху на остров либо замкнутый кольцевой канал, один кораблик с мотором, цель игры - управляя корабликом стрелками пройти дистанцию за наименьшее время. Если у кого-то возникнет желание помочь или вдруг есть какие-то наработки, буду очень признателен.
От этой решения задачи во многом зависят мои отношения с преподом, так как с ним случались конфликты. Не симпатичны мне почему-то люди, которые сами мало что умея, берутся учить других.
Отписывайтесь, заранее спасибо за любую помощь.
Lazzy вне форума Ответить с цитированием
Старый 15.12.2007, 00:10   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Уже хоть что-то сделано или всё пока на стадии размышлений по теме:
Цитата:
От этой решения задачи во многом зависят мои отношения с преподом, так как с ним случались конфликты. Не симпатичны мне почему-то люди, которые сами мало что умея, берутся учить других.
Отписывайтесь, заранее спасибо за любую помощь.
Если так тема отправится в утиль или Фриланс
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 15.12.2007, 07:57   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Если ты умнее седых преподавателей, чтож ты кораблик-то сам не нарисуешь?
puporev вне форума Ответить с цитированием
Старый 15.12.2007, 11:21   #4
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

От вас требуется, как минимум - составить описание игры, и функционала. Вам все таки это первоочередно нужно.
Пока все доводы за фриланс.
Цитата:
Сообщение от Lazzy Посмотреть сообщение
поэтому может присутствовать некоторая вольность в выполнении, что не может не радовать.
А может тогда морской бой
Alex21 вне форума Ответить с цитированием
Старый 15.12.2007, 16:50   #5
Lazzy
 
Аватар для Lazzy
 
Регистрация: 14.12.2007
Сообщений: 3
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Если ты умнее седых преподавателей, чтож ты кораблик-то сам не нарисуешь?
Во-первых, я не говорил, что я умнее кого-либо, не привык себя оценивать с такой стороны. Даже если бы я и говорил и/или был умнее препода, ум не означает умение "нарисовать кораблик", которое как раз прямо пропорционально уровню преподавания предмета.
Во-вторых, спасибо за ценный совет гы
В-третьих, я отчаянно пытаюсь написать эту программу, не выкладывал ее, потому что очень корявая. Вот результаты =/
Код:
program MAPA3M;
uses crt, graph;
var
Gd,Gm:integer;
posX,posY:integer;
ch:char;

procedure bereg;
 begin
   setcolor(yellow);
   setfillstyle(7,yellow);
   sector(280,200,0,360,100,50);
   sector(360,200,0,360,80,80);
   sector(280,280,0,360,120,70);
   sector(360,280,0,360,60,75);
   sector(15,450,0,360,55,80);
   sector(260,460,0,360,60,30);
   sector(600,470,0,360,150,30);
   sector(15,410,0,360,20,80);
   sector(30,20,0,360,40,25);
   sector(500,0,0,360,90,50);
   sector(600,15,0,360,80,50);
   sector(630,230,0,130,50,100);
   sector(610,160,0,120,50,120);
   sector(610,450,0,110,75,100);
   sector(650,350,0,220,60,100);
   sector(140,15,0,200,80,30);
   sector(200,20,0,360,100,50);
   sector(60,150,60,220,150,200);
   sector(150,30,0,360,100,100);
   sector(5,240,30,330,40,90);
   sector(630,240,0,360,70,100);
   sector(360,5,0,360,100,30);
   sector(630,240,110,300,70,100);
   sector(0,280,0,360,80,100);
   sector(100,470,360,360,120,60);
   pieslice(380,420,200,340,100);
 end;
begin
 clrscr;
 Gd:=VGA;
 Gm:=VGAhi;
 initgraph(Gd,Gm,'');
 if graphresult=grok then
  begin
   bereg;
   setcolor(brown);
   setfillstyle(1,brown);
   posX:=500;
   posY:=250;
   fillellipse(posX,posY,1,1);
   repeat
     ch:=readkey;
     case ch of
      #72:begin posY:=posY-5; fillellipse(posX,posY,1,1);setcolor(black);
          setfillstyle(0,black);fillellipse(posX,posY+5,1,1);setcolor(brown);
          setfillstyle(1,brown);  end;
      #75:begin posX:=posX-5; fillellipse(posX,posY,1,1);setcolor(black);
          setfillstyle(0,black);fillellipse(posX+5,posY,1,1); setcolor(brown);
          setfillstyle(1,brown);  end;
      #77:begin posX:=posX+5; fillellipse(posX,posY,1,1);setcolor(black);
          setfillstyle(0,black);fillellipse(posX-5,posY,1,1);setcolor(brown);
          setfillstyle(1,brown);  end;
      #80:begin posY:=posY+5; fillellipse(posX,posY,1,1);setcolor(black);
          setfillstyle(0,black);fillellipse(posX,posY-5,1,1);setcolor(brown);
          setfillstyle(1,brown);  end;
      #27:halt;
     end;{case}
   until ch=#27;
   closegraph;
  end
  else
  writeln(grapherrormsg(graphresult));
end.
Тут нарисованы берега "лагуны" с островом посередине, вид сверху. Кораблик обозначен коричневой точкой и управляется с клавиатуры, это пока все =/ Как видите, нету навыка работы с процедурами, пишется сложно =/
Что конкретно неясно как реализовать:
Как сделать чтоб кораблик при нажатиии клавиши начинал двигаться в направлении нажатой стрелки и не прекращал движение? Сейчас он двигается только, когда стрелка нажата.
Можно ли сделать движение по диагонали? Сейчас судно движется только в четырех направлениях.
Как реализовать крушение кораблика при столкновении с берегом? (Видимо, нужно написать функцию, возвращающую значение цвета пикселов вокруг кораблика, и если эти значения равны значению цвету берега - корабль тонет)
Как с помощью Pascal реализовать счетчик времени? Ведь цель игры - пройти дистанцию за наименьшее время. Искал в учебниках, а там работа только с временем системы. Как сделать, чтоб игрок вводил свое имя и результаты записывались в текстовый файл?
Как сделать скорость кораблика независимой от тактовой частоты? Ведь delay зависит, если не ошибаюсь, от этого параметра, значит на разных компьютерах игра с этой процедурой будет иметь разную скорость?
Цитата:
А может тогда морской бой
Морских боев на Pascal в интернете куча, но они не предполагают какое-либо движение кораблей; а вот игр, подобных этой, не смог найти. Как помощь использовал змейку и другие непохожие игры.
Lazzy вне форума Ответить с цитированием
Старый 15.12.2007, 17:52   #6
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Цитата:
Как сделать чтоб кораблик при нажатиии клавиши начинал двигаться в направлении нажатой стрелки и не прекращал движение? Сейчас он двигается только, когда стрелка нажата.
Для этого в исходный код надо еще добавить пару строк:
Код:
var
b:boolean;
Код:
repeat  
b:=keypressed;
if b=true then begin
ch:=readkey;   
     case ch of  
      #72:begin posY:=posY-5; fillellipse(posX,posY,1,1);setcolor(black);   
          setfillstyle(0,black);fillellipse(posX,posY+5,1,1);setcolor(brown);   
          setfillstyle(1,brown);  end;   
      #75:begin posX:=posX-5; fillellipse(posX,posY,1,1);setcolor(black);   
          setfillstyle(0,black);fillellipse(posX+5,posY,1,1); setcolor(brown);   
          setfillstyle(1,brown);  end;   
      #77:begin posX:=posX+5; fillellipse(posX,posY,1,1);setcolor(black);   
          setfillstyle(0,black);fillellipse(posX-5,posY,1,1);setcolor(brown);   
          setfillstyle(1,brown);  end;   
      #80:begin posY:=posY+5; fillellipse(posX,posY,1,1);setcolor(black);   
          setfillstyle(0,black);fillellipse(posX,posY-5,1,1);setcolor(brown);   
          setfillstyle(1,brown);  end;   
      #27:halt;   
     end;{case}  
end;
   until ch=#27;
Теперь ch:=readkey; будет выполняться только в том случае, когда будет нажата кнопка...
Однако Кораблик двигаться сам небудет, поскольку программа должна запоминать последнее нажатие клавиатуры и соответственно выполнять определенное передвижение когда не нажа ниодна из кнопак
Я не маюсь бездельем, я от него тащусь!
Tayfun вне форума Ответить с цитированием
Старый 15.12.2007, 20:23   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Раз препод хочет с парусом, сделай ему с парусом. Согласись, передвижение галсами и простое движение с помощью мотора не одно и то же. Ты сознательно упрощаешь себе задачу, так что на особое внимание препода к своей работе не расчитывай.

Парус - обычная линия. Поворачивается вокруг мачты на 360°, чем круче к ветру тем меньше скорость. В углу экрана сделай компас, в другом углу направление ветра. Яхта стартует, проходит маршрут (обходит буек или несколько буйков) и возвращается на линию старта. Линия старта два буйка соединенные между собой линией.
Переменные:
скорость по оси X, скорость по оси Y :real
координаты x y тоже real
Перед отрисовкой дробную часть откидывай.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 18.12.2007, 23:51   #8
Lazzy
 
Аватар для Lazzy
 
Регистрация: 14.12.2007
Сообщений: 3
Счастье Вот игра.

Цитата:
Раз препод хочет с парусом, сделай ему с парусом.
Я пока сделал с моторчиком. С парусом сложнее, попробую и с парусом. Спасибо за совет.
Цитата:
Однако Кораблик двигаться сам небудет, поскольку программа должна запоминать последнее нажатие клавиатуры и соответственно выполнять определенное передвижение когда не нажа ниодна из кнопак
Теперь кораблик двигается сам, я добавил переменную, запоминающую направлени движения. Смотрите, что получилось. Правила там не описал пока, поэтому здесь кратко: управляем корабликом - кружок, пока не врежемся в берег. Цель - не врезаться подольше.
Код:
program MAPA3M;
uses crt, graph;
var
Gd,Gm:integer;
posX,posY,i:integer;
ch:char;
dir:integer;
procedure
bereg;
begin
   setcolor(yellow);
   setfillstyle(7,yellow);
   sector(280,200,0,360,100,50);
   sector(360,200,0,360,80,80);
   sector(280,280,0,360,120,70);
   sector(360,280,0,360,60,75);
   sector(15,450,0,360,55,80);
   sector(260,460,0,360,60,30);
   sector(600,470,0,360,150,30);
   sector(15,410,0,360,20,80);
   sector(30,20,0,360,40,25);
   sector(500,0,0,360,90,50);
   sector(600,15,0,360,80,50);
   sector(630,230,0,130,50,100);
   sector(610,160,0,120,50,120);
   sector(610,450,0,110,75,100);
   sector(650,350,0,220,60,100);
   sector(140,15,0,200,80,30);
   sector(200,20,0,360,100,50);
   sector(60,150,60,220,150,200);
   sector(150,30,0,360,100,100);
   sector(5,240,30,330,40,90);
   sector(630,240,0,360,70,100);
   sector(360,5,0,360,100,30);
   sector(630,240,110,300,70,100);
   sector(0,280,0,360,80,100);
   sector(100,470,360,360,120,60);
   pieslice(380,420,200,340,100);
end;
procedure
moveship;
begin
  if dir=1 then
   begin
    posY:=posY-5;
    fillellipse(posX,posY,2,2);
    setcolor(black);
    setfillstyle(0,black);
    fillellipse(posX,posY+5,2,2);
    setcolor(brown);
    setfillstyle(1,brown);
    end;{if dir=1}
    if dir=2 then
   begin
    posX:=posX-5;
    fillellipse(posX,posY,2,2);
    setcolor(black);
    setfillstyle(0,black);
    fillellipse(posX+5,posY,2,2);
    setcolor(brown);
    setfillstyle(1,brown);
    end;{if dir=1}
    if dir=3 then
   begin
    posX:=posX+5;
    fillellipse(posX,posY,2,2);
    setcolor(black);
    setfillstyle(0,black);
    fillellipse(posX-5,posY,2,2);
    setcolor(brown);
    setfillstyle(1,brown);
    end;{if dir=1}
    if dir=4 then
   begin
    posY:=posY+5;
    fillellipse(posX,posY,2,2);
    setcolor(black);
    setfillstyle(0,black);
    fillellipse(posX,posY-5,2,2);
    setcolor(brown);
    setfillstyle(1,brown);
    end;{if dir=1}
end;{procedure}
procedure drawcollision;
begin
           fillellipse(posX,posY,2,2);
          delay(5000);
          setcolor(black);
          setfillstyle(1,black);
          fillellipse(posX,posY,2,2);
          delay(5000);
          setcolor(brown);
          setfillstyle(1,brown);
end;
{*******************************main*************************************}
begin
clrscr;
Gd:=VGA;
Gm:=VGAhi;
initgraph(Gd,Gm,'');
if graphresult=grok then
  begin
   bereg;
   setcolor(brown);
   setfillstyle(1,brown);
   posX:=500;
   posY:=250;
   fillellipse(posX,posY,2,2);
   repeat
    if keypressed then
     begin
      ch:=readkey;
      case ch of
       #72:dir:=1;
       #75:dir:=2;
       #77:dir:=3;
       #80:dir:=4;
      end; {case ch}
     end;
    moveship;
    delay(900);
    if (getpixel(posX+5,posY)=14) or (getpixel(posX-5,posY)=14) or
       (getpixel(posX,posY+5)=14) or (getpixel(posX,posY-5)=14) then
     begin
      i:=1;
      for i:=1 to 8 do
         begin
          drawcollision;
         end;{for}
         ch:=#27;
     end;{if..then}
   until ch=#27;
   closegraph;
   writeln('Game over. Press Enter to exit.');
   readln;
  end
else
  writeln(grapherrormsg(graphresult));
end.
В аттаче - exe-шник, смотрите. Только у меня exe-шник всего лишь один раз запускается, не знаю почему, а потом пишет код графической ошибки "No error" и выкидывает.
Буду теперь добавлять время, старт-финиш, пытаться сделать меню и прочее. Можно над парусом таки поработать. Делитесь своими соображениями, буду рад.
Вложения
Тип файла: zip Motor_boat.zip (15.0 Кб, 34 просмотров)
Lazzy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
InjHdc – программа выводящая время в окне игры. mikityak Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 09.04.2013 00:26
Управление кнопками со стрелками eks-s Общие вопросы Delphi 6 19.01.2008 02:23
Для любителей сфоткать лучшие моменты во время игры Shurik Hacker Софт 1 08.11.2007 20:51
Подскажите, как сделать так, чтобы тест можно было повторно пройти не перезагружая пр Kamikadze_666 Помощь студентам 2 23.05.2007 02:48