代码之家  ›  专栏  ›  技术社区  ›  user1937012

Delphi面向对象的蛇游戏,使用timage[关闭]

  •  -3
  • user1937012  · 技术社区  · 8 年前

    我觉得很无聊,我觉得我应该做些有成效的事情,比如尝试和深化我对面向对象编程的知识,所以我开始创建一个只使用时间组件的小蛇游戏。我这样做是为了理解我所做的以及为什么我会出错,完整的代码在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

    如果有人能看看这个,告诉我我做错了什么,这样我就能从错误中吸取教训,我会非常感激的。我想你可以让一个蛇的游戏更简单,但我想用一个类,对象,在对象内的数组复杂化,以便尝试新的水域。

    非常感谢你的帮助!

    1 回复  |  直到 8 年前
        1
  •  0
  •   user1937012    8 年前

    同时解决…

    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;