Показать сообщение отдельно
  #8  
Старый 09.06.2012, 20:05
Аватар для @Rafa3L
@Rafa3L @Rafa3L вне форума
Начинающий
 
Регистрация: 09.11.2011
Адрес: Москва
Сообщения: 144
Версия Delphi: XE2
Репутация: 11216
По умолчанию

Занялся этим кодом так как олн мне напомнил старые добрые паскалевские времена, когда вот так кодили.

Код:
b1,b2:Array[1..14,1..14] of integer;
когда у нас поле 10х10? зачем 14?

Код ужастен, логика еще хуже. Все написано так, что создается впечатление - код написан на один раз, и повторное его исправление не предусмотрено.

Когда разбирался с логикой исходников только и повторял "бл% ну кто так делает????!!!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.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
Ответить с цитированием