Prosta gra RPG - problem z ustawieniem pętli while .. do

2013-08-30 22:46
0

Witam,
Naukę programowania zacząłem od niedawna. Uznałem więc że czas wziąć się za pętle i właśnie teraz narodził się problem którego nie mogę rozwiązać.

Proszę sobie wyobrazić grę RPG w której trzeba pokonać jakiegoś przeciwnika. Za pewnie nie pokonamy go za pierwszym uderzeniem. I tu zaczyna się mój problem, jeżeli wpiszemy "Walcz" i zadane obrażenie będzie wynosiło
np. 34 a wytrzymałość przeciwnika równa jest 100. Pętla będzie się musiała zacząć od początku. Jeżeli za drugim razem obrażenia będą miały wartość 23, to dalej ze 100 nie zejdziemy do zera. Więc tu rodzi się moje pytanie. Jak dodawać wyniki losowania tur pętli?

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  var
    Walcz             : String;

    Moj_Koniec                 : Integer = (0);
    Przeciwnik_Koniec          : Integer = (0);

    Hp                         : Integer = (100);
    Hp_Przeciwnik              : Integer = (100);

    Moje_Punkty       : Integer;
    Przeciwnik_Punkty : Integer;

  begin
    { TODO -oUser -cConsole Main : Insert code here }

    Moje_Punkty       := Random(20)+20;
    Przeciwnik_Punkty := Random(20)+20;

    Hp            := Hp - Przeciwnik_Punkty;
    Hp_Przeciwnik := Hp_Przeciwnik - Moje_Punkty;

  While (Moje_Punkty >= Moj_Koniec) or (Przeciwnik_Punkty >= Przeciwnik_Koniec) do
  begin
    Writeln('Wpisz "Walcz"');
    Readln(Walcz);

   if (Walcz) = 'Walcz' then

  if Hp <= Moj_Koniec  then
   Writeln('Przegrales');

  if Hp_Przeciwnik <= Przeciwnik_Koniec then
    Writeln('Wygrales');
  end;

  Readln;
end.

P.S.
Proszę o wyrozumiałość jest to mój pierwszy post na tym forum.

dodanie znacznika <code class="delphi"> - fp

edytowany 1x, ostatnio: furious programming, 2013-08-30 22:54

Pozostało 580 znaków

2013-08-30 22:55
1

Heh, dopiero zaczynasz z programowaniem i od razu chcesz napisać grę? Raczej nie jest to dobry pomysł...

Pętla musi działać dopóki ktoś nie padnie - jeśli się to stanie to czas wyjść z petli: instrukcja Break pozwala wyjść z niej (i każdej innej pętli);

PS: przeczytaj jakiś kurs i naucz się dobrze podstaw języka, a na pewno w przyszłości nie będziesz się o nie musiał dopytywać.


EDIT: Powoli - coś źle zrozumiałem... Kod nie działa jak należy, bo po spełnieniu warunku:

if (Walcz) = 'Walcz' then

nie masz ani instrukcji, ani średnika, stąd jeśli warunek zostanie spełniony, to weźmie pod uwagę następny warunek, czyli:

if Hp <= Moj_Koniec  then

który to z kolei jeśli zostanie spełniony, to wyświetli napis; Nie zostanie on nigdy spełniony (ani nawet sprawdzony), jeśli Walcz <> 'Walcz'; Tutaj na pewno jest błąd, więc uzupełnij instrukcje, jeśli trzeba faktycznie walczyć.


edytowany 2x, ostatnio: furious programming, 2013-08-30 23:00

Pozostało 580 znaków

2013-08-30 22:58

Formatowanie kodu!

{$APPTYPE CONSOLE}
Program Project1;
Uses SysUtils;
Var Walcz: string;

    Moj_Koniec: integer = 0;
    Przeciwnik_Koniec: integer = 0;

    Hp: integer = 100;
    Hp_Przeciwnik: integer = 100;

    Moje_Punkty: integer;
    Przeciwnik_Punkty: integer;
Begin
  // Randomize;

  Moje_Punkty := Random(20) + 20;
  Przeciwnik_Punkty := Random(20) + 20;

  Hp := Hp - Przeciwnik_Punkty;
  Hp_Przeciwnik := Hp_Przeciwnik - Moje_Punkty;

  While ((Moje_Punkty >= Moj_Koniec) or (Przeciwnik_Punkty >= Przeciwnik_Koniec)) Do
  Begin
    Writeln('Wpisz "Walcz"');
    Readln(Walcz);

    if (Walcz = 'Walcz') Then
    Begin
      if (Hp <= Moj_Koniec) Then
        Writeln('Przegrales');
    End;

    if (Hp_Przeciwnik <= Przeciwnik_Koniec) Then
      Writeln('Wygrales');
  End;

  Readln;
End.

No, to skoro formatowanie już mamy z głowy, to przejdźmy do sedna:

Jak dodawać wyniki losowania tur pętli?

Dlaczego nie będziesz po prostu odejmował HP przeciwnika oraz siebie? Będzie prościej.

{$APPTYPE CONSOLE}
Var Command          : String;
    PlayerHP, EnemyHP: int16;
Begin
 Randomize;

 PlayerHP := 20 + Random(20);
 EnemyHP  := 20 + Random(20);

 While (PlayerHP > 0) and (EnemyHP > 0) Do
 Begin
  Writeln('Wpisz "Atak", by zaatakowac przeciwnika.');
  Readln(Command);

  if (Command = 'Atak') Then
  Begin
   Dec(EnemyHP, Random(5));
   if (EnemyHP <= 0) Then
    Break;

   Dec(PlayerHP, Random(5));
  End;
 End;

 if (EnemyHP <= 0) Then
  Writeln('Wygrales!') Else
  Writeln('Przegrales!');

 Readln;
End.

Prawda, że lepiej?
Tzn.ten kod i tak jest beznadziejny, lecz w związku z tym, że to dział newbie... cóż, dodam jedynie: programowania nie powinno się zaczynać od pisania gier.


Pozostało 580 znaków

2013-08-30 22:59
0

Dzięki za odpowiedź :)

Nie chcę się od razu brać za robienie gry, ale nie wymyśliłem innego przykładu przećwiczenia pętli ;)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0