用c++语言设计一款猜数字游戏 1. 要求: 该游戏可以由程序随机产生一个N位数字,或由用户输入一个N位数字,作为待猜测数字(各位数字不重复出现)。玩游戏者开始猜测后,可以有M次机会输入数字来匹配上面的待猜测数字。用户每输入一次,系统给出本次猜测结果:A表示位置正确且数字正确,B表示数字正确而位置不正确。某次猜中后,游戏结束。若M次机会用完,游戏也结束。菜单格式如图。 2. 基本功能 1)产生待猜测数据,随机生成,或由用户输入。需要判断合法性:N位数字不重复出现。 2)提供最多M次机会猜测,每次反馈猜测结果。成功立即结束猜测返回主菜单。 3)游戏开始前输入用户名,初次使用进行用户注册。游戏成功与否都能返回主菜单。 4)查看结果:查看某一个用户的历史猜测结果,最少猜测次数,成功率; 5)参数M,N可以自由设置 3. 拓展功能: 记录不同的游戏用户的猜测结果,设置猜测排行榜,设置游戏难度等等其它自定义拓展功能
时间: 2024-03-10 13:45:54 浏览: 181
以下是使用C++设计的猜数字游戏的代码,包括基本功能和拓展功能:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
// 游戏参数设置
const int MAX_CHANCE = 10; // 最多猜测次数
const int MAX_N = 10; // 最大位数
const int MIN_N = 1; // 最小位数
const int MAX_M = 20; // 最大机会数
const int MIN_M = 1; // 最小机会数
// 猜测结果
struct GuessResult {
int A; // 位置和数字都正确的数量
int B; // 数字正确但位置不正确的数量
};
// 玩家信息
struct PlayerInfo {
string name;
int guessCount; // 猜测次数
bool win; // 是否猜中
};
// 生成随机数
string generateNumber(int n) {
string number;
for (int i = 0; i < n; i++) {
char digit = i == 0 ? rand() % 9 + '1' : rand() % 10 + '0';
while (number.find(digit) != string::npos) {
digit = rand() % 10 + '0';
}
number += digit;
}
return number;
}
// 获取猜测结果
GuessResult getGuessResult(const string& secret, const string& guess) {
GuessResult result = { 0, 0 };
for (int i = 0; i < secret.size(); i++) {
if (secret[i] == guess[i]) {
result.A++;
} else if (secret.find(guess[i]) != string::npos) {
result.B++;
}
}
return result;
}
// 游戏界面
void showMenu() {
cout << "1. 开始新游戏" << endl;
cout << "2. 查看历史记录" << endl;
cout << "3. 退出游戏" << endl;
cout << "请选择:";
}
// 开始新游戏
void playGame(vector<PlayerInfo>& players) {
// 输入用户名
string name;
cout << "请输入用户名:";
cin >> name;
// 查找玩家信息
vector<PlayerInfo>::iterator it = find_if(players.begin(), players.end(),
[name](const PlayerInfo& p) {
return p.name == name;
}
);
if (it == players.end()) {
// 创建新玩家信息
players.push_back({ name, 0, false });
it = players.end() - 1;
}
// 输入位数
int n;
cout << "请输入位数(" << MIN_N << " - " << MAX_N << "):";
cin >> n;
while (n < MIN_N || n > MAX_N) {
cout << "位数超出范围,请重新输入(" << MIN_N << " - " << MAX_N << "):";
cin >> n;
}
// 输入机会数
int m;
cout << "请输入机会数(" << MIN_M << " - " << MAX_M << "):";
cin >> m;
while (m < MIN_M || m > MAX_M) {
cout << "机会数超出范围,请重新输入(" << MIN_M << " - " << MAX_M << "):";
cin >> m;
}
// 生成或输入待猜数字
string secret;
char choice;
cout << "是否由程序随机生成待猜数字?(Y/N):";
cin >> choice;
if (choice == 'Y' || choice == 'y') {
secret = generateNumber(n);
} else {
cout << "请输入待猜数字:";
cin >> secret;
while (secret.size() != n || count(secret.begin(), secret.end(), '-') > 0) {
cout << "数字格式错误,请重新输入(" << n << " 位数字,各位数字不重复出现):";
cin >> secret;
}
}
// 开始猜数字
cout << "开始猜数字,共 " << m << " 次机会:" << endl;
for (int i = 1; i <= m; i++) {
string guess;
cout << "第 " << i << " 次猜测:";
cin >> guess;
while (guess.size() != n || count(guess.begin(), guess.end(), '-') > 0) {
cout << "数字格式错误,请重新输入(" << n << " 位数字,各位数字不重复出现):";
cin >> guess;
}
GuessResult result = getGuessResult(secret, guess);
cout << "结果:" << result.A << "A" << result.B << "B" << endl;
if (result.A == n) {
// 猜中了
cout << "恭喜你,猜中了!" << endl;
it->guessCount += i;
it->win = true;
return;
}
}
// 未猜中
cout << "很遗憾,游戏结束!正确数字是:" << secret << endl;
}
// 查看历史记录
void showRecords(const vector<PlayerInfo>& players) {
if (players.empty()) {
cout << "暂无历史记录!" << endl;
return;
}
// 按猜测次数排序
vector<PlayerInfo> sortedPlayers = players;
sort(sortedPlayers.begin(), sortedPlayers.end(),
[](const PlayerInfo& p1, const PlayerInfo& p2) {
return p1.guessCount < p2.guessCount;
}
);
cout << "用户名\t\t猜测次数\t成功率" << endl;
for (const PlayerInfo& p : sortedPlayers) {
double winRate = p.win ? 100.0 : 0.0;
if (p.guessCount > 0) {
winRate = 1.0 * count_if(sortedPlayers.begin(), sortedPlayers.end(),
[](const PlayerInfo& p) {
return p.win;
}
) / sortedPlayers.size() * 100;
}
printf("%-16s\t%-12d\t%.2f%%\n", p.name.c_str(), p.guessCount, winRate);
}
}
int main() {
srand(static_cast<unsigned int>(time(nullptr)));
// 玩家信息
vector<PlayerInfo> players;
// 主菜单
while (true) {
showMenu();
int choice;
cin >> choice;
switch (choice) {
case 1:
playGame(players);
break;
case 2:
showRecords(players);
break;
case 3:
return 0;
default:
cout << "无效选项,请重新选择!" << endl;
break;
}
}
return 0;
}
```
该程序包括以下功能:
1. 用户输入用户名,并根据输入的位数和机会数生成或输入待猜数字;
2. 用户最多可以猜测 M 次,每次输入一个 N 位数字,系统给出本次猜测结果;
3. 游戏结束时,会记录玩家的猜测次数和是否猜中,保存在玩家信息中;
4. 用户可以查看历史记录,包括不同玩家的猜测次数、成功率等信息。
阅读全文