Игра "найди 10 отличий"

Написал игру "Найди 10 отличий". Я проверяю в какой области происходит клик и выполняю действие с переменными. Но счётчик при этом не обновляется. Помогите пожалуйста найти ошибку.

    procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
a:= 0;
b:= 0;
c:= 0;
d:= 0;
e:= 0;
f:= 0;
g:= 0;
h:= 0;
i:= 0;
j:= 0;
t:= 0;

Label3.Caption:='X='+inttostr(X)+'  Y='+inttostr(Y);
if (370>X) and (X>393) and (140>Y) and (Y>160) then
  begin
     if (a < 1) then
      begin
        a:= 1;
      end
     else
      begin
        a:= a;
      end;
  end
else
begin
if (468>X) and (X>496) and (120>Y) and (Y>140) then
  begin
     if (b < 1) then
      begin
        b:= 1;
      end
     else
      begin
        b:= b;
      end;
  end
else
begin
if (582>X) and (X>600) and (88>Y) and (Y>166) then
  begin
     if (c < 1) then
      begin
        c:= 1;
      end
     else
      begin
        c:= c;
      end;
  end
else
begin
if (600>X) and (X>638) and (88>Y) and (Y>166) then
  begin
     if (d < 1) then
      begin
        d:= 1;
      end
     else
      begin
        d:= d;
      end;
  end
else
begin
if (600>X) and (X>640) and (34>Y) and (Y>46) then
  begin
     if (e < 1) then
      begin
        e:= 1;
      end
     else
      begin
        e:= e;
      end;
  end
else
begin
if (400>X) and (X>425) and (100>Y) and (Y>130) then
  begin
     if (f < 1) then
      begin
        f:= 1;
      end
     else
      begin
        f:= f;
      end;
  end
else
begin
if (590>X) and (X>625) and (250>Y) and (Y>275) then
  begin
     if (g < 1) then
      begin
        g:= 1;
      end
     else
      begin
        g:= g;
      end;
  end
else
begin
if (444>X) and (X>466) and (219>Y) and (Y>232) then
  begin
     if (h < 1) then
      begin
        h:= 1;
      end
     else
      begin
        h:= h;
      end;
  end
else
begin
if (541>X) and (X>565) and (216>Y) and (Y>243) then
  begin
     if (i < 1) then
      begin
        i:= 1;
      end
     else
      begin
        i:= i;
      end;
  end
else
begin
if (492>X) and (X>510) and (262>Y) and (Y>280) then
  begin
     if (j < 1) then
      begin
        j:= 1;
      end
     else
      begin
        j:= j;
      end;
  end;
end;
end;
end;
end;
end;
end;
end;
end;
end;

t:=a+b+c+d+e+f+g+h+i+j;
Label4.Caption:=inttostr(t);
end;

Ответы (2 шт):

Автор решения: MBo

Не могут одновременно выполниться условия

if (492>X) and (X>510)

и все другие пары. Переосмысльте логику.

А эти шедевры

else
   begin
     a:= a;
   end;

просто уберите.

→ Ссылка
Автор решения: Anton Shchyrov
  1. Строка a := a не имеет смысла.

  2. Проверка if (a < 1) then не имеет смысла. Вы только что сделали a := 0.

  3. Разбираться в вашем столбце из end и определять, что к чему относится никто не будет

  4. Условие

    if (370 > X) and (X > 393) and (140 > Y) and (Y > 160) then
    

    не выполнится никогда. Потому, что X не может одновременно быть меньше, чем 370 и больше чем 393. Для Y аналогично.

  5. Но принципиальная ошибка в том, что на каждый клик вы обнуляете все счетчики.

Если привести в чувство ваш код, то получится так

procedure TForm2.ResetClick(Sender: TObject);
begin
  a:= 0;
  b:= 0;
  c:= 0;
  d:= 0;
  e:= 0;
  f:= 0;
  g:= 0;
  h:= 0;
  i:= 0;
  j:= 0;
  t:= 0;
  Label4.Caption := '0';
end;

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Label3.Caption:='X='+inttostr(X)+'  Y='+inttostr(Y);
  if (370 < X) and (X < 393) and (140 < Y) and (Y < 160) then begin
   if (a = 0) then
     a := 1;
  end else if (468 < X) and (X < 496) and (120 < Y) and (Y < 140) then begin
    if (b = 0) then
      b := 1;
  end else if
    ........
  end else if (492 < X) and (X < 510) and (262 < Y) and (Y < 280) then begin
   if (j = 0) then
      j := 1;
  end;

  t:=a+b+c+d+e+f+g+h+i+j;
  Label4.Caption := IntToStr(t);
end;

А если переписать по уму, то получится так

const
  // Общее количество точек
  CDiffCount = 10;
  // Координаты прямоугольников с отличиями
  CDiffPoints: array[0..CDiffCount - 1] of TRect = (
    (Left: 370; Top: 140; Right: 393; Bottom: 160),
    (Left: 468; Top: 120; Right: 496; Bottom: 140),
    (Left: 582; Top: 88; Right: 600; Bottom: 166),
    (Left: 600; Top: 88; Right: 638; Bottom: 166),
    (Left: 600; Top: 34; Right: 640; Bottom: 46),
    (Left: 400; Top: 100; Right: 425; Bottom: 130),
    (Left: 590; Top: 250; Right: 625; Bottom: 275),
    (Left: 444; Top: 219; Right: 466; Bottom: 232),
    (Left: 541; Top: 216; Right: 565; Bottom: 243),
    (Left: 492; Top: 262; Right: 510; Bottom: 280)
  );

var
  FoundPoints: array[0..CDiffCount - 1] of Boolean;
  t: Integer;

procedure TForm2.ResetClick(Sender: TObject);
begin
  // Обнуляем список найденных точек
  FillChar(FoundPoints[0], Length(FoundPoints) * SizeOf(FoundPoints[0]), 0);
  t := 0;
  Label4.Caption := '0';
end;

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
  R: TRect;
begin
  Label3.Caption := Format('X=%d, Y=%d', X, Y);
  // Перебираем все точки
  for i := 0 to Length(CDiffPoints) - 1 do begin
    // Если по этой точке еще не кликали
    if not FoundPoints[i] then begin
      R := CDiffPoints[i];
      // Проверяем попадание в прямоугольник
      if
        (R.Left < X) and (X < R.Right) and
        (R.Top < Y) and (Y < R.Bottom)
      then begin
        // Отмечаем точку
        FoundPoints[i] := True;
        // Увеличиваем счетчик попаданий
        Inc(t);
        Label4.Caption := IntToStr(t);
        // Досрочно выходим из цикла. Дальше проверять бессмысленно
        Break;
      end; 
  ​end;
​end;
→ Ссылка