Помогите отыскать ошибку в игре (((

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: Помогите отыскать ошибку в игре (((

Сообщение Vadim » 11.11.2011 18:28:22

blackangel
Посмотрите вот эту программку:
http://forum.pascal.net.ru/index.php?showtopic=23739
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите отыскать ошибку в игре (((

Сообщение informat » 13.11.2011 07:04:51

blackangel писал(а):Написал не большую игру "змейку" при запуске "змейка" не совершает движения.. а при выходе из программы выдается ошибка exitcode=201 , Прошу помочь отыскать ошибку ((
Код: Выделить всё
uses crt,Graph;
...
end.


Для считыванием клавиш в графическом окне нужно использовать WinCRT.
CRT - для текстового. На моих курсах только вчера такую ошибку исправлял у ученика.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Помогите отыскать ошибку в игре (((

Сообщение SuSe user » 02.09.2012 10:48:11

У меня не то что бы проблема, просто небольшой "творческий кризис" логики. Создаю небольшую игрульку, в которой будут драться 2 персонажа. Суть такова, что игрок прокачивает таланты и всё такое. Но у меня возникла такая проблема:
нужно что бы из 2 игроков определился победитель, который понизил количество жизней другого до 0 (нуля). Я сделал так, что из предопределённых значений Сила и Ловкость суммируется Мощность удара, которая и отнимает N-ое количество жизней. Как можно проверить у кого из соперников количество жизней опустилось до 0? Я пробовал через While, но у меня удаётся проверить значение жизней только у 1 из соперников.
Код: Выделить всё
begin
  sila := 12;
  power := 15;
  hp := 120;

  for i := 1 to 5 do
  begin
    int := 1 + random (sila);
  end;

  begin
    int2 := 1 + random (power);
  end;
  sum := int + int2;
  label2.Caption := IntTOStr (int);
  label4.Caption := IntTOStr (int2);
  label6.Caption := IntToStr (sum);

// Характеристики противника
  sila2 := 14;
  power2 := 13;
  hp2 := 110;

  for i := 1 to 5 do
  begin
    int3 := 1 + random (sila2);
  end;

  begin
    int4 := 1 + random (power2);
  end;
  sum2 := int3 + int4;
  label10.Caption := IntTOStr (int3);
  label11.Caption := IntTOStr (int4);
  label12.Caption := IntToStr (sum2);
  Label14.Caption := inttostr (hp);
  label16.Caption := inttostr (hp2);
//расчитываем победителя
SuSe user
новенький
 
Сообщения: 13
Зарегистрирован: 02.10.2011 21:03:08

Re: Помогите отыскать ошибку в игре (((

Сообщение Сквозняк » 03.09.2012 04:44:44

В начале программы нужно инициализировать генератор случайных чисел:
Код: Выделить всё
begin
Randomize;

Тогда не нужно будет колдовать со случайным числом, вместо пяти присвений значения переменной int
Код: Выделить всё
for i := 1 to 5 do
  begin
    int := 1 + random (sila);
  end;

хватит и одного
Код: Выделить всё
int := 1 + random (sila);


Надо делать в цикле перерасчёт мощности перед каждым ударом, далее обмен ударами и подсчёт оставшейся энергии. Как только энергия у кого-то закончилась - выход из боя/цикла. Как-то так:
Код: Выделить всё
begin
  Randomize;
  sila := 12;
  power := 15;
  hp := 120;

// Характеристики противника
  sila2 := 14;
  power2 := 13;
  hp2 := 110;

a:=1;
while a=1 do begin
             int := 1 + random (sila);
             int2 := 1 + random (power);
             sum := int + int2;
             label2.Caption := IntTOStr (int);
             label4.Caption := IntTOStr (int2);
             label6.Caption := IntToStr (sum);

             int3 := 1 + random (sila2);
             int4 := 1 + random (power2);
             sum2 := int3 + int4;
             label10.Caption := IntTOStr (int3);
             label11.Caption := IntTOStr (int4);
             label12.Caption := IntToStr (sum2);
             Label14.Caption := inttostr (hp);
             label16.Caption := inttostr (hp2);
//расчитываем победителя
             sleep(2000);
             oceredj:=random(2);
//первый удар
             if oceredj=0 then hp2:=hp2-sum else hp:=hp-sum2;
             if hp2<1 then goto 1;
             if hp<1 then goto 2;
//второй удар
             if oceredj=0 then oceredj:=1 else oceredj:=0;
             if oceredj=0 then hp2:=hp2-sum else hp:=hp-sum2;
             if hp2<1 then goto 1;
             if hp<1 then goto 2;             
             end;

1:
writeln('Победил первый игрок.');
goto 3;
2:
writeln('Победил второй игрок.');
3:

Отладку, вывод сообщения о победе и замену goto на другие операторы сделай сам :mrgreen:
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Помогите отыскать ошибку в игре (((

Сообщение SuSe user » 19.09.2012 13:46:44

Сквозняк писал(а):В начале программы нужно инициализировать генератор случайных чисел:

Я пошёл другим путём. Я добавил StringGrid с 2мя ячейками (жизни героя и противника). Суммировал удар и вычитал полученное число из нужной ячейки. В конце поставил if для проверки. Соответственно, у кого <1 случилось раньше, тот и проиграл.
SuSe user
новенький
 
Сообщения: 13
Зарегистрирован: 02.10.2011 21:03:08

Re: Помогите отыскать ошибку в игре (((

Сообщение SuSe user » 03.01.2013 17:30:16

Есть SG размером 20х20, при помощи рандома в любом месте появляется знак "*", затем, по нажатию на другую унопку внутри SG появляется знак "#" и этот знак пытается сам дойти до звёздочки. Реализовал следующим образом:
Код: Выделить всё
begin
Edit3.Caption := IntToStr(x2);
Edit4.Caption := IntToStr(y2);
stringgrid1.cells[x2,y2] := '#';
  if x2 < int then
    x2 := x2+1 else x2 := x2-1;
  if y2 < int2 then
    y2 := y2+1 else y2 := y2-1;
end;

Проблема:
Пытался разными способами сделать так, что бы каждую секунду решётка сама делала шаг в нужную сторону. Пробовал при помощи While, Repeat until и другими способами. Всё заканчивалось тем, что решётка появлялась вначале и сразу же в конце. Есть идеи решения?
SuSe user
новенький
 
Сообщения: 13
Зарегистрирован: 02.10.2011 21:03:08

Пред.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru