Codecademy井字棋项目中2D vector无法打印问题求助
解决2D Vector打印问题及井字棋项目优化建议
代码中的核心问题
- 内层循环判断错误:你在内层循环中用了
board.size(),但这个值是外层vector的行数(当前为2),正确的应该是取当前行的列数board[i].size()。 - 棋盘初始化不完整:井字棋需要3×3的棋盘,你只初始化了两行,缺少第三行
{7,8,9}。 - 输出格式错误:每次打印元素后就用
endl换行,导致每个数字单独占一行,应该在整行元素打印完后再换行。 - 冗余全局变量:全局的
i和j完全没必要,循环内的局部变量已经能满足需求,全局变量容易引发不必要的冲突。
修正后的代码
#include <iostream> #include <string> #include <vector> using namespace std; void intro(){ cout << "Let's play a game of Tic-Tac-Toe!\n Decide who goes first and enter your letters accordingly.\n First to match three letters in a row wins!\n\n"; } int main(){ intro(); // 初始化标准3×3井字棋棋盘 vector<vector<int>> board{{1,2,3},{4,5,6},{7,8,9}}; // 遍历每一行 for(int i = 0; i < board.size(); i++){ // 遍历当前行的每一列 for (int j = 0; j < board[i].size(); j++){ cout << board[i][j] << " "; } // 整行打印完成后换行 cout << endl; } return 0; }
后续项目优化建议
- 调整存储类型:后续要存储X/O,建议把vector的类型从
int改为char,比如初始化为vector<vector<char>> board(3, vector<char>(3, ' ')),或者保留数字初始化,后续用X/O替换对应位置的数字。 - 输入转换逻辑:处理用户输入时,可以让用户输入1-9的位置数字,通过
(n-1)/3计算行索引、(n-1)%3计算列索引,快速定位到棋盘对应的位置。 - 封装打印逻辑:单独写一个
printBoard函数封装打印代码,每次棋盘更新后直接调用,避免重复代码。 - 胜负判断:添加逻辑检查每行、每列、两条对角线是否存在连续三个相同的非空字符,实现胜负判定功能。
内容的提问来源于stack exchange,提问作者user24549772
相关产品推荐
相关产品推荐

