C++开发WAR纸牌游戏时卡牌数值显示为ASCII值无法转字母问题求助
问题原因
- 变量类型不匹配导致输出异常:你定义的
cardnumber、ocardnumber都是int类型,即使给它们赋值J/Q/K/A对应的ASCII值,cout输出int类型变量时默认会打印数字值,不会自动转成字符输出,所以才会显示74、81这类ASCII数值。 - 核心逻辑错误:处理对手牌
ocardnumber的分支里,你错误地给己方手牌cardnumber赋值,会直接打乱己方手牌的原始数值,后续大小比较完全不准确。 - switch分支缺少break:所有switch的case分支都没有加break,匹配到对应数值后会连续执行后续所有case的代码,比如卡牌是11时会同时输出J/Q/K/A四个字符。
- 随机数种子重复初始化:你多次调用
srand(time(NULL)),time()返回的是秒级时间戳,同一秒内多次调用会让rand()返回完全相同的数值,只需要在程序开头调用一次srand即可。 - 数值覆盖导致大小比较失效:你把原始卡牌数值(2~14)直接替换成ASCII值(65/74等),会破坏原有的卡牌大小关系,比如J的ASCII值74远大于2的数值,后续胜负判断逻辑完全失效。
修复方案
你不需要修改存储卡牌数值的变量类型,保留int类型存原始2~14的数值,只需要在输出的时候做判断转换即可:
// 输出卡牌的工具逻辑,数值为2~10直接输出数字,11~14输出对应字母 void printCardValue(int val) { if (val >=2 && val <=10) { cout << val; } else if (val == 11) { cout << 'J'; } else if (val == 12) { cout << 'Q'; } else if (val ==13) { cout << 'K'; } else if (val ==14) { cout << 'A'; } }
原来修改cardnumber/ocardnumber赋值的代码全部删掉,所有需要输出卡牌值的地方替换成调用printCardValue即可,比如:
// 原来的cout << cardnumber 改成: printCardValue(cardnumber); // 原来的cout << ocardnumber 改成: printCardValue(ocardnumber);
额外优化建议:随机数种子只保留程序开头的一次srand(time(NULL))即可,其余的全部删除;如果要保留原有switch逻辑,记得每个case后面加break。
内容的提问来源于stack exchange,提问作者Braden Judson
相关产品推荐
相关产品推荐

