Pomoc przy Wisielcu

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Błąd związany z untilem, nie mam pojęcia co jest złego.

Kopiuj
uses crt, dos;

var
slownik: array[1..255] of string;
slowo:array[1..10] of string;
tablica:array[1..10] of string;
i,x,proba:integer;
nazwa,rysuj1,rysuj2,rysuj3,litera:string;
znak:char;


LABEL miejsce1;

procedure szubienica(rysuj1,rysuj2,rysuj3:string);

  begin
    writeln('   _________');
    writeln('  |         |');
    write('  |');
    writeln(rysuj1);
    write('  |');
    writeln(rysuj2);
    write('  |');
    writeln(rysuj3);
    writeln(' / \');
    writeln('/   \');
    writeln;
  end;

function szukanie(a:string):string;
 var
 i:integer;
 Begin
  for i := 1 to 256 do
  Begin
   if slownik[i] = '' then
    Begin
     if i<256 then
      Begin
       szukanie:='ok';
       break;
      end;
    end

  else if slownik[i] <> '' then
    Begin
      if slownik[i] = a then
       Begin
        szukanie:='blad';
        break;
       End;
    End

 else if slownik[i] = '' then
    Begin
     if i>256 then
      Begin
       szukanie:='brak wolnych miejsc';
       break;
      end;
    end;
  end;
 end;

  Begin
  proba:=1;
  clrscr;
  i:=1;
  Writeln('Podaj haslo do odgadniecia');
  Writeln('Aby zakonczyc wpisywanie nacisnij q');
 Repeat
   znak:=readkey;
  if znak = 'q' then
   Begin
    goto miejsce1;
   End;
  Writeln('Podano ', i, ' litere slowa');
  writeln(znak);
  slowo[i]:=znak;
  inc(i);
 until i = 10;
  miejsce1:
  for x:= 1 to i do
   Begin
    nazwa:= nazwa+slowo[x];
   end;
  Writeln;
  clrscr;
  szukanie(nazwa);
  if szukanie(nazwa) = 'ok' then
   Begin
    slownik[1]:=nazwa;
    for i:= 1 to length(nazwa) do
     Begin
      tablica[i]:= '_';
      Write(tablica[i], ' ');
     End;
   End;
 Repeat
  Writeln;
  Writeln('Podaj litere');
  szubienica(rysuj1,rysuj2,rysuj3);
  readln(litera);
  for i:=1 to length(nazwa) do
   Begin
    if slowo[i] = litera then
     Begin
      tablica[i]:=litera;
     End
    else
      inc(proba);
      case proba of
            1:
              begin
                rysuj1:='         O';
              end;
            2:
              begin
                rysuj1:='         O';
                rysuj2:='        /';
              end;
            3:
              begin
                rysuj1:='         O';
                rysuj2:='        /|';
              end;
            4:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
              end;
            5:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
                rysuj3:='        /';
              end;
            6:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
                rysuj3:='        / \';
                szubienica(rysuj1,rysuj2,rysuj3);
                Writeln('No i ludek sie powiesil. Mozesz zaczac gre odnowa.');
                writeln('Dziekujemy za skorzystanie z naszej gry.');
              End;
     End;
  for i:= 1 to length(nazwa) do
     Begin
      Write(tablica[i], ' ');
     End;
   until proba = 7;

 Repeat until keypressed;
  End.
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Przede wszystkim zdaje się, że deklaracja labeli musi być pierwsza - przed zmiennymi i stałymi. Poza tym mógłbyś chociaż pokazać komunikat błędu.

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Blad jest przy else i przy until proba=7;

LABEL już zmieniłem.

  • Rejestracja: dni
  • Ostatnio: dni
0

Blad jest przy else i przy until proba=7;

Ale powiedzieć jaki to błąd to już za trudne, co? No ale tyle co powiedziałeś, to już mogę wywnioskować że 'coś trzeba zmienić'.

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Oczywiście podpowiem :D, jest to błąd syntaxowy.

  • Rejestracja: dni
  • Ostatnio: dni
0

Oczywiście podpowiem

To ja też podpowiem: Chodzi o pełen błąd a nie o jego rodzaj :D

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Dopóki nie sformatujesz kodu - tego błędu nie znajdziesz masz więcej BEGIN niż END, a powinno się zgadzać.
Wydaje mi się że brakuje nad ostatnim for'em, ale bez przeformatowania całości nie da się stwierdzić z pewnością.

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

To na jaką odpowiedź Pan czeka?

Więc problem z endem rozwiązany. Teraz jest błąd z casem, od razu wykonuje 3 opcje.

  • Rejestracja: dni
  • Ostatnio: dni
0

To na jaką odpowiedź Pan czeka?

Zapostuj wszystkie komunikaty kompilatora najlepiej, a jak się nie da to tylko errory. Podaj jaki to kompilator.

Chciałem ci podać sformatowany kod, ale o dziwo JEDI code formater odmawiał posłuszeństwa (typowe przy skopanym kodzie). Szybkie sprawdzanie niedomkniętych bloków wskazało ten przy forze, popraw.

  • Rejestracja: dni
  • Ostatnio: dni
0

Więc problem z endem rozwiązany. Teraz jest błąd z casem, od razu wykonuje 3 opcje.

Mógłbyś podać aktualny kod, to bym ci zformatował.
I case nie może wykonać 3 opcji naraz, użyj debuggera żeby znaleźć błąd (google it!).

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0
Kopiuj
uses crt, dos;
LABEL miejsce1;
var
slownik: array[1..255] of string;
slowo:array[1..10] of string;
tablica:array[1..10] of string;
i,x,proba:integer;
nazwa,rysuj1,rysuj2,rysuj3,litera:string;
znak:char;




procedure szubienica(rysuj1,rysuj2,rysuj3:string);

  begin
    writeln('   _________');
    writeln('  |         |');
    write('  |');
    writeln(rysuj1);
    write('  |');
    writeln(rysuj2);
    write('  |');
    writeln(rysuj3);
    writeln(' / \');
    writeln('/   \');
    writeln;
  end;

function szukanie(a:string):string;
 var
 i:integer;
 Begin
  for i := 1 to 256 do
  Begin
   if slownik[i] = '' then
    Begin
     if i<256 then
      Begin
       szukanie:='ok';
       break;
      end;
    end

  else if slownik[i] <> '' then
    Begin
      if slownik[i] = a then
       Begin
        szukanie:='blad';
        break;
       End;
    End

 else if slownik[i] = '' then
    Begin
     if i>256 then
      Begin
       szukanie:='brak wolnych miejsc';
       break;
      end;
    end;
  end;
 end;

  Begin
  proba:=1;
  clrscr;
  i:=1;
  Writeln('Podaj haslo do odgadniecia');
  Writeln('Aby zakonczyc wpisywanie nacisnij q');
 Repeat
   znak:=readkey;
  if znak = 'q' then
   Begin
    goto miejsce1;
   End;
  Writeln('Podano ', i, ' litere slowa');
  writeln(znak);
  slowo[i]:=znak;
  inc(i);
 until i = 10;
  miejsce1:
  for x:= 1 to i do
   Begin
    nazwa:= nazwa+slowo[x];
   end;
  Writeln;
  clrscr;
  szukanie(nazwa);
  if szukanie(nazwa) = 'ok' then
   Begin
    slownik[1]:=nazwa;
    for i:= 1 to length(nazwa) do
     Begin
      tablica[i]:= '_';
      Write(tablica[i], ' ');
     End;
   End;
 Repeat
  Writeln;
  Writeln('Podaj litere');
  szubienica(rysuj1,rysuj2,rysuj3);
  readln(litera);
  for i:=1 to length(nazwa) do
   Begin
    if slowo[i] = litera then
     Begin
      tablica[i]:=litera;
     End
    else
     Begin

      case proba of
            1:
              begin
                rysuj1:='         O';
              end;
            2:
              begin
                rysuj1:='         O';
                rysuj2:='        /';
              end;
            3:
              begin
                rysuj1:='         O';
                rysuj2:='        /|';
              end;
            4:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
              end;
            5:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
                rysuj3:='        /';
              end;
            6:
              begin
                rysuj1:='         O';
                rysuj2:='        /|\';
                rysuj3:='        / \';
                szubienica(rysuj1,rysuj2,rysuj3);
                Writeln('No i ludek sie powiesil. Mozesz zaczac gre odnowa.');
                writeln('Dziekujemy za skorzystanie z naszej gry.');
              End;
     End;

     End;
     End;
  for i:= 1 to length(nazwa) do
     Begin
      Write(tablica[i], ' ');
     End;
   until proba = 7;

 Repeat until keypressed;
  End.
SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

@dom3lek, przedstawiłeś poprawiony kod i co dalej? Chciałeś się pochwalić, jaki jest genialny (ten kod), czy może dalej się nie kompiluje, albo kompiluje się, ale nie działa poprawnie. Czy tak trudno było napisać kilka słów wyjaśnienia?

D3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0

Napisałem wyżej ale najwidoczniej potrafisz tylko czytać ostatnie posty. Kod kompiluję się z tym że jest problem z wyborem case, przechodzi do ostatniego albo do 3, nie wybiera po kolei.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

A zobacz ile razy trafi w ten case jeżeli słowo ma 5 liter a podana litera nie pasuje?
A ile razy trafi w ten case jeżeli słowo ma 2 litery a podana litera nie pasuje?

babubabu
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 648
2

po pobieżnym przejrzeniu kodu i zobaczeniu goto odechciało mi się analizować kod.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

Sformatowałem kod...:

Kopiuj
program Szbnc;
uses
  Crt,
  Dos;
var
  Slownik: array [1 .. 255] of String;
  Slowo: array [1 .. 10] of String;
  Tablica: array[1 .. 10] of String;
  I, X, Proba: Integer;
  Nazwa, Rysuj1, Rysuj2, Rysuj3, Litera: String;
  Znak: Char;
label
  Miejsce1;

procedure Szubienica(Rysuj1, Rysuj2, Rysuj3: String);
begin
  WriteLn('   _________');
  WriteLn('  |         |');
  Write('  |');
  WriteLn(Rysuj1);
  Write('  |');
  WriteLn(Rysuj2);
  Write('  |');
  WriteLn(Rysuj3);
  WriteLn(' / \');
  WriteLn('/   \');
  WriteLn;
end;

function Sukanie(A: String): String;
var
  I: Integer;
begin
  for I := 1 to 256 do
    begin
      if Slownik[I] = '' then
        begin
          if i < 256 then
            begin
              szukanie:='ok';
              Break;
            end;
        end
      else
        if Slownik[I] <> '' then
          begin
            if Slownik[I] = A then
              begin
                Szukanie := 'blad';
                Break;
              end;
          end
        else
          if Slownik[I] = '' then
            if I > 256 then
              begin
                Szukanie := 'brak wolnych miejsc';
                Break;
              end;
    end;
end;
 
begin
  Proba := 1;
  ClrScr;
  I := 1;

  WriteLn('Podaj haslo do odgadniecia');
  WriteLn('Aby zakonczyc wpisywanie nacisnij q');

  repeat
    Znak := ReadKey;

    if Znak = 'q' then
      goto Miejsce1;

    WriteLn('Podano ', I, ' litere slowa');
    Writeln(Znak);

    Slowo[I] := Znak;
    Inc(I);
  until I = 10;

  Miejsce1:
    for X := 1 to I do
      Nazwa := Nazwa + Slowo[X];

    WriteLn;
    ClrScr;
    Szukanie(Nazwa);

    if Szukanie(Nazwa) = 'ok' then
      begin
        Slownik[1] := Nazwa;

        for I := 1 to Length(Nazwa) do
          begin
            Tablica[I] := '_';
            Write(Tablica[I], ' ');
          end;
      end;

    Repeat
      WriteLn;
      WriteLn('Podaj litere');

      Szubienica(Rysuj1, Rysuj2, Rysuj3);
      ReadLn(Litera);

      for I := 1 to Length(Nazwa) do
        begin
          if Slowo[I] = Litera then
            Tablica[I] := Litera
          else
            Inc(Proba);

            case proba of
              1: Rysuj1 := '         O';

              2: begin
                   Rysuj1 := '         O';
                   Rysuj2 := '        /';
                 end;

              3: begin
                   Rysuj1 := '         O';
                   Rysuj2 := '        /|';
                 end;

              4: begin
                   Rysuj1 := '         O';
                   Rysuj2 := '        /|\';
                 end;

              5: begin
                   Rysuj1 := '         O';
                   Rysuj2 := '        /|\';
                   Rysuj3 := '        /';
                 end;

              6: begin
                   Rysuj1 := '         O';
                   Rysuj2 := '        /|\';
                   Rysuj3 := '        / \';

                   Szubienica(Rysuj1, Rysuj2, Rysuj3);
                   WriteLn('No i ludek sie powiesil. Mozesz zaczac gre odnowa.');
                   writeLn('Dziekujemy za skorzystanie z naszej gry.');
                 end;
        end;

      for I := 1 to Length(Nazwa) do
        Write(Tablica[I], ' ');
    until Proba = 7;

  repeat
  until KeyPressed;
end.

Teraz będzie łatwiej go zanalizować; Polecam Ci całego [case Proba of .. end;] przenieść do osobnej procedury; Będzie o wiele czytelniej; Także zrezygnuj z goto Miejsce1 na rzecz procedur;

Narobiłeś zamieszania w tym kodzie, popraw go, podziel na dodatkowe procedury i pozbądź się zmiennych globalnych; Jak to zrobisz to na pewno znajdziesz przyczynę błedów;

I do cholery jasnej naucz się wciskać Shift!!!; Do przechowywania hasła oraz podanych znaków wykorzystaj macierze dynamiczne - sprawdzanie odbędzie się szybciej i łatwiej;

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.