#include #include #include using namespace std; bool isValidTwoBits(const string& code) { return code.size() == 2 && (code[0] == '0' || code[0] == '1') && (code[1] == '0' || code[1] == '1'); } int decodePosition(const string& code) { if (code == "00") return 0; if (code == "01") return 1; if (code == "10") return 2; return 3; } int bitAtFromLeft(int team, int position) { return (team >> (3 - position)) & 1; } int main() { random_device rd; mt19937 gen(rd()); uniform_int_distribution teamDist(0, 15); uniform_int_distribution winnerDist(0, 1); int teamA = teamDist(gen); int teamB = teamDist(gen); while (teamB == teamA) { teamB = teamDist(gen); } int winner = winnerDist(gen) == 0 ? teamA : teamB; cout << "Players and Winners 训练器\n\n"; cout << "本轮两支参赛队是:\n"; cout << "A = " << teamA << '\n'; cout << "B = " << teamB << "\n\n"; cout << "注意:请你先把它们各自转换成 4 位二进制。\n\n"; cout << "现在请你扮演 Tristan。\n"; cout << "请输入 2 比特,表示你要看哪一位:\n"; cout << "00 -> 第1位(从左到右)\n"; cout << "01 -> 第2位\n"; cout << "10 -> 第3位\n"; cout << "11 -> 第4位\n"; string tristanCode; cin >> tristanCode; if (!isValidTwoBits(tristanCode)) { cout << "输入无效:Tristan 必须输入 2 比特。\n"; return 0; } int position = decodePosition(tristanCode); int bitA = bitAtFromLeft(teamA, position); int bitB = bitAtFromLeft(teamB, position); cout << "\nTristan 选择看第" << position + 1 << "位。\n"; if (bitA == bitB) { cout << "这一步无效,因为两支队在这一位上相同,无法区分赢家。\n"; cout << "A 的该位是 " << bitA << ",B 的该位也是 " << bitB << "。\n"; cout << "真实赢家其实是编号:" << winner << '\n'; return 0; } cout << "可以,这一位上两支队不同。\n\n"; cout << "现在请你扮演 Isolde。\n"; cout << "请输入 0 或 1,表示赢家在第" << position + 1 << "位上的值:"; char isoldeBit; cin >> isoldeBit; if (isoldeBit != '0' && isoldeBit != '1') { cout << "输入无效:Isolde 必须输入 0 或 1。\n"; return 0; } int correctBit = bitAtFromLeft(winner, position); int guessedWinner = (bitAtFromLeft(teamA, position) == (isoldeBit - '0')) ? teamA : teamB; cout << "\n本轮总结:\n"; cout << "参赛队编号:" << teamA << " 和 " << teamB << '\n'; cout << "Tristan 发送:" << tristanCode << '\n'; cout << "Isolde 回复:" << isoldeBit << '\n'; cout << "按这个回复,Tristan 判断赢家编号是:" << guessedWinner << "\n\n"; if (isoldeBit - '0' == correctBit) { cout << "你的回复是正确的。真实赢家确实是编号:" << winner << '\n'; } else { cout << "你的回复不对。\n"; cout << "真实赢家是编号:" << winner << '\n'; cout << "所以第" << position + 1 << "位的正确回复应为:" << correctBit << '\n'; } return 0; }