Мне было скучно, и я подумал, что должен заняться чем-то продуктивным, например, попытаться углубить свои знания с помощью объектно-ориентированного программирования, поэтому я решил создать небольшую игру-змейку, используя только компонент TImage. И я сделал это, чтобы понять, что я сделал, и, возможно, почему я получаю ошибку, полный код находится на pastebin.
Моя проблема проявляется в том, что Еда, если ее съела змея, иногда (очень редко) новая еда появляется на хвосте змеи, что не должно быть возможным ...
if (fPosX = Fruit.PosX) and (fPosY = Fruit.PosY) then
begin
Player.AddPart;
inc(PlayerScore,10);
// make sure the position is not inside a wall or the snake itself
ValidPos:=false;
while ValidPos = false do
begin
randomX:=random(Main.TileXCount);
randomY:=random(Main.TileYCount);
if Main.Level[randomY,RandomX] <> 1 then
if (fPosX <> randomX) and (fPosY <> randomY) then
begin
for i := 0 to Length(fPlayerParts)-1 do
begin
if (fPlayerParts[i].X <> randomX) and (fPlayerParts[i].Y <> randomY) then
ValidPos:=true;
end;
end;
end;
Fruit.PosX:=randomX;
Fruit.PosY:=randomY;
end;
Я был бы очень благодарен, если бы кто-нибудь взглянул на это и сказал мне, что я сделал не так, чтобы я мог учиться на своих ошибках. Я думаю, вы можете сделать игру «Змея» намного проще, но я хотел усложнить ее с помощью класса, объекта, массива внутри объекта, чтобы попробовать новые воды.
Большое спасибо за вашу помощь!
Код @Victoria, который работает некорректно, как описано в OP, не входит в тему Code Review.
@Phrancis, так что описание проблемы "иногда (очень редко)" здесь.
@Warren P: спасибо, но не очень полезно ... а иногда ... вы просто получаете слепой код ... (или вы тоже этого не видели :))
Всегда полезно для отладки вашего кода.



Решено пока что ...
if (fPlayerParts[i].X <> randomX) and (fPlayerParts[i].Y <> randomY) then
ValidPos:=true;
если массив 1,2 1,3 1,4
фрукт 1,2 ... это будет верно для 1,3 и 1,4 Я изменил логику ... но спасибо
ValidPos:=false;
while ValidPos = false do
begin
randomX:=random(Main.TileXCount);
randomY:=random(Main.TileYCount);
if (Main.Level[randomY,randomX] <> 1) and ((fPosX <> randomX) and (fPosY <> randomY)) then
begin
ValidPos:=true;
for i := 0 to Length(fPlayerParts)-1 do
if (fPlayerParts[i].X = randomX) and (fPlayerParts[i].Y = randomY) then
ValidPos:=false;
end;
end;
самый важный навык, который вам понадобится, - это отладить это самостоятельно.