C++ 游戏机排队系统实现:高效管理游戏玩家队列
本文将介绍如何使用 C++ 实现一个游戏机排队系统,用于管理玩家在游戏机前的排队情况。
问题描述
一个游戏厅只有一台游戏机,每次最多只能容纳两个人同时玩游戏。然而,来玩游戏的人数往往不止两个,因此需要一个排队系统来管理玩家的顺序。
在整个过程中,可能发生的事件有以下几种:
- start: 一局游戏开始。若不是第一局游戏,则上一局的参与者按照原本的顺序回到队尾。此时,程序应输出这一局上场的人的名字,以空格分隔。若这一局无人上场,则输出
Error并忽略此事件。 - arrive x: 玩家
x抵达游戏厅并加入队尾。此时,x不应该在排队,否则输出Error并忽略此事件。若该事件成功执行,则输出OK。 - leave x: 玩家
x离开游戏厅并离开队列。此时,x应该在排队,但不能正在玩游戏,否则输出Error并忽略此事件。若该事件成功执行,则输出OK。
C++ 代码实现
#include <iostream>
#include <queue>
#include <unordered_set>
using namespace std;
int main() {
queue<string> players; // 维护排队玩家队列
unordered_set<string> playing; // 维护正在游玩玩家集合
string event;
while (cin >> event) {
if (event == "start") {
if (playing.empty()) {
cout << "Error" << endl;
continue;
}
while (playing.size() < 2 && !players.empty()) {
string player = players.front();
players.pop();
playing.insert(player);
}
for (const string& player : playing) {
cout << player << " ";
}
cout << endl;
} else if (event == "arrive") {
string player;
cin >> player;
if (playing.count(player) || players.size() >= 2) {
cout << "Error" << endl;
continue;
}
players.push(player);
cout << "OK" << endl;
} else if (event == "leave") {
string player;
cin >> player;
if (!players.empty() && players.front() == player) {
players.pop();
} else if (playing.count(player)) {
playing.erase(player);
} else {
cout << "Error" << endl;
continue;
}
cout << "OK" << endl;
}
}
return 0;
}
代码解释
- 程序使用
queue数据结构来维护游戏机前的排队玩家,使用unordered_set数据结构来维护正在游玩玩家的集合。 - 对于每个事件,程序会根据要求进行相应的操作,并根据结果输出相应的信息。
start事件:- 若当前没有玩家正在玩游戏,则输出
Error并忽略此事件。 - 否则,将排队玩家队列中前两个玩家(或仅有的一个玩家)加入到
playing集合中,并输出他们的名字。
- 若当前没有玩家正在玩游戏,则输出
arrive x事件:- 若玩家
x正在玩游戏或排队玩家队列中已经有两个人,则输出Error并忽略此事件。 - 否则,将玩家
x加入到排队玩家队列尾部,并输出OK。
- 若玩家
leave x事件:- 若玩家
x是排队玩家队列中的第一个,则将其从队列中移除。 - 若玩家
x正在玩游戏,则将其从playing集合中移除。 - 若玩家
x既不在排队队列中也不在playing集合中,则输出Error并忽略此事件。 - 否则,输出
OK。
- 若玩家
总结
本文介绍了如何使用 C++ 实现一个游戏机排队系统,有效管理玩家排队和游戏状态。通过使用队列和集合数据结构,程序能够高效地处理不同事件类型,并根据要求输出相应的信息。
原文地址: https://www.cveoy.top/t/topic/qinG 著作权归作者所有。请勿转载和采集!