Объектно-ориентированная игра-змейка в Delphi с использованием TImage

Мне было скучно, и я подумал, что должен заняться чем-то продуктивным, например, попытаться углубить свои знания с помощью объектно-ориентированного программирования, поэтому я решил создать небольшую игру-змейку, используя только компонент 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;

https://pastebin.com/ywt5M1ai

Я был бы очень благодарен, если бы кто-нибудь взглянул на это и сказал мне, что я сделал не так, чтобы я мог учиться на своих ошибках. Я думаю, вы можете сделать игру «Змея» намного проще, но я хотел усложнить ее с помощью класса, объекта, массива внутри объекта, чтобы попробовать новые воды.

Большое спасибо за вашу помощь!

самый важный навык, который вам понадобится, - это отладить это самостоятельно.

Warren P 14.06.2018 21:47

Код @Victoria, который работает некорректно, как описано в OP, не входит в тему Code Review.

Phrancis 14.06.2018 21:51

@Phrancis, так что описание проблемы "иногда (очень редко)" здесь.

Victoria 14.06.2018 22:00

@Warren P: спасибо, но не очень полезно ... а иногда ... вы просто получаете слепой код ... (или вы тоже этого не видели :))

user1937012 14.06.2018 22:31

Всегда полезно для отладки вашего кода.

David Heffernan 15.06.2018 08:46
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
3
5
404
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решено пока что ...

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;

Другие вопросы по теме