基于ASCII编码实现井字棋胜负判定的重叠性疑问
char choice, a = 'a', b = 'b', c = 'c', d = 'd', e = 'e', f = 'f', g = 'g', h = 'h', i = 'i'; if (a+b+c == 264 || d+e+f == 264 || g+h+i == 264 || a+d+g == 264 || b+e+h == 264 || c+f+i == 264 || a+e+i == 264 || c+e+g == 264) { finish = true; cout << "p1 win" << endl; } else if (a+b+c == 237 || d+e+f == 237 || g+h+i == 237 || a+d+g == 237 || b+e+h == 237 || c+f+i == 237 || a+e+i == 237 || c+e+g == 237) { finish = true; cout << "p2 win" << endl; }
问题:
我采用ASCII编码计算的方式判定井字棋游戏中玩家1或玩家2的胜负。请问该判定逻辑中的求和结果是否存在与其他情况重叠的可能性?
分析结论
你的判定逻辑里的求和结果不会和其他情况重叠,具体原因如下:
- 核心逻辑对应关系:
- 264是三个大写
X的ASCII值之和(88×3=264),对应玩家1获胜; - 237是三个大写
O的ASCII值之和(79×3=237),对应玩家2获胜。
- 264是三个大写
- 井字棋的合法棋子只有
X和O两种,初始的小写字母a-i(ASCII 97-105)会被下棋操作替换,不会留在棋盘上。所有可能的三棋子组合的和都是唯一的:- 三个
X:264 - 三个
O:237 - 两个
X+一个O:88×2+79=255 - 两个
O+一个X:79×2+88=246
这四个数值互不重复,不存在非获胜组合的和等于264或237的情况。
- 三个
- 退一步说,即使有未被替换的初始小写字母,其ASCII值远大于
X和O,任意三个小写字母的和最小为97×3=291,远大于264;混合小写字母与X/O的和也只会落在246-291区间内,同样不会等于264或237。
内容的提问来源于stack exchange,提问作者Xampel
相关产品推荐
相关产品推荐

