猜数字2.0
2026-08-06 17:29:47
发布于:广东
猜数字(2.0,含人机对战!!!!!)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <string>
#include <conio.h> // _getch()
using namespace std;
// 兼容老版本的整数转字符串
string itos(int n) {
char b[20];
sprintf(b, "%d", n);
return string(b);
}
// 电脑玩家逻辑:二分法为主,偶尔随机
int cpuGuess(int L, int R) {
if (rand() % 10 < 7) {
return (L + R) / 2;
} else {
return L + rand() % (R - L + 1);
}
}
int main() {
srand((unsigned)time(NULL));
vector<string> names;
string name;
cout << "=== 猜数字大鹅版 (纯净无延时) ===\n";
cout << "规则: 猜中秘密数字者胜。输入 CPU 添加电脑玩家。\n";
cout << "输入玩家名字 (@结束): ";
while (cin >> name && name != "@") {
names.push_back(name);
}
if (names.empty()) {
cout << "没有玩家,游戏退出。\n";
return 0;
}
int diff, prob;
cout << "难度 (1-6, 1=100以内, 6=10万以内): ";
cin >> diff;
cout << "魔法牌概率 (1-6, 越大越容易触发): ";
cin >> prob;
// 确定范围
int L = 1, R = 100;
if (diff == 2) R = 1000;
else if (diff == 3) R = 5000;
else if (diff == 4) R = 10000;
else if (diff == 5) R = 50000;
else if (diff >= 6) R = 100000;
int ans = rand() % (R - L + 1) + L;
int buff = 0; // 0:无 1:增 2:减 3:跳 4:自 5:黑 6:宽
int lastGuess = -1;
string lastPlayer = "";
cout << "\n游戏开始! 秘密数字已在 [" << L << ", " << R << "] 之间生成。\n";
cout << "按任意键开始第一轮...";
_getch();
while (true) {
for (size_t i = 0; i < names.size(); ++i) {
system("cls"); // 清屏
// 显示状态
cout << "================ 当前回合 ================\n";
cout << "有效范围: [" << L << ", " << R << "]\n";
if (buff != 5) { // 非抹黑状态显示上轮
if (lastGuess != -1) {
cout << "上轮信息: " << lastPlayer << " 猜了 " << itos(lastGuess) << "\n";
} else {
cout << "上轮信息: 无\n";
}
} else {
cout << "上轮信息: [被小猴抹黑了,无法查看]\n";
}
// 显示当前Buff
if (buff != 0) {
cout << "*** 当前生效魔法: ";
if(buff==1) cout << "答案已增大";
if(buff==2) cout << "答案已减小";
if(buff==3) cout << "本回合跳过";
if(buff==4) cout << "本回合自动";
if(buff==6) cout << "本回合宽松";
cout << " ***\n";
}
cout << "==========================================\n";
string& p = names[i];
int guess = -1;
bool isCPU = (p == "CPU");
// --- 处理 Buff ---
if (buff == 3) { // 跳过
cout << "[" << p << "] 被魔法跳过本回合!\n";
buff = 0;
cout << "\n按任意键继续..."; _getch();
continue;
}
if (buff == 4) { // 自动
guess = (L + R) / 2;
cout << "[" << p << "] 魔法强制自动猜测: " << guess << "\n";
buff = 0;
cout << "\n按任意键继续..."; _getch();
} else {
// 正常输入或CPU思考
if (isCPU) {
cout << "[" << p << "] 正在思考... (按任意键查看结果)\n";
_getch(); // 用按键代替延时,让用户控制节奏
guess = cpuGuess(L, R);
cout << "[" << p << "] 猜: " << guess << "\n";
} else {
cout << "[" << p << "] 请输入猜测: ";
if (!(cin >> guess)) {
cin.clear();
cin.ignore(10000, '\n');
cout << "输入无效,请重新输入!\n";
cout << "按任意键重试..."; _getch();
--i; // 重试当前玩家
continue;
}
}
// 宽松模式处理
if (buff == 6) {
buff = 0;
int diff_val = guess - ans;
if (diff_val < 0) diff_val = -diff_val;
if (diff_val <= 3) {
cout << "[宽松魔法] 太接近了! 直接修正为正确答案!\n";
guess = ans;
} else {
cout << "[宽松魔法] 帮你向答案靠近了3点!\n";
guess += (guess < ans ? 3 : -3);
}
cout << "按任意键继续..."; _getch();
}
}
// --- 验证范围 ---
if (guess < L || guess > R) {
cout << ">> 错误: 猜测超出当前范围 [" << L << ", " << R << "]! 本回合无效。\n";
cout << "\n按任意键重试..."; _getch();
--i; // 重试当前玩家
continue;
}
// --- 判断结果 ---
lastGuess = guess;
lastPlayer = p;
if (guess == ans) {
cout << "\n\n‌**************************************‌\n";
cout << "恭喜玩家 [" << p << "] 猜中了数字 " << ans << "!\n";
cout << "‌**************************************‌\n";
cout << "\n按任意键退出...";
_getch();
return 0;
} else if (guess < ans) {
cout << ">> 猜小了! 新范围: [" << guess + 1 << ", " << R << "]\n";
L = guess + 1;
} else {
cout << ">> 猜大了! 新范围: [" << L << ", " << guess - 1 << "]\n";
R = guess - 1;
}
// --- 魔法牌触发 ---
int chance = 8 - prob;
if (chance < 1) chance = 1;
if (rand() % chance == 0) {
int type = rand() % 6 + 1;
buff = type;
cout << "\n!!! 小猴发动魔法牌 !!!\n";
switch(type) {
case 1:
cout << "[增数] 秘密数字增加了 2~20!\n";
ans += rand() % 19 + 2;
break;
case 2:
cout << "[减数] 秘密数字减少了 2~20!\n";
ans -= rand() % 19 + 2;
break;
case 3: cout << "[跳过] 下一位玩家将被跳过!\n"; break;
case 4: cout << "[自动] 下一位玩家将被强制自动猜测!\n"; break;
case 5: cout << "[抹黑] 下一轮将隐藏上轮信息!\n"; break;
case 6: cout << "[宽松] 下一位玩家享受宽松判定!\n"; break;
}
cout << "\n按任意键继续...";
_getch();
} else {
buff = 0; // 无魔法
}
cout << "\n按任意键进入下一位玩家...";
_getch();
}
}
return 0;
}
禁止抄袭,不喜勿喷


这里空空如也




















有帮助,赞一个