【问题标题】:C enum array (need help understanding)C枚举数组(需要帮助理解)
【发布时间】:2023-03-09 09:17:02
【问题描述】:
enum cell_contents {
    INVALID, HOLE, PEG
};

static const enum cell_contents master_board[BOARD_HEIGHT][BOARD_WIDTH] = {
    { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
    { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
    { PEG, PEG, PEG, PEG, PEG, PEG, PEG },
    { PEG, PEG, PEG, HOLE, PEG, PEG, PEG },
    { PEG, PEG, PEG, PEG, PEG, PEG, PEG },
    { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
    { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID }
};

我需要有关如何遍历 master_board 表并确定该字段是 INVALID、PEG 还是 HOLE 的帮助。

我试过用这个方法,没用:

char *characters[] = {"\t", 'o', '.'};

/* display the game board to the screen */
void display_board(enum cell_contents board[][BOARD_HEIGHT])
{
    /* delete this comment and write your own comments and code here */
    for(int i = 0; i < BOARD_HEIGHT; i++) {
        printf("%d.", i+1);

        int length = sizeof(board[i]) / sizeof(board[i][0]);
        printf("Length: %d", length);

        for(int e = 0; e < length; e++){
            if(board[i][e] == INVALID)
                printf("\t%c", characters[0]);
            else if(board[i][e] == PEG)
                printf("\t%c", characters[1]);
            else if(board[i][e] == HOLE)
                printf("\t%c", characters[2]);
        }

        printf("\n");
    }
}

我正在使用另一个函数来调用 display_board:

void play_game(void)
{
    enum cell_contents board[BOARD_WIDTH][BOARD_HEIGHT];
    init_board(board);
    /* delete this comment and write your own comments and code here */

    //while(!is_game_over(board)) {
        display_board(board);
    //}
}

BOARD_WIDTH 和 BOARD_HEIGHT 在 7 处相同。

【问题讨论】:

  • 您的参数定义错误(您使用 BOARD_HEIGHT 作为绑定为“y”的第二个数组,但在定义中您将其用作您的 x),也请考虑enum cell_contents **board,因为它会无论如何都会被编译器截断。而且,仅供参考:您可以只使用board[i][e] 作为characters 的索引,因为它无论如何都匹配它(board[i][e] 可以是INVALID/PEG/HOLE 而那些是0/1/2 所以...
  • 你想void display_board(enum cell_contents board[][BOARD_WIDTH])吗?
  • 看起来像BOARD_WIDTH == BOARD_HEIGHT(两者都是7),但@chux 提出的观点对于一致性是正确的。
  • 您说“不起作用”,但您没有说它如何不起作用。请更加明确。请注意,使用 '\t' 表示无效可能是个坏主意;使用常规打印字符,例如x。我并不完全相信循环打印中的标签,但如果你使用 x(或 @ 或任何其他常规可打印字符),你应该会更好。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者没有用处。

标签: c arrays loops enums


【解决方案1】:

你定义了 BOARD_WIDTH 和 BOARD_HEIGHT 吗? 这段代码对我有用:

#define BOARD_HEIGHT 7
#define BOARD_WIDTH 7
enum cell_contents {
  INVALID, HOLE, PEG
};

static const enum cell_contents master_board[BOARD_HEIGHT][BOARD_WIDTH] = {
  { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
  { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
  { PEG, PEG, PEG, PEG, PEG, PEG, PEG },
  { PEG, PEG, PEG, HOLE, PEG, PEG, PEG },
  { PEG, PEG, PEG, PEG, PEG, PEG, PEG },
  { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID },
  { INVALID, INVALID, PEG, PEG, PEG, INVALID, INVALID }
};

char *characters[] = {"\t", 'o', '.'};


void display_board(enum cell_contents board[][BOARD_HEIGHT])
{
    /* delete this comment and write your own comments and code here */
   for(int i = 0; i < BOARD_HEIGHT; i++) {
      printf("%d.", i+1);

      int length = sizeof(board[i]) / sizeof(board[i][0]);
      printf("Length: %d", length);

      for(int e = 0; e < length; e++){
          if(board[i][e] == INVALID)
              printf("\t%c", characters[0]);
          else if(board[i][e] == PEG)
              printf("\t%c", characters[1]);
          else if(board[i][e] == HOLE)
              printf("\t%c", characters[2]);
      }

       printf("\n");
  }
}

int main(int argc, char const *argv[])
{
 display_board(master_board);
 return 0;
}

【讨论】:

  • 我正在使用另一个函数来显示棋盘:void play_game(void) { enum cell_contents board[BOARD_WIDTH][BOARD_HEIGHT];初始化板(板); /* 删除此评论并在此处编写您自己的 cmets 和代码 */ //while(!is_game_over(board)) { display_board(board); //} }
  • 我没有正确初始化变量。 memcpy(board, master_board, sizeof(master_board))的使用;工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多