C++实现终极井字棋3x3网格显示问题求助
修复终极井字棋3x3网格显示问题
你当前的displayBoards方法会逐个完整渲染每个小棋盘,导致所有小棋盘纵向堆叠成单列。要实现3x3网格布局,需要按行批次渲染:先渲染所有小棋盘的同一行内容,再处理分隔线,这样横向的小棋盘就能对齐排列。
修改方案
1. 给TicTacToe类添加辅助方法
新增方法用于获取小棋盘指定行的渲染内容,方便后续拼接横向布局:
// 在TicTacToe类的public段添加声明 string getBoardLine(int lineIndex);
实现该方法:
string TicTacToe::getBoardLine(int lineIndex) { if (lineIndex == 0) { return " 1 2 3"; } int boardRow = lineIndex - 1; if (boardRow < 0 || boardRow >= BOARDSIZE) return ""; stringstream ss; ss << boardRow + 1; for (int j = 0; j < BOARDSIZE; j++) { char playerSymbol = ' '; if (board[boardRow][j] == 1) playerSymbol = 'X'; else if (board[boardRow][j] == -1) playerSymbol = 'O'; ss << setw(3) << playerSymbol; if (j != BOARDSIZE - 1) ss << " |"; } return ss.str(); }
同时可以更新原displayBoard方法保持逻辑统一:
void TicTacToe::displayBoard() { cout << getBoardLine(0) << endl << endl; for (int i = 0; i < BOARDSIZE; i++) { cout << getBoardLine(i+1) << endl; if (i != BOARDSIZE - 1) cout << " ____|____|____" << endl << " | | " << endl; } cout << endl; }
2. 重构NBTicTacToe::displayBoards方法
按大棋盘的行组拼接所有小棋盘的对应行内容,实现横向3x3布局:
void NBTicTacToe::displayBoards() { const string SMALL_BOARD_SEP = " | "; const string BIG_ROW_SEP = "==============================="; // 遍历大棋盘的每一行(共3组) for (int bigRow = 0; bigRow < BOARDSIZE; bigRow++) { // 渲染当前大行所有小棋盘的标题行 for (int bigCol = 0; bigCol < BOARDSIZE; bigCol++) { cout << boards[bigRow][bigCol].getBoardLine(0); if (bigCol != BOARDSIZE - 1) cout << SMALL_BOARD_SEP; } cout << endl << endl; // 渲染当前大行所有小棋盘的3行内容及内部分隔线 for (int smallRow = 1; smallRow <= BOARDSIZE; smallRow++) { // 拼接当前行的所有小棋盘内容 for (int bigCol = 0; bigCol < BOARDSIZE; bigCol++) { cout << boards[bigRow][bigCol].getBoardLine(smallRow); if (bigCol != BOARDSIZE - 1) cout << SMALL_BOARD_SEP; } cout << endl; // 渲染小棋盘内部的分隔线(非最后一行时) if (smallRow != BOARDSIZE) { for (int bigCol = 0; bigCol < BOARDSIZE; bigCol++) { cout << " ____|____|____"; if (bigCol != BOARDSIZE - 1) cout << SMALL_BOARD_SEP; } cout << endl; for (int bigCol = 0; bigCol < BOARDSIZE; bigCol++) { cout << " | | "; if (bigCol != BOARDSIZE - 1) cout << SMALL_BOARD_SEP; } cout << endl; } } cout << endl; // 渲染大棋盘行之间的分隔线(非最后一行时) if (bigRow != BOARDSIZE - 1) { cout << BIG_ROW_SEP << endl << endl; } } }
效果说明
修改后,9个小棋盘会以3x3网格形式横向排列:每行包含3个小棋盘,小棋盘之间用|分隔,大棋盘行之间用粗分隔线区分,完全符合你期望的布局样式。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

