2016-12-16 11 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

このビットは、あなたが望むものをやっていません:あなたは、その後previous変数に、同じ値を割り当てる、tmp変数にcurrent値を格納している

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

関連する問題