Занялся этим кодом так как олн мне напомнил старые добрые паскалевские времена, когда вот так кодили.
Код:
b1,b2:Array[1..14,1..14] of integer;
когда у нас поле 10х10? зачем 14?
Код ужастен, логика еще хуже. Все написано так, что создается впечатление - код написан на один раз, и повторное его исправление не предусмотрено.
Когда разбирался с логикой исходников только и повторял "бл% ну кто так делает????!!!11111"
Несколько раз пришлось переделывать, сначала нашел место где вроде бы должен выпоняться код при затопленном корабле, но не тут то было, ибо затопление было спрятано в ужаснейшей логической проверке.
В итоге пришлось "засунуть" в "процедуру" прорисовки еще и обозначение ячеек вокруг корабля,так как нету четкого логического разделения побитый-затопленый.
между
Код:
//рисуется графическое поле компютера
замените код на:
Код:
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.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
|