基于c++的mc服务器的玩家列表
玩家信息管理系统代码功能介绍
数据结构定义
player结构体:存储玩家完整信息uuid:玩家唯一标识符name:玩家姓名gift:是否拥有礼物(布尔值)op:玩家类型(如"普通玩家"等)password:玩家密码ban:被封禁次数banlist:封禁原因列表(向量容器)
核心功能模块
1. 数据加载模块
- 从文件
"list"中读取玩家数据 - 按逗号分隔符解析每行数据,处理异常格式
- 自动计算并记录
name、op、password的最大长度(用于格式化显示) - 加载完成后显示统计信息(总玩家数)
2. 玩家列表展示模块
- 格式化显示所有玩家信息,包括:
- 序号(3位数字补零)、UUID、姓名(自动对齐)
- 礼物拥有状态(“是”/“否”)
- 玩家类型(自动对齐)、密码(自动对齐)
- 被封禁次数(2位数字补零)及原因列表(如有)
3. 文件操作模块(A选项)
- 包含两种子功能:
- 白名单管理(w):
- 通过特定格式字符串提取UUID添加新玩家
- 支持更新玩家姓名
- 输入"ok"结束操作
- 密码管理(p):
- 通过"UUID 密码"格式修改指定玩家密码
- 自动更新密码最大长度记录
- 输入"ok"结束操作
- 白名单管理(w):
4. 信息修改模块(B选项)
- 包含三种子功能:
- 封禁设置(b):
- 通过"玩家名 原因"格式增加封禁次数
- 记录封禁原因到
banlist
- 信息查询(u):
- 输入玩家名查询完整信息(含UUID、密码等)
- 类型设置(o):
- 通过"玩家名 类型"格式修改玩家类型
- 自动更新类型最大长度记录
- 输入"q"退出修改模式
- 封禁设置(b):
5. 系统退出模块(C选项)
- 将当前所有玩家数据写入文件
"list"保存 - 数据格式保持逗号分隔的一行一条记录
- 正常退出程序
辅助功能
- 输入缓冲区清理:处理输入错误时重置流状态
- 格式化显示:通过最大长度计算实现字段对齐
- 错误处理:对文件读写、数据解析、输入格式错误进行容错处理
- 清屏与暂停:优化控制台交互体验
上代码!
登录的
#include
#include
#include
using namespace std;
// 添加函数用于清理输入缓冲区
void clearInputBuffer() {
cin.clear(); // 重置流状态
// 清除所有剩余的输入,直到遇到换行符或流结束
cin.ignore(numeric_limits<streamsize>::max(), '
');
}
struct player{
string uuid;
string name;
bool gift;
string op;
string password;
int ban;
vector<string>banlist;
};
vector<player>v;
int maxm=0,maxo=0,maxp=0;
// 将文件声明移到main函数内,以便正确管理生命周期
// ifstream fin("list",ios_base::app);
// ofstream fout("list");
int main(){
// 先只打开输入流读取数据,避免同时打开导致的冲突
ifstream fin("list",ios_base::in);
cout<<"数据载入中";
// 简化但健壮的文件读取循环
while(fin.good()) {
try {
// 读取一整行
string line;
if(!getline(fin, line)) break;
if(line.empty()) continue;
stringstream ss(line);
string uuid,name,op,password,gift_str,ban_str;
// 安全地解析逗号分隔的值
if(!getline(ss,uuid,',')) continue;
if(!getline(ss,name,',')) continue;
if(!getline(ss,gift_str,',')) continue;
if(!getline(ss,op,',')) continue;
if(!getline(ss,password,',')) continue;
if(!getline(ss,ban_str,',')) continue;
// 安全转换
bool gift = (gift_str == "1" || gift_str == "true");
int ban = 0;
try {
ban = stoi(ban_str);
} catch(...) {
ban = 0;
}
// 添加玩家
v.push_back({uuid,name,gift,op,password,ban,{}});
maxm=max(maxm,int(name.size()));
maxo=max(maxo,int(op.size()));
maxp=max(maxp,int(password.size()));
// 读取ban列表
string ban_item;
while(getline(ss,ban_item,',')) {
if(!ban_item.empty()) {
v.back().banlist.push_back(ban_item);
}
}
} catch(...) {
// 忽略任何解析错误,继续处理下一行
continue;
}
}
// 只关闭一次文件
if(fin.is_open()){
fin.close();
}
system("cls");
cout<<"数据载入成功,共载入"<<v.size()<<"个玩家数据"<<endl;
system("pause");
system("cls");
while(1){
cout<<"beacon服务器管理文件,QQ群号:416620025,玩家列表,共"<<v.size()<<"个玩家"<<endl;
cout<<"被ban次数"<<endl;
int cnt=1;
for(auto i:v){
printf("%03d:",cnt);
cnt+=1;
cout<<i.uuid<<" ";
cout<<i.name<<" ";
for(int j=0;j<(maxm-int(i.name.size()));j++){
cout<<" ";
}
if(i.gift){
cout<<"是 ";
}else{
cout<<"否 ";
}
cout<<i.op<<" ";
for(int j=0;j<(maxo-int(i.op.size()));j++){
cout<<" ";
}
cout<<i.password<<" ";
for(int j=0;j<(maxp-int(i.password.size()));j++){
cout<<" ";
}
printf("%02d",i.ban);
if(i.ban>0){
cout<<"被ban原因:";
for(int j=0;j<i.banlist.size();j++){
cout<<j+1<<":"<<i.banlist[j];
}
}
cout<<endl;
}
cout<<"操作:A-文件,B-修改,C-退出"<<endl;
char a;
// 检查输入流状态
if(!(cin>>a)) {
cout<<"输入错误,请输入 A、B 或 C:";
clearInputBuffer();
system("pause");
system("cls");
continue;
}
if(a=='A'){
cout<<endl<<" 文件:w-白名单,p-密码";
char d;
// 检查输入流状态
if(d=='w'){
string c;
string last;
while(1){
// 首先检查输入流状态
if(!cin.good()) {
clearInputBuffer();
cout<<"输入流错误,已重置"<<endl;
system("pause");
continue;
}
// 只在需要时忽略换行符
if(cin.peek() == '
') {
cin.ignore();
}
// 检查getline是否成功
if(!getline(cin,c)) {
clearInputBuffer();
cout<<"读取输入失败,请重试"<<endl;
system("pause");
continue;
}
if(c=="ok"){
break;
}
// 更严格的输入验证
if(c.empty() || c.size()<10){
continue;
}
if(c.size() >= 18 && c.substr(5,4)=="uuid"){
string search_uuid=c.substr(13,36);
bool flag=1;
for(auto i:v){
if(i.uuid==search_uuid){
flag=0;
}
}
if(flag){
v.push_back({search_uuid,"",0,"普通玩家","",0,{}});
cout<<"添加新玩家,UUID: "<<search_uuid<<endl;
}
maxo=max(maxo,5);
last=search_uuid;
}else if(c.size() >= 18 && c.substr(5,4)=="name"){
string e="";
try {
for(int i=13;i<c.size()-1 && i < c.size();i++){
e+=c[i];
}
} catch(...) {
e = "";
}
bool flag=1;
for(auto &i:v){
if(i.uuid==last){
i.name=e;
flag=0;
cout<<"更新玩家姓名为: "<<e<<endl;
}
}
if(flag){
cout<<"未找到uuid为"<<last<<"的玩家"<<endl;
}
maxm=max(maxm,int(e.size()));
}
}
}else if(d=='p'){
string c,pwd;
// 只忽略换行符,避免跳过第一个字符
while(1){
// 首先检查输入流是否正常
if(!cin.good()) {
clearInputBuffer();
continue;
}
cin>>c;
if(c=="ok"){
break;
}
c=c.substr(0,36);
// 检查是否还有第二个输入项
if(cin.peek() == '
') {
// 如果只输入了一个词,跳过并提示
cin.ignore();
cout<<"请输入正确的格式:UUID 密码"<<endl;
continue;
}
cin>>pwd;
// 查找指定UUID的玩家
string search_uuid=c;
bool found=false;
for(int p=0;p<v.size();p++){
if(v[p].uuid==search_uuid){
v[p].password=pwd;
maxp=max(maxp,int(pwd.size()));
cout<<"找到玩家,玩家姓名为:"<<v[p].name<<endl;
found=true;
break;
}
}
if(!found){
cout<<"未找到uuid为"<<search_uuid<<"的玩家"<<endl;
}
}
clearInputBuffer();
}
}else if(a=='B'){
cout<<endl<<"修改:b-ban设置,u-玩家密码查询数据,o-玩家类型设置,q-退出修改";
string c;
// 只在需要时忽略换行符
if(cin.peek() == '
') {
cin.ignore();
}
getline(cin,c);
if(c=="q"){
// 直接返回主菜单
continue;
}
if(c=="b"){
cout<<endl<<"玩家 原因";
string d,e;
bool found = false;
// 检查输入流状态
if(!(cin>>d>>e)) {
cout<<"输入错误,请输入正确的格式:玩家名 原因"<<endl;
clearInputBuffer();
system("pause");
continue;
}
for(int i=0;i<v.size();i++){
if(v[i].name==d){
v[i].ban+=1;
v[i].banlist.push_back(e);
found = true;
break;
}
}
// 如果未找到玩家,给出提示
if(!found) {
cout<<"未找到玩家:"<<d<<endl;
system("pause");
}
}else if(c=="u"){
cout<<endl<<"玩家";
string d;
cin>>d;
for(auto i:v){
if(i.name==d){
cout<<i.uuid<<" ";
cout<<i.name<<" ";
for(int j=0;j<(maxm-int(i.name.size()));j++){
cout<<" ";
}
if(i.gift){
cout<<"是 ";
}else{
cout<<"否 ";
}
cout<<i.op<<" ";
for(int j=0;j<(maxo-int(i.op.size()));j++){
cout<<" ";
}
cout<<i.password<<" ";
for(int j=0;j<(maxp-int(i.password.size()));j++){
cout<<" ";
}
printf("%02d",i.ban);
if(i.ban>0){
cout<<"被ban原因:";
for(int j=0;j<i.banlist.size();j++){
cout<<j<<":"<<i.banlist[j];
}
}
cout<<endl;
break;
}
}
}else if(c=="o"){
cout<<endl<<"玩家 类型";
string d,e;
bool foundOp = false; // 初始化变量
// 检查输入流状态
if(!(cin>>d>>e)) {
cout<<"输入错误,请输入正确的格式:玩家名 类型"<<endl;
clearInputBuffer();
system("pause");
continue;
}
for(int i=0;i<v.size();i++){
if(v[i].name==d){
v[i].op=e;
maxo=max(maxo,int(e.size())); // 更新maxo值
foundOp = true;
break;
}
}
if(!foundOp){
cout<<"未找到玩家: "<<d<<endl;
// 暂停以便用户查看
system("pause");
}
}
// 只在需要时忽略换行符
if(cin.peek() == '
') {
cin.ignore();
}
}else if(a=='C'){
// 以写入模式打开文件进行保存
ofstream foutNew("list",ios_base::out);
if(foutNew.is_open()){
for(auto i:v){
foutNew<<i.uuid<<","<<i.name<<","<<i.gift<<","<<i.op<<","<<i.password<<","<<i.ban<<",";
for(int j=0;j<i.banlist.size();j++){
foutNew<<i.banlist[j];
if(j!=i.banlist.size()-1){
foutNew<<",";
}
}
foutNew<<endl;
}
foutNew.close(); // 关闭文件
}
exit(0);
}
// 确保每次循环结束前重置输入流状态
if(!cin.good()) {
clearInputBuffer();
}
system("cls");
}
return 0;
}
未登录的
#include
#include
#include
using namespace std;
void clearInputBuffer() {
cin.clear();
cin.ignore(numeric_limits::max(), ‘
’);
}
struct player{
string uuid;
string name;
bool gift;
string op;
string password;
int ban;
vectorbanlist;
};
vectorv;
int maxm=0,maxo=0,maxp=0;
int main(){
ifstream fin(“list”,ios_base::in);
cout<<“数据载入中”;
while(fin.good()) {
try {
string line;
if(!getline(fin, line)) break;
if(line.empty()) continue;
stringstream ss(line);
string uuid,name,op,password,gift_str,ban_str;
if(!getline(ss,uuid,',')) continue;
if(!getline(ss,name,',')) continue;
if(!getline(ss,gift_str,',')) continue;
if(!getline(ss,op,',')) continue;
if(!getline(ss,password,',')) continue;
if(!getline(ss,ban_str,',')) continue;
bool gift = (gift_str == "1" || gift_str == "true");
int ban = 0;
try {
ban = stoi(ban_str);
} catch(...) {
ban = 0;
}
v.push_back({uuid,name,gift,op,password,ban,{}});
maxm=max(maxm,int(name.size()));
maxo=max(maxo,int(op.size()));
maxp=max(maxp,int(password.size()));
string ban_item;
while(getline(ss,ban_item,',')) {
if(!ban_item.empty()) {
v.back().banlist.push_back(ban_item);
}
}
} catch(...) {
continue;
}
}
if(fin.is_open()){
fin.close();
}
system("cls");
cout<<"数据载入成功,共载入"<0){
cout<<"被ban原因:";
for(int j=0;j>a)) {
cout<<"输入错误,请输入 A、B 或 C:";
clearInputBuffer();
system("pause");
system("cls");
continue;
}
if(a=='A'){
cout<= 18 && c.substr(5,4)=="uuid"){
string search_uuid=c.substr(13,36);
bool flag=1;
for(auto i:v){
if(i.uuid==search_uuid){
flag=0;
}
}
if(flag){
v.push_back({search_uuid,"",0,"普通玩家","",0,{}});
cout<<"添加新玩家,UUID: "<= 18 && c.substr(5,4)=="name"){
string e="";
try {
for(int i=13;i>c;
if(c=="ok"){
break;
}
c=c.substr(0,36);
if(cin.peek() == '
') {
cin.ignore();
cout<<"请输入正确的格式:UUID 密码"<>pwd;
string search_uuid=c;
bool found=false;
for(int p=0;p>d>>e)) {
cout<<"输入错误,请输入正确的格式:玩家名 原因"<>d;
for(auto i:v){
if(i.name==d){
cout<0){
cout<<"被ban原因:";
for(int j=0;j>d>>e)) {
cout<<"输入错误,请输入正确的格式:玩家名 类型"<
}
写这么多给个赞或关注不过分吧










