logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Turbo Pascal] Turbo Pascal – jak zaimplementować losowe strzały komputera w grze w okręty?

bajtolini 29 Paź 2010 16:43 3665 3
REKLAMA
  • #1 8678158
    bajtolini
    Poziom 2  
    Posty: 4
    Ostatnio chciałem napisać program do gry w statki ale zaciąłem się w momencie gdy komputer strzela w statki gracza. Nie umiem napisać tego fragmentu programu aby komputer za każdym kolejnym strzałem nie trafiał w już zestrzeloną cześć statku lub w miejsce które już wcześniej strzelił.
    W niektórych fragmentach programu pojawiają się liczby:
    1-statek jednomasztowy
    2-dwumasztowy
    3-trójmasztowiec
    4-cztero
    0-puste pole
    5-osłona statku (miejsce w którym nie można wpisać innego statku)
    7-pudło
    8-zestrzelony statek

    
    program bartek2;
    uses crt;
    
    TYPE T2W=ARRAY[0..11,0..11]of Integer;
    
    VAR o,z,r:STRING;
        G,K:T2W;
        p:FILE OF T2W;
        x,y,q,i,j,w:INTEGER;
    
    {poczatek procedury}
    PROCEDURE Zeruj(var G,K:T2W);
    var i,j:integer;
    
    begin
    randomize;
    For j:=0 To 11 DO For i:=0 To 11 DO K[j,i]:=0;
    For j:=0 To 11 DO For i:=0 To 11 DO G[j,i]:=0;
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE PiszT2(var G,K:T2W);
    var i,j:integer;
    
    begin
    writeln('Tablica Komputera:');
    For j:=1 To 10 Do For i:=1 To 10 DO Begin
                                        CASE K[j,i] OF 0,5:write('.');
                                                       1,2,3,4:begin
                                                               textcolor(red);
                                                               write('*');
                                                               textcolor(white);
                                                               end;
                                                       7:write('O');
                                                       8:write('X');
                                                       End;
                                        IF i<10 THEN write('  ')
                                                ELSE writeln;
                                        End;
    writeln;
    writeln('Tablica Gracza:');
    For j:=1 To 10 Do For i:=1 To 10 DO Begin
                                        CASE G[j,i] OF 0,5:write('.');
                                                       1,2,3,4:begin
                                                               textcolor(red);
                                                               write('*');
                                                               textcolor(white);
                                                               end;
                                                       7:write('O');
                                                       8:write('X');
                                                       End;
                                        IF i<10 THEN write('  ')
                                                ELSE writeln;
                                        End;
    
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE PiszT(var G,K:T2W);
    var i,j:integer;
    
    begin
    writeln('Tablica Komputera:');
    For j:=1 To 10 Do For i:=1 To 10 DO Begin
                                        CASE K[j,i] OF 0,1,2,3,4,5:write('.');
                                                       7:begin
                                                         textcolor(blue);
                                                         write('O');
                                                         textcolor(white);
                                                         end;
                                                       8:begin
                                                         textcolor(red);
                                                         write('X');
                                                         textcolor(white);
                                                         end;
                                                       End;
                                        IF i<10 THEN write('  ')
                                                ELSE writeln;
                                        End;
    writeln;
    writeln('Tablica Gracza:');
    For j:=1 To 10 Do For i:=1 To 10 DO Begin
                                        CASE G[j,i] OF 0,5:write('.');
                                                       1,2,3,4:begin
                                                               textcolor(red);
                                                               write('*');
                                                               textcolor(white);
                                                               end;
                                                       7:write('O');
                                                       8:write('X');
                                                       End;
                                        IF i<10 THEN write('  ')
                                                ELSE writeln;
                                        End;
    
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE Los4(var T:T2W);
    var x,y,k,i,j:integer;
    
    begin
    k:=random(2);
    IF k=0 THEN Begin
                x:=random(7)+1;
                y:=random(10)+1;
                For i:=x-1 To x+4 Do For j:=y-1 To y+1 Do T[i,j]:=5;
                For i:=x To x+3 Do T[i,y]:=4;
                End;
    IF k=1 THEN Begin
                x:=random(10)+1;
                y:=random(7)+1;
                For i:=x-1 To x+1 Do For j:=y-1 To y+4 Do T[i,j]:=5;
                For j:=y To y+3 Do T[x,j]:=4;
                End;
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE Los3(var T:T2W);
    var x,y,k,i,j:integer;
    
    begin
    k:=random(2);
    IF k=0 THEN Begin
                REPEAT
                x:=random(8)+1;
                y:=random(10)+1;
                UNTIL (T[x,y]=0) AND (T[x+1,y]=0) AND (T[x+2,y]=0);
                For i:=x-1 To x+3 Do For j:=y-1 To y+1 Do T[i,j]:=5;
                For i:=x To x+2 Do T[i,y]:=3;
                End;
    IF k=1 THEN Begin
                REPEAT
                x:=random(10)+1;
                y:=random(8)+1;
                UNTIL (T[x,y]=0) AND (T[x,y+1]=0) AND (T[x,y+2]=0);
                For i:=x-1 To x+1 Do For j:=y-1 To y+3 Do T[i,j]:=5;
                For j:=y To y+2 Do T[x,j]:=3;
                End;
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE Los2(var T:T2W);
    var x,y,k,i,j:integer;
    
    begin
    k:=random(2);
    IF k=0 THEN Begin
                REPEAT
                x:=random(9)+1;
                y:=random(10)+1;
                UNTIL (T[x,y]=0) AND (T[x+1,y]=0);
                For i:=x-1 To x+2 Do For j:=y-1 To y+1 Do T[i,j]:=5;;
                For i:=x To x+1 Do T[i,y]:=2;
                End;
    IF k=1 THEN Begin
                REPEAT
                x:=random(10)+1;
                y:=random(9)+1;
                UNTIL (T[x,y]=0) AND (T[x,y+1]=0);
                For i:=x-1 To x+1 Do For j:=y-1 To y+2 Do T[i,j]:=5;
                For j:=y To y+1 Do T[x,j]:=2;
                End;
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE Los1(var T:T2W);
    var x,y,i,j:integer;
    
    begin
    REPEAT
    x:=random(10)+1;
    y:=random(10)+1;
    UNTIL (T[x,y]=0);
    For i:=x-1 To x+1 Do For j:=y-1 To y+1 Do T[i,j]:=5;
    T[x,y]:=1;
    end;
    {koniec procedury}
    
    {poczatek procedury}
    PROCEDURE Statki(var G,K:T2W);
    
    begin
    Los4(G);
    Los4(K);
    Los3(G);
    Los3(G);
    Los3(K);
    Los3(K);
    Los2(G);
    Los2(G);
    Los2(G);
    Los2(K);
    Los2(K);
    Los2(K);
    Los1(G);
    Los1(G);
    Los1(G);
    Los1(G);
    Los1(K);
    Los1(K);
    Los1(K);
    Los1(K);
    end;
    {koniec procedury}
    
    begin
    REPEAT
    assign(p,'C:\save');
    REPEAT
    writeln('Gra testowa czy normalna? T\N');
    readln(r);
    r:=UPCASE(r);
    UNTIL (r='T') OR (r='N');
    REPEAT
    writeln('Czy chcesz wczytac poprzednia gre? T\N');
    readln(z);
    z:=UPCASE(z);
    IF z='T' THEN Begin
                  RESET(p);
                  seek(p,0);
                  read(p,G);
                  read(p,K);
                  end;
    IF z='N' THEN REWRITE(p);
    UNTIL (z='T') OR (z='N');
    textcolor(white);
    randomize;
    CLRSCR;
    
    IF z='N' THEN Begin
                  Zeruj(G,K);
                  Statki(G,K);
                  end;
    IF r='T' THEN PiszT2(G,K)
             ELSE PiszT(G,K);
    
    REPEAT
    writeln('Gdzie chcesz strzelic? Najpierw podaj x pozniej y');
    readln(y);
    readln(x);
    CASE K[x,y] OF 1,2,3,4:K[x,y]:=8;
                   0,5:K[x,y]:=7;
                   END;
    REPEAT
    x:=random(9)+1;
    y:=random(9)+1;
    UNTIL (G[x,y]<>7) OR (G[x,y]<>8);
    CASE G[x,y] OF 1,2,3,4:G[x,y]:=8;
                   0,5:G[x,y]:=7;
                   END;
    CLRSCR;
    IF r='T' THEN PiszT2(G,K)
             ELSE PiszT(G,K);
    For i:=1 To 10 Do For j:=1 To 10 Do IF G[i,j]=8 THEN q:=q+1;
    For i:=1 To 10 Do For j:=1 To 10 Do IF K[i,j]=8 THEN w:=w+1;
    IF q<>20 THEN q:=0;
    IF w<>20 THEN w:=0;
    seek(p,0);
    write(p,G);
    write(p,K);
    UNTIL (q=20) OR (w=20);
    IF q=20 THEN writeln('WYGRAL KOMPUTER');
    IF w=20 THEN writeln('WYGRAL GRACZ');
    
    REPEAT
    writeln('Czy chcesz jeszcze raz? T/N');
    readln(o);
    o:=UPCASE(o);
    UNTIL (o='N') OR (o='T');
    UNTIL o='N';
    CLOSE(p);
    end.


    W załączniku znajduje się program (spakowany).
    Załączniki:
    • Statki.rar (1.29 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 8683781
    krzychS
    Poziom 29  
    Posty: 607
    Pomógł: 213
    Ocena: 42
    Wystarczy napisać warunek porównujący wylosowane współrzędne z bazą już wcześniej wylosowanych.
    Jeśli wynik się powtórzy następuje ponowna próba losowania.
  • REKLAMA
  • #3 8685017
    bajtolini
    Poziom 2  
    Posty: 4
    Właśnie problem jest w tym, że napisałem coś takiego ale za każdym razem jak przeprowadzam grę testową to gra nie kończy się po max 100 ruchach a powinna.
    
    REPEAT
    x:=random(10)+1;
    y:=random(10)+1;
    UNTIL (G[x,y]<>7) OR (G[x,y]<>8);
    CASE G[x,y] OF 1,2,3,4:G[x,y]:=8;
                   0,5:G[x,y]:=7;
                   END;
  • #4 8696104
    krzychS
    Poziom 29  
    Posty: 607
    Pomógł: 213
    Ocena: 42
    Jak już wcześniej napisałem, musisz stworzyć jeszcze jedną tablicę, w której będą wpisywane wylosowane miejsca strzałów.
    Przy nowym losowym strzale porównujesz go z tą tablicą.
REKLAMA