![]() |
|
|
#1
|
|||
|
|||
|
Доброго времени суток.
Необходима помощь в дописании процедуры в программе "Морской бой" , которая будет вокруг убитого корабля расставлять поля "мимо" чтобы было понятно что там не может быть кораблей. |
|
#2
|
||||
|
||||
|
Так покажи как у тебя хранятся данные о кораблях
|
|
#3
|
|||
|
|||
|
Вот сама программа .
|
|
#4
|
|||
|
|||
|
с таким подходом – в раздел "Работа"
|
|
#5
|
||||
|
||||
|
Pyro, оно и так в работе.
![]() |
|
#6
|
|||
|
|||
|
Цитата:
![]() |
|
#7
|
|||
|
|||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Занялся этим кодом так как олн мне напомнил старые добрые паскалевские времена, когда вот так кодили.
Код:
b1,b2:Array[1..14,1..14] of integer; Код ужастен, логика еще хуже. Все написано так, что создается впечатление - код написан на один раз, и повторное его исправление не предусмотрено. Когда разбирался с логикой исходников только и повторял "бл% ну кто так делает????!!!11111" Несколько раз пришлось переделывать, сначала нашел место где вроде бы должен выпоняться код при затопленном корабле, но не тут то было, ибо затопление было спрятано в ужаснейшей логической проверке. В итоге пришлось "засунуть" в "процедуру" прорисовки еще и обозначение ячеек вокруг корабля,так как нету четкого логического разделения побитый-затопленый. между Код:
//рисуется графическое поле компютера Код:
win:=true; замените код на: Код:
for i:=1 to 10 do //рисуется графическое поле компютера
for j:=1 to 10 do
begin
case b2[i,j] of
4: begin //клетка в котрой стоит подбитый или не доконца подбитый корабль
if ((b2[i+1,j]=2) //не доконца подбитый корабль
or(b2[i,j+1]=2)
or(b2[i-1,j]=2)
or(b2[i,j-1]=2))
or (((b2[i+1,j]=4)and(b2[i+2,j]=2))
or((b2[i,j+1]=4)and(b2[i,j+2]=2))
or((b2[i-1,j]=4)and(b2[i-2,j]=2))
or((b2[i,j-1]=4)and(b2[i,j-2]=2)))
or(((b2[i+1,j]=4)and(b2[i+2,j]=4) and (b2[i+3,j]=2))
or((b2[i,j+1]=4)and(b2[i,j+2]=4)and(b2[i,j+3]=2))
or((b2[i-1,j]=4)and(b2[i-2,j]=4)and(b2[i-3,j]=2))
or((b2[i,j-1]=4)and(b2[i,j-2]=4)and(b2[i,j-3]=2)))
then
begin
image2.Canvas.Brush.Color:=clgray;
image2.Canvas.Rectangle(20*i-20,20*j-20,20*i,20*j);
image2.Canvas.pen.Color:=clred;
image2.Canvas.MoveTo(20*i-19,20*j-19);
image2.Canvas.LineTo(20*i-1,20*j-1);
image2.Canvas.MoveTo(20*i-1,20*j-19);
image2.Canvas.LineTo(20*i-19,20*j-1);
image2.Canvas.pen.Color:=clblack;
//закраска кубиками =3 вокруг корабля
b2[i+1,j-1]:=3;
b2[i+1,j+1]:=3;
b2[i-1,j+1]:=3;
b2[i-1,j-1]:=3;
//кон закраски
end
else //подбитый корабль
begin
image1.Canvas.pen.color:=clBlack;
image1.Canvas.pen.Width:=2;
image2.Canvas.Brush.Color:=clred;
image2.Canvas.Rectangle(20*i-19,20*j-19,20*i-1,20*j-1);
image1.Canvas.pen.Width:=1;
if (b2[i,j+1]<>4) then b2[i,j+1]:=3;
if (b2[i,j-1]<>4) then b2[i,j-1]:=3;
if (b2[i+1,j]<>4) then b2[i+1,j]:=3;
if (b2[i-1,j]<>4) then b2[i-1,j]:=3;
b2[i+1,j-1]:=3;
b2[i+1,j+1]:=3;
b2[i-1,j+1]:=3;
b2[i-1,j-1]:=3;
end;
end;
end;
end; //j=1-10
for i:=1 to 10 do //рисуется графическое поле компютера
for j:=1 to 10 do
begin
if b2[i,j]=3 then
begin //простреленная пустая клетка
image2.Canvas.Brush.Color:=clwhite;
image2.Canvas.Rectangle(20*i-15,20*j-15,20*i-5,20*j-5)
end;
end;Аналогично для поля игрока, таблица б1. Последний раз редактировалось @Rafa3L, 09.06.2012 в 20:22. |
|
#9
|
||||
|
||||
|
Допилил код для компа.
Код еще ужаснее, зато комп начал играть намного лучше. заложил некую логику ИИ, реализщовано правда через сами понимаете всем известное место - ж@пу) Теперь для победы нужно не просто тыкать ячейки подряд, а включать мозг, и надеяться на везение. А также правильно расставить корабли. Соотношение сил 50/50. Переменные: kx,cx1,cy1:integer; cokil2:boolean; Код:
bum:=false;
cokil:=true;
cokil2:=false;
kx:=0;
while ((bum=false) or (cokil=true))and(kx<10000) do //стрел-ть до тех пор пока не попал в клетку в которую не
//стрелял и если она пустая
begin
m:=random(10)+1;
n:=random(10)+1;
kx:=kx+1;
if random(7)=5 then
begin
for i:=1 to 9 do
for j:=1 to 10 do
if (b1[i,j]=4)and(b1[i+1,j]=2) then
begin
m:=i+1;
n:=j;
end;
end;
if random(7)=6 then
begin
for i:=1 to 10 do
for j:=1 to 9 do
if (b1[i,j]=4)and(b1[i,j+1]=2) then
begin
m:=i;
n:=j+1;
end;
end;
if cokil2=true then
begin
case random(4) of
0: begin
m:=cx1+1;
n:=cy1;
if b1[m,n]<>2 then m:=cx1-1;
if m<1 then m:=2;
if m>10 then m:=9;
end;
1: begin
m:=cx1-1;
n:=cy1;
if b1[m,n]<>2 then m:=cx1+1;
if m<1 then m:=2;
if m>10 then m:=9;
end;
2: begin
m:=cx1;
n:=cy1+1;
if b1[m,n]<>2 then n:=cy1-1;
if n<1 then n:=2;
if n>10 then n:=9;
end;
3: begin
m:=cx1;
n:=cy1-1;
if b1[m,n]<>2 then n:=cy1+1;
if n<1 then n:=2;
if n>10 then n:=9;
end;
end;
end;
case b1[m,n] of
3,4: begin
bum:=false;
cokil:=false;
cokil2:=false;
end;
0: begin
b1[m,n]:=3;
bum:=true;
cokil:=false;
cokil2:=false;
end;
2: begin
b1[m,n]:=4;
bum:=true;
cokil:=true;
cokil2:=true;
cx1:=m;
cy1:=n;
if (((b1[i+1,j]=2)
or(b1[i,j+1]=2)
or(b1[i-1,j]=2)
or(b1[i,j-1]=2))
or(((b1[i+1,j]=4)and(b1[i+2,j]=2))
or((b1[i,j+1]=4)and(b1[i,j+2]=2))
or((b1[i-1,j]=4)and(b1[i-2,j]=2))
or((b1[i,j-1]=4)and(b1[i,j-2]=2)))
or(((b1[i+1,j]=4)and(b1[i+2,j]=4)and(b1[i+3,j]=2))
or((b1[i,j+1]=4)and(b1[i,j+2]=4)and(b1[i,j+3]=2))
or((b1[i-1,j]=4)and(b1[i-2,j]=4)and(b1[i-3,j]=2))
or((b1[i,j-1]=4)and(b1[i,j-2]=4)and(b1[i,j-3]=2))))=FALSE
then
lUserKilled.Caption:=IntToStr(StrToInt(lUserKilled.Caption)+1);
end
end;
For i:=1 to 10 do //рисуется графическое поле игрока
for j:=1 to 10 do
begin
case b1[i,j] of
4:begin //клетка в котрой стоит подбитый или не доконца подбитый корабль
if ((b1[i+1,j]=2)
or(b1[i,j+1]=2)
or(b1[i-1,j]=2)
or(b1[i,j-1]=2))
or(((b1[i+1,j]=4)and(b1[i+2,j]=2))
or((b1[i,j+1]=4)and(b1[i,j+2]=2))
or((b1[i-1,j]=4)and(b1[i-2,j]=2))
or((b1[i,j-1]=4)and(b1[i,j-2]=2)))
or(((b1[i+1,j]=4)and(b1[i+2,j]=4)and(b1[i+3,j]=2))
or((b1[i,j+1]=4)and(b1[i,j+2]=4)and(b1[i,j+3]=2))
or((b1[i-1,j]=4)and(b1[i-2,j]=4)and(b1[i-3,j]=2))
or((b1[i,j-1]=4)and(b1[i,j-2]=4)and(b1[i,j-3]=2)))
then begin //не доконца подбитый корабль
image1.Canvas.pen.Color:=clred;
image1.Canvas.MoveTo(20*i-19,20*j-19);
image1.Canvas.LineTo(20*i-1,20*j-1);
image1.Canvas.MoveTo(20*i-1,20*j-19);
image1.Canvas.LineTo(20*i-19,20*j-1);
image1.Canvas.pen.Color:=clblack;
b1[i+1,j-1]:=3;
b1[i+1,j+1]:=3;
b1[i-1,j+1]:=3;
b1[i-1,j-1]:=3;
end
else //подбитый корабль
begin
image1.Canvas.Brush.Color:=clred;
image1.Canvas.pen.color:=clBlack;
image1.Canvas.pen.Width:=2;
image1.Canvas.Rectangle(20*i-19,20*j-19,20*i-1,20*j-1);
image1.Canvas.pen.Width:=1;
if (b1[i,j+1]<>4) then b1[i,j+1]:=3;
if (b1[i,j-1]<>4) then b1[i,j-1]:=3;
if (b1[i+1,j]<>4) then b1[i+1,j]:=3;
if (b1[i-1,j]<>4) then b1[i-1,j]:=3;
b1[i+1,j-1]:=3;
b1[i+1,j+1]:=3;
b1[i-1,j+1]:=3;
b1[i-1,j-1]:=3;
end;
end;
end;
end;
end;
For i:=1 to 10 do //рисуется графическое поле игрока
for j:=1 to 10 do
if b1[i,j]=3 then
begin //простреленая пустая клетка
image1.Canvas.Brush.Color:=clwhite;
image1.Canvas.Rectangle(20*i-15,20*j-15,20*i-5,20*j-5)
end;
lose:=true;
For i:=1 to 10 do //если находится хотябы один неподбитый корабль то проигрыша нет
for j:=1 to 10 do
if b1[i,j]=2 then
lose:=false;
if lose=true then
begin
kon:=true;
showmessage ('Вы проиграли.'+#13+'Попробуйте ещё раз!');
exit
end;
end;
end;
procedure TForm1.N3Click(Sender: TObject); //процедура нажатия на кнопку "выход"
begin
close
end;
Последний раз редактировалось @Rafa3L, 10.06.2012 в 14:39. |