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
W załączniku znajduje się program (spakowany).
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).