私は自己学習のヘビゲームを作ろうとしており、過去数時間にわたって解決しようとしている問題が発生しました。ここで私は蛇の頭を移動するコードは次のとおりです。関数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と同じで、プログラムが正しく動作しません。どんな助けもありがとう!
以前の座標と現在の座標が同じであるためです。あなたがしているのは、中間変数として一時変数を使用しているだけですが、どちらの値も変更していません。 –
これはメソッドを呼び出すときに同じであるからです:currentX == tmpX == previousX –
メソッドを呼び出す前に設定した値で参照するため、動作が期待されます –