【问题标题】:Variable addition is being ignored within a method变量加法在方法中被忽略
【发布时间】:2015-12-02 22:17:03
【问题描述】:

前提是根据角色选择的方向和掷骰子的值在网格周围移动角色。

函数CalculateMovePrepareMove 中被调用。在CalculateMove 中,变量finishXfinishYdiceValue 的值相加或相减。

CalculateMove 中与 finalX 或 finalY 相关的所有内容都将被忽略,即使在 if 语句之外写入 += 3 也是如此。 The screenshot of a little debug log shows that the variables finishX, finishY and foo are not being treated in the method.

static void PrepareMove(Position startPosition, Position finishPosition, Player playerGreen, Player playerYellow, Player playerBlue, Player playerRed, string playerMoveDirection, string currentPlayer, string winningPlayer, string[,] board, int diceValue, int startX, int startY, int finishX, int finishY, bool gameOver)
    {            
        GetStartPosition(board, startPosition, currentPlayer, startX, startY);            
        CalculateMove(playerMoveDirection, board, diceValue, startX, startY, finishX, finishY);
        Console.WriteLine("\nStart XY = " + startX + "-" + startY + "\nDice Value = " + diceValue + "\nMoveDir = " + playerMoveDirection + "\nFinish XY = " + finishX + " -- " + finishY + "\n"); 
        CheckPieceCaptured(board, playerGreen, playerYellow, playerBlue, playerRed, currentPlayer, winningPlayer, finishX, finishY, gameOver); 
        MakeMove(board, startX, startY, finishX, finishY); 
    }

    static void CalculateMove(string playerMoveDirection, string[,] board, int diceValue, int startX, int startY, int finishX, int finishY)
    {
        finishX += 3; 
        if (playerMoveDirection.ToUpper().Equals("UP"))
        {
            finishX = startX;
            finishY = startY - diceValue;
        }
        else if (playerMoveDirection.ToUpper().Equals("DOWN"))
        {
            finishX = startX;
            finishY = startY + diceValue;
        }
        else if (playerMoveDirection.ToUpper().Equals("LEFT"))
        {
            finishX = startX - diceValue;
            finishY = startY;
        }
        else if (playerMoveDirection.ToUpper().Equals("RIGHT"))
        {
            finishX = startX + diceValue;
            finishY = startY; 
        }
    }

有什么想法吗? :( 谢谢,

【问题讨论】:

    标签: c# function procedures


    【解决方案1】:

    在函数退出后,您需要对参数使用“ref int finishX”和“ref int finishY”来保留值。

    https://msdn.microsoft.com/en-us/library/14akc2c7.aspx

    【讨论】:

      【解决方案2】:

      您正在通过值传递finishXfinishY,因此当您在CalculateMove 方法中更改它们的值时,您正在更改CalculateMove 方法的本地副本的值,而不是原始变量.

      您需要像这样通过引用传递finishXfinishY

      static void CalculateMove(
          string playerMoveDirection,
          string[,] board,
          int diceValue, int startX, int startY,
          ref int finishX, ref int finishY)
      {
          ...
      }
      

      您还需要对PrepareMove 方法执行相同的操作。

      顺便说一句,如果你创建一个类来保存你的 X 和 Y 值,这样会更好:

      public class Coordinates
      {
          public int X {get;set;}
          public int Y {get;set;}
      }
      

      然后有如下定义的方法:

      static void CalculateMove(
          string playerMoveDirection,
          string[,] board,
          int diceValue,
          Coordinates start_coordinates,
          Coordinates finish_coordinates)
      {
          ...
      }
      

      然后你可以像这样访问坐标:

      finish_coordinates.X = ...
      

      这将使您的代码更具可读性,并且您不必通过引用传递它。

      您也应该对其他方法执行相同的操作。

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2020-09-03
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多