【问题标题】:How to receive input for connect-n in C如何在C中接收connect-n的输入
【发布时间】:2017-11-22 01:50:07
【问题描述】:

在connect-N游戏中,玩家只需输入一栏即可。然而,我对如何让玩家在棋盘上最低的空位移动有点困惑。我获取玩家移动的程序是这样的:

void getMove(char **board, const int numRows, const int numCols, const 
char blankSpace, int *row, int *col) {
  int numArgsRead;
  const int numArgsNeeded = 1;

  do {
    printf("Enter a column between 0 and %d to play in: ", numCols - 1);
    numArgsRead = scanf("%d", col);

    for (int i = numRows - 1; i >= 0; --i) {
      if (board[i][*col] != blankSpace) {
        continue;
      }
      else {
        *row = i;
      }
    }
  } while(!isMoveValid(numArgsRead, numArgsNeeded, board, numRows, numCols, *row, 
*col, blankSpace));
}

注意:isMoveValid 基本上接受所有这些参数并确定参数是否为整数,(row,col) 是否在板上,以及该位置是否为空白。

我从 main 调用 getMove,我希望这个函数将行和列的值“返回”给我在 main 中定义的变量 rowPlayed 和 colPlayed。我知道根据用户输入为 col 分配了正确的值,但我不确定为什么 for 循环没有将相应的行索引分配给 *row。有什么建议吗?

编辑:这是我的 main.c

int main(int argc, char* argv[]) {
  const char blankSpace = '*';
  const int numRows = atoi(argv[1]);
  const int numCols = atoi(argv[2]);
  const int numToWin = atoi(argv[3]);
  const char pieces[] = "XO";
  int rowPlayed, colPlayed;
  int playerTurn = 1; // 0 is player 1, 1 is player 2

  correctNumOfArgs(argc, numRows, numCols, numToWin);

  char** board = createBoard(numRows, numCols, blankSpace);

  do {
    playerTurn = changeTurn(playerTurn);

    displayBoard(board, numRows, numCols);

    getMove(board, numRows, numCols, blankSpace, &rowPlayed, &colPlayed);

    makeMove(board, rowPlayed, colPlayed, pieces[playerTurn]);

  } while(!isGameOver(board, numRows, numCols, blankSpace, numToWin, pieces[playerTurn]));

  declareOutcome(playerTurn, board, numRows, numCols, blankSpace, numToWin, pieces[playerTurn]);

  cleanUp(&board, numRows, numCols);

  return 0;
}

【问题讨论】:

  • 您也可以发布您的主要代码吗?如果我们可以构建和运行您的代码,它会有所帮助:)
  • @Michi scanf 将用户输入读入指针变量col,同时赋值给变量numArgsRead。由于它读取一个值,它将为 numArgsRead 分配一个值 1,它等于 numArgsNeeded。
  • @roelofs 我不确定我的主要代码是否会对您有帮助,因为它只是一堆函数调用。但无论如何我都会发布它
  • atoi 替换为strtol 并验证转换。 atoi 绝对无法确保用户没有输入 ./program foo bar baz
  • "寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确的问题陈述对其他读者没有用。请参阅:How to create a Minimal, Complete, and Verifiable example。”如果没有 MCVE,我们无法确定 createBoard 等中不会产生问题。

标签: c pointers


【解决方案1】:

据我所知,在*row = i; 中分配了正确的行索引,但分配后必须中断循环,否则第一个分配将被覆盖。

完整循环建议:

for (int i = numRows - 1; i >= 0; --i)
{
    if (board[i][*col] == blankSpace)
    {
        *row = i;
        break;
    }
}

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2015-02-27
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多