C++开发控制台井字棋时char值输出ASCII数值而非字符,强制转换失败如何解决
问题修复方案
核心BUG(输出ASCII码的原因)
你输出时用了printf的%d格式符,这个格式符的作用就是把对应参数按十进制整数输出,哪怕你强制转了char类型,传入printf后还是会被整型提升,最终输出ASCII码的十进制值。
修复方案:把打印行的%d改成%c,同时矩阵初始化的时候把数字改成字符字面量,否则初始的1~9输出是不可见控制字符:
// 原错误打印代码 printf(" %d", (char) tttMatrix[i][j] ); // 修复后 printf(" %c", tttMatrix[i][j] ); // 原错误矩阵初始化 mat3x3 tttMatrix = {{1,2,3}, {4,5,6}, {7,8,9}}; // 修复后(用字符字面量) mat3x3 tttMatrix = {{'1','2','3'}, {'4','5','6'}, {'7','8','9'}};
其他可运行性BUG
- 你在
main里调用updateMatrix时直接传了currentPlayer,这个变量不存在,你定义的是getCurrentPlayer()函数,需要调用才能拿到当前玩家对象:
// 原错误代码 updateMatrix( choice, currentPlayer, tttMatrix); // 修复后 updateMatrix( choice, getCurrentPlayer(), tttMatrix);
using namespace::std;写法不规范,正确写法是using namespace std;- 胜负判断逻辑完全未实现,全局变量
win永远为false,游戏只能打满9轮才会结束,需要补充行、列、对角线的同符号判断逻辑。
代码规范优化建议
- 尽量不要混用C的
printf和C++的cout,统一用同一种输出方式更易维护,如果用cout直接输出char类型变量会自动打印字符不需要额外格式控制:
// 用cout的写法替代printf cout << " " << tttMatrix[i][j];
- 避免使用全局变量
Round、win、player1、player2,可以把这些变量放到main函数中,通过参数传递给需要的函数,降低代码耦合度。 getCurrentPlayer函数当前返回的是Player对象的副本,建议改为返回Player&引用,避免不必要的拷贝。updateMatrix的返回值目前没有被使用,可以改为返回void,或者用返回值判断落子是否成功(比如判断位置是否已经被占用)。- 补充落子合法性校验:用户选择的位置如果已经被填了x/o,需要提示用户重新输入,不能直接覆盖原有符号。
- 不要直接引用cpp文件
#include "XO.cpp",正确做法是引用对应的头文件,把类定义放到头文件、实现放到cpp文件中,编译的时候链接对应cpp文件即可。
内容的提问来源于stack exchange,提问作者code_by_cr
相关产品推荐
相关产品推荐

