1. 程序介绍
打字游戏是一种常见的趣味游戏,玩家需要在规定时间内尽可能多地输入文字。但是,通常情况下游戏仅仅提供了最终分数,而没有对最高分数的玩家进行展示。本文介绍的C++程序可以在游戏结束之后,延迟一定时间之后找到获胜的玩家并进行展示。
2. 程序实现流程
程序的实现流程如下:
2.1 用户输入数据
首先,程序需要用户输入玩家的得分和名称。在每次输入时,程序将会检查输入的数据是否合法,例如得分是否为非负整数,名称是否合法等。如果输入数据不合法,程序会提示用户重新输入。
int score;
std::string name;
do {
std::cout << "Please enter the player's name: ";
std::getline(std::cin, name);
std::cout << "Please enter the player's score: ";
std::cin >> score;
if (score < 0) {
std::cout << "Error: the score must be a non-negative integer." << std::endl;
continue;
}
if (!isValidName(name)) {
std::cout << "Error: the name must contain only alphabetic characters and be no longer than 20 characters." << std::endl;
continue;
}
break;
} while (true);
2.2 数据存储
程序会将输入的数据存储在一个动态数组中,方便后续的处理。
std::vector<std::pair<std::string, int>> players;
players.push_back(std::make_pair(name, score));
2.3 计算获胜者
当用户输入完所有的数据之后,程序需要计算出获胜者的信息。获胜者是指得分最高的玩家。程序首先找到得分最高的玩家,然后将该玩家的名称和得分保存在一个变量中。
std::string winner = "";
int maxScore = -1;
for (size_t i = 0; i < players.size(); i++) {
if (players[i].second > maxScore) {
maxScore = players[i].second;
winner = players[i].first;
}
}
2.4 展示获胜者
计算出获胜者之后,程序需要延迟一定的时间,然后展示获胜者的信息。在展示获胜者的信息时,程序会使用ASCII码艺术进行美化。
sleep(DELAY_SECONDS);
std::cout << R"(
_____ __ __ ______ ________ _____ _ _ _____
/ ____| /\ | \/ | ____/\ / / ____| __ \ | \ | |/ ____|
| | / \ | \ / | |__ / \_/ /| |__ | |__) |______ | \| | (___
| | / /\ \ | |\/| | __/ /\ / | __| | _ //______|| . ` |\___ \
| |___ / ____ \| | | | | / ____ \ | |____| | \ \ | |\ |____) |
\_____/_/ \_\_| |_|_|/_/ \_\|______|_| \_\ |_| \_|_____/
)" << std::endl;
std::cout << "The winner is: " << std::endl;
std::cout << "Name: " << winner << std::endl;
std::cout << "Score: " << maxScore << std::endl;
3. 程序优化
在上述程序实现的基础上,我们可以进一步进行优化,使得程序更加高效。以下是一些优化方法的介绍:
3.1 使用map进行数据存储
在数据存储的过程中,我们可以使用STL中的map数据结构,以玩家名称为键,玩家得分为值,这样可以更加方便地进行数据查找和操作。
std::map<std::string, int> players;
players.insert(std::make_pair(name, score));
3.2 建立索引
对于多次需要查找最高得分的情况,我们可以建立一个索引,保存当前最高得分的玩家信息。当新的数据进入时,只需要与当前最高得分的玩家比较即可。
std::string winner = "";
int maxScore = -1;
for (const auto& player : players) {
if (player.second > maxScore) {
maxScore = player.second;
winner = player.first;
}
}
3.3 多线程实现
当用户输入数据时,程序可以使用多线程进行处理,这样可以提高程序的响应速度。
std::vector<std::pair<std::string, int>> players;
std::mutex mutex;
std::condition_variable cond;
bool finished = false;
std::thread inputThread([&players, &mutex, &cond, &finished]() {
while (!finished) {
int score;
std::string name;
do {
std::cout << "Please enter the player's name: " << std::endl;
std::getline(std::cin, name);
std::cout << "Please enter the player's score: " << std::endl;
std::cin >> score;
if (score < 0) {
std::cout << "Error: the score must be a non-negative integer." << std::endl;
continue;
}
if (!isValidName(name)) {
std::cout << "Error: the name must contain only alphabetic characters and be no longer than 20 characters." << std::endl;
continue;
}
break;
} while (true);
std::lock_guard<std::mutex> guard(mutex);
players.push_back(std::make_pair(name, score));
cond.notify_all();
}
});
std::thread computeThread([&players, &mutex, &cond, &finished, &winner, &maxScore]() {
while (!finished) {
std::unique_lock<std::mutex> lock(mutex);
while (players.empty()) {
cond.wait(lock);
}
for (const auto& player : players) {
if (player.second > maxScore) {
maxScore = player.second;
winner = player.first;
}
}
lock.unlock();
sleep(DELAY_SECONDS);
std::cout << R"(
_____ __ __ ______ ________ _____ _ _ _____
/ ____| /\ | \/ | ____/\ / / ____| __ \ | \ | |/ ____|
| | / \ | \ / | |__ / \_/ /| |__ | |__) |______ | \| | (___
| | / /\ \ | |\/| | __/ /\ / | __| | _ //______|| . ` |\___ \
| |___ / ____ \| | | | | / ____ \ | |____| | \ \ | |\ |____) |
\_____/_/ \_\_| |_|_|/_/ \_\|______|_| \_\ |_| \_|_____/
)" << std::endl;
std::cout << "The winner is: " << std::endl;
std::cout << "Name: " << winner << std::endl;
std::cout << "Score: " << maxScore << std::endl;
finished = true;
}
});
inputThread.join();
computeThread.join();
4. 结语
本文介绍了一个C++程序,用于在延迟时间后找到打字游戏的获胜者。可以使用上述优化方法来提高程序的响应速度和效率。