2016-12-16 60 views
-1

我试图做一个自学习的蛇游戏,遇到了一个问题,我试图解决在过去的几个小时。这里是我移动蛇头代码:错误的参数传递给函数C#

 public void moveTo() 
     { 
      int foodX = food.PosX/food.Width; 
      int foodY = food.PosY/food.Height;   
      Direction directionOfMaxForCurrentState= new Direction(); 
      int currentX = head.PosX/head.Width; 
      int currentY = head.PosY/head.Height;   
      do 
      { 
       int tmpX = currentX; 
       int tmpY = currentY; 
       previousX = tmpX; 
       previousY = tmpY; 
       directionOfMaxForCurrentState = HighestQactionForState(currentX, currentY, previousX, previousY); 
       if (directionOfMaxForCurrentState == Direction.Up) { head.PosY -= head.Height; } 
       if (directionOfMaxForCurrentState == Direction.Down) { head.PosY += head.Height; } 
       if (directionOfMaxForCurrentState == Direction.Left) { head.PosX -= head.Width; } 
       if (directionOfMaxForCurrentState == Direction.Right) {head.PosX += head.Width; } 
       currentX = head.PosX/head.Width; 
       currentY = head.PosY/head.Height; 
       if (currentX == foodX && currentY == foodY) { snake.Clear(); head = new Cell(1, 1); snake.Add(head); } 
      } while (head.PosX == food.PosX && head.PosY == food.PosY); 
     } 

这里是HighestQactionForState功能:

public Direction HighestQactionForState(int x, int y, int px, int py) 
     { 
      var Qaround = new List<decimal>(); 
      var actionsWithMax = new List<Direction>(); 
      Direction toExclude = new Direction(); 
      toExclude = directionToExclude(x, y, px, py); 
      foreach (Direction action in PosibleActionsForState(x, y).Where(a => a != toExclude).ToList()) 
      { 
       if (action == Direction.Up && (double)Math.Abs(Q[Tuple.Create(x, y - 1, action)] - MaxQaroundState(x, y)) < 0.000000000000000000000001) actionsWithMax.Add(action); 
       if (action == Direction.Down && (double)Math.Abs(Q[Tuple.Create(x, y + 1, action)] - MaxQaroundState(x, y)) < 0.000000000000000000000001) actionsWithMax.Add(action); 
       if (action == Direction.Left && (double)Math.Abs(Q[Tuple.Create(x - 1, y, action)] - MaxQaroundState(x, y)) < 0.000000000000000000000001) actionsWithMax.Add(action); 
       if (action == Direction.Right && (double)Math.Abs(Q[Tuple.Create(x + 1, y, action)] - MaxQaroundState(x, y)) < 0.000000000000000000000001) actionsWithMax.Add(action); 
      } 
      return actionsWithMax.ElementAt(rnd.Next(actionsWithMax.Count)); 
     } 

所以,现在当我把断点在对moveTo功能我看到HighestQactionForState得到正确的参数,但在HighestQactionForState函数中参数不正确 - px始终与int x具有相同的值,而py与y相同,从而导致程序行为错误。任何帮助,将不胜感激!

+0

因为你以前和当前的坐标是相同的。你所做的只是使用临时变量作为中介,但你并没有改变任何一个值。 –

+0

这是因为它们在调用方法时是相同的:currentX == tmpX == previousX –

+0

因为在调用方法 –

回答

1

如果我不是弄错了,你应该这样做,而不是

directionOfMaxForCurrentState = HighestQactionForState(currentX, currentY, previousX, previousY); 
previousX = currentX; 
previousY = currentY; 

您的他们在以前的迭代中设置值的变量的含义调用方法,以便在设置之前的值。

此外,不需要声明额外的临时变量。您的参数按值传递,而不是通过引用。

-1

此位是不是做你想要什么:

int tmpX = currentX; 
int tmpY = currentY; 
previousX = tmpX; 
previousY = tmpY; 

要存储的current值在tmp变量,然后到previous变量分配这些相同的价值观。