Игра "найди 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 шт):
Не могут одновременно выполниться условия
if (492>X) and (X>510)
и все другие пары. Переосмысльте логику.
А эти шедевры
else
begin
a:= a;
end;
просто уберите.
Строка
a := aне имеет смысла.Проверка
if (a < 1) thenне имеет смысла. Вы только что сделалиa := 0.Разбираться в вашем столбце из
endи определять, что к чему относится никто не будетУсловие
if (370 > X) and (X > 393) and (140 > Y) and (Y > 160) thenне выполнится никогда. Потому, что
Xне может одновременно быть меньше, чем370и больше чем393. ДляYаналогично.Но принципиальная ошибка в том, что на каждый клик вы обнуляете все счетчики.
Если привести в чувство ваш код, то получится так
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;