【狼人杀】(转载H.N. Magnolia_tree)

#include<bits/stdc++.h>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<windows.h>
using namespace std;
struct IDname {
int geshu;
string NAME;
};
IDname jue_se[100];
struct ID {
int num;
bool life;
string name;
int know;
int how;
};
ID player[21];
int n,MY,kill1,kill2;
char a;
bool jieyao=1,duyao=1;
int lieren,shouwei=0;
void init1() {
jue_se[1].NAME="村民 ";
jue_se[2].NAME="狼人 ";
jue_se[3].NAME="女巫 ";
jue_se[4].NAME="预言家 ";
jue_se[5].NAME="猎人 ";
jue_se[6].NAME="守卫 ";
}
void init2(int nn) {
switch(nn) {
case 6:
jue_se[1].geshu=3;
jue_se[2].geshu=2;
jue_se[3].geshu=1;
jue_se[4].geshu=0;
jue_se[5].geshu=0;
jue_se[6].geshu=0;
break;
case 7:
jue_se[1].geshu=3;
jue_se[2].geshu=2;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=0;
jue_se[6].geshu=0;
break;
case 8:
jue_se[1].geshu=3;
jue_se[2].geshu=3;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=0;
jue_se[6].geshu=0;
break;
case 9:
jue_se[1].geshu=3;
jue_se[2].geshu=3;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=1;
jue_se[6].geshu=0;
break;
case 10:
jue_se[1].geshu=4;
jue_se[2].geshu=3;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=1;
jue_se[6].geshu=0;
break;
case 11:
jue_se[1].geshu=4;
jue_se[2].geshu=4;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=1;
jue_se[6].geshu=0;
break;
case 12:
jue_se[1].geshu=4;
jue_se[2].geshu=4;
jue_se[3].geshu=1;
jue_se[4].geshu=1;
jue_se[5].geshu=1;
jue_se[6].geshu=1;
break;
default:
cout<<"输入错误,再见"<<endl;
exit(0);
break;
}
}
int van[10]= {7,4,6,43,35,1,2,8,20,19};
void init3(int nn) {
srand(time(0));
Sleep(rand()%44);
int x=10000;
int t=rand();
srand(time(NULL));
int y=van[(rand()%100*van[rand()%10]+t)%10];
if(nn<=6)
x=abs(x*6/y)%3+1;
else if(nn<=8)
x=abs(x*7/y)%4+1;
else if(nn<=11)
x=abs(x*8/y)%5+1;
else if(nn<=14)
x=abs(x*9/y)%6+1;
do {
if(nn<=6)
x=x%3+1;
else if(nn<=8)
x=x%4+1;
else if(nn<=11)
x=x%5+1;
else if(nn<=14)
x=x%6+1;
if(jue_se[x].geshu>0) {
player[nn].name=jue_se[x].NAME;
if(player[nn].name=="猎人 ")
lieren=nn;
if(player[nn].name=="守卫 ")
shouwei=nn;
player[nn].life=1;
player[nn].num=nn;
player[nn].know=0;
jue_se[x].geshu--;
player[nn].how=0;
break;
}
} while(jue_se[x].geshu==0);
}
void printhhh() {
int cm=0;
int sz=0;
for(int i=1; i<=n; i++) {
if(player[i].life==0)
continue;
else if(player[i].name=="村民 ")
cm++;
else if(player[i].name=="女巫 "||player[i].name=="预言家 "||player[i].name=="猎人 "||player[i].name=="守卫 ")
sz++;
}
if(sz==0||cm==0)
cout<<"狼人阵营胜利"<<endl;
else
cout<<"好人阵营胜利"<<endl;
for(int i=1; i<=n; i++) {
cout<<left<<setw(3)<<player[i].num<<": "<<player[i].name<<" ";
if(player[i].life==0)
cout<<"死亡"<<"\t";
else
cout<<"存活"<<"\t";
if(player[i].how==0)
cout<<"最终存活 "<<endl;
else if(player[i].how==1)
cout<<"最终被狼人杀死"<<endl;
else if(player[i].how==2)
cout<<"最终被投票投死"<<endl;
else if(player[i].how==3)
cout<<"最终被女巫毒死"<<endl;
else if(player[i].how==4)
cout<<"最终被猎人射杀"<<endl;
}
system("pause");
system("pause");
system("pause");
}
void print(int day,int ti) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY);
else
SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<"\t\t\t\t第"<<day<<"天 ";
if(ti==0)
cout<<"白天"<<endl;
else
cout<<"夜晚"<<endl;
cout<<"我的位置:"<<MY<<"号"<<endl;
for(int i=1; i<=6; i++) {
cout<<player[i].num<<"号位 ";
}
cout<<endl;
for(int i=1; i<=6; i++) {
if(player[i].life==1) {
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY | FOREGROUND_GREEN);
else
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout<<"存活  ";
} else {
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY | FOREGROUND_RED);
else
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);
cout<<"已死亡";
}
}
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY);
else
SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<endl;
for(int i=1; i<=6; i++) {
if(player[i].know==0)
cout<<" 未知  ";
else if(player[i].know==1) {
if(player[i].name==" 狼人 ")
cout<<" 狼人  ";
else
cout<<" 好人  ";
} else if(player[i].know==2)
cout<<player[i].name<<" ";
}
cout<<endl<<endl;
for(int i=7; i<=n; i++) {
if(i<10)
cout<<player[i].num<<"号位 ";
else
cout<<player[i].num<<"号位 ";
}
cout<<endl;
for(int i=7; i<=n; i++) {
if(player[i].life==1) {
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY | FOREGROUND_GREEN);
else
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
cout<<" 存活  ";
} else {
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY | FOREGROUND_RED);
else
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);
cout<<" 已死亡";
}
}
if(ti==0)
SetConsoleTextAttribute(handle,BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE|FOREGROUND_INTENSITY);
else
SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<endl;
for(int i=7; i<=n; i++) {
if(player[i].know==0)
cout<<"未知  ";
else if(player[i].know==1) {
if(player[i].name=="狼人  ")
cout<<"狼人  ";
else
cout<<"好人  ";
} else if(player[i].know==2)
cout<<player[i].name<<" ";
}
cout<<endl<<endl;
}
int shou=0;
void shoushui(int hhh,int hhhh) {
int x;
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"守~卫~请~睁~眼~~~"<<endl;
Sleep(3000);
system("cls");
print(hhh,hhhh);
if(MY==shouwei&&player[MY].life==1) {
cout<<"请问你要守护谁?"<<endl<<"输入:";
cin>>x;
while(x==shou||x<1||x>n||player[x].life==0) {
cout<<"输入错误,请重新输入"<<endl<<"输入:";
cin>>x;
}
shou=x;
} else if(player[shouwei].life==1) {
cout<<"请问你要守护谁?"<<endl;
Sleep(rand()%98);
srand(time(0));
x=rand()%n+1;
while(x==shou||player[x].life==0) {
Sleep(rand()%98);
srand(time(0));
x=rand()%n+1;
}
shou=x;
} else {
cout<<"请问你要守护谁?"<<endl;
Sleep(3000);
shou=-1;
}
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"守~卫~请~闭~眼~~~"<<endl;
}
struct tou {
int xxx;
int num;
int toupiaoquan;
};
tou TOU[13];
bool cmp(tou x,tou y) {
if(x.xxx==y.xxx)
return x.num<y.num;
return x.xxx>y.xxx;
}
bool cmp1(tou x,tou y) {
return x.num<y.num;
}
void toupiao(int ddd,int nnn) {
//--------1--------
int x;
Sleep(2000);
system("cls");
print(ddd,nnn);
cout<<"现在大家请投票";
for(int i=1; i<=3; i++) {
cout<<".";
Sleep(500);
}
cout<<endl;
for(int i=1; i<=n; i++) {
TOU[i].num=i;
TOU[i].toupiaoquan=1;
TOU[i].xxx=0;
}
for(int i=1; i<=n; i++) {
if(player[i].life==1) {
Sleep(3000);
if(i==MY) {
cout<<"请投票...(0弃权)"<<endl;
cin>>x;
while(player[x].life==0&&x!=0) {
cin>>x;
}
if(x==0)
cout<<MY<<"号玩家弃权"<<endl;
else
cout<<MY<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
srand(time(0));
if(player[i].name=="狼人 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name=="狼人 "||x==i)) {
Sleep(rand()%98);
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else if(player[i].name=="预言家 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name!="狼人 "||x==i)) {
Sleep(rand()%98);
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||x==i)) {
Sleep(rand()%98);
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
}
}
if(x!=0)
TOU[x].xxx++;
}
}
Sleep(3000);
sort(TOU+1,TOU+n+1,cmp);
if(TOU[2].xxx!=TOU[1].xxx) {
cout<<"投票结束,"<<TOU[1].num<<"号投票出局"<<endl;
player[TOU[1].num].life=0;
player[TOU[1].num].how=2;
Sleep(3000);
return;
} else {
TOU[1].toupiaoquan=0;
TOU[2].toupiaoquan=0;
system("cls");
print(ddd,nnn);
cout<<TOU[1].num<<"号,"<<TOU[2].num<<"号";
int i;
for(i=3; i<=n; i++) {
if(TOU[i].xxx==TOU[1].xxx) {
TOU[i].toupiaoquan=0;
cout<<","<<TOU[i].num<<"号";
} else
break;
}
if(i==n+1) {
for(int i=1; i<=n; i++)
TOU[i].toupiaoquan=1;
}
cout<<"平票"<<endl;
}
//--------2--------
sort(TOU+1,TOU+n+1,cmp1);
cout<<"请再次投票";
for(int i=1; i<=3; i++) {
cout<<".";
Sleep(500);
}
cout<<endl;
for(int i=1; i<=n; i++) {
if(player[i].life==1&&TOU[i].toupiaoquan==1) {
Sleep(3000);
if(i==MY) {
cout<<"请投票...(0弃权)"<<endl;
cin>>x;
while((player[x].life==0||TOU[x].toupiaoquan==1)&&x!=0) {
cin>>x;
}
if(x==0)
cout<<MY<<"号玩家弃权"<<endl;
else
cout<<MY<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
srand(time(0));
if(player[i].name=="狼人 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name=="狼人 "||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else if(player[i].name=="预言家 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name!="狼人 "||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
}
}
if(x!=0&&TOU[i].toupiaoquan==1)
TOU[x].xxx++;
}
}
Sleep(3000);
sort(TOU+1,TOU+n+1,cmp);
if(TOU[2].xxx!=TOU[1].xxx) {
cout<<"投票结束,"<<TOU[1].num<<"号投票出局"<<endl;
player[TOU[1].num].life=0;
player[TOU[1].num].how=2;
Sleep(3000);
return;
} else {
TOU[1].toupiaoquan=0;
TOU[2].toupiaoquan=0;
system("cls");
print(ddd,nnn);
cout<<TOU[1].num<<"号,"<<TOU[2].num<<"号";
int i;
for(i=3; i<=n; i++) {
if(TOU[i].xxx==TOU[1].xxx) {
TOU[i].toupiaoquan=0;
cout<<","<<TOU[i].num<<"号";
} else
break;
}
if(i==n+1) {
for(int i=1; i<=n; i++)
TOU[i].toupiaoquan=1;
}
cout<<"平票"<<endl;
}
//--------3--------
sort(TOU+1,TOU+n+1,cmp1);
cout<<"请再次投票";
for(int i=1; i<=3; i++) {
cout<<".";
Sleep(500);
}
cout<<endl;
for(int i=1; i<=n; i++) {
if(player[i].life==1&&TOU[i].toupiaoquan==1) {
Sleep(3000);
if(i==MY) {
cout<<"请投票...(0弃权)"<<endl;
cin>>x;
while((player[x].life==0||TOU[x].toupiaoquan==1)&&x!=0) {
cin>>x;
}
if(x==0)
cout<<MY<<"号玩家弃权"<<endl;
else
cout<<MY<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
srand(time(0));
if(player[i].name=="狼人 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name=="狼人 "||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else if(player[i].name=="预言家 "||player[i].name=="猎人 ") {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||player[x].name!="狼人 "||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
} else {
x=rand()%(n+1);
while(x!=0&&(player[x].life==0||x==i||TOU[x].toupiaoquan==1)) {
srand(time(0));
x=rand()%(n+1);
}
if(x==0)
cout<<i<<"号玩家弃权"<<endl;
else
cout<<i<<"号玩家投给了"<<x<<"号玩家"<<endl;
}
}
if(x!=0&&TOU[i].toupiaoquan==1)
TOU[x].xxx++;
}
}
Sleep(3000);
sort(TOU+1,TOU+n+1,cmp);
if(TOU[2].xxx!=TOU[1].xxx) {
cout<<"投票结束,"<<TOU[1].num<<"号投票出局"<<endl;
player[TOU[1].num].life=0;
player[TOU[1].num].how=2;
} else {
cout<<"投票结束,无人出局"<<endl;
}
Sleep(5000);
}
bool game_over() {
int pingmin=0;
int langren=0;
int shenzhi=0;
for(int i=1; i<=n; i++) {
if(player[i].life==0)
continue;
if(player[i].name=="狼人 ")
langren++;
else if(player[i].name=="村民 ")
pingmin++;
else if(player[i].name=="女巫 "||player[i].name=="预言家 "||player[i].name=="猎人 ")
shenzhi++;
}
if(shenzhi==0||langren==0||pingmin==0)
return 1;
return 0;
}
void night() {
system("cls");
system("color 0f");
print(1,1);
cout<<"天~黑~请~闭~眼~~~"<<endl;
if(n>=12)
shoushui(1,1);
Sleep(3000);
system("cls");
print(1,1);
cout<<"狼~人~请~睁~眼~~~"<<endl;
if(player[MY].name=="狼人 ") {
Sleep(1000);
cout<<"你的同伴有:";
for(int i=1; i<=n; i++) {
if(i==MY)
continue;
if(player[i].name=="狼人 ") {
cout<<player[i].num<<"号 ";
player[i].know=2;
}
}
Sleep(3000);
cout<<endl<<"请问你们要杀谁:"<<endl<<"输入:";
cin>>kill1;
Sleep(1500);
system("cls");
print(1,1);
cout<<"今晚你们要杀的是"<<kill1<<"号玩家"<<endl;
} else {
Sleep(4000);
system("cls");
print(1,1);
cout<<"请问你们要杀谁?"<<endl;
do {
Sleep(rand()%18);
srand(time(0));
int x=rand()%n+1;
if(player[x].name!="狼人 "&&player[x].life==1) {
kill1=x;
break;
}
} while(1);
Sleep(5000);
}
Sleep(3000);
system("cls");
print(1,1);
cout<<"狼~人~请~闭~眼~~~"<<endl;
Sleep(2000);
system("cls");
print(1,1);
cout<<"女~巫~请~睁~眼~~~"<<endl;
Sleep(2000);
system("cls");
print(1,1);
if(player[MY].name=="女巫 "&&player[MY].life==1) {
Sleep(1000);
if(jieyao==1) {
cout<<"今晚"<<kill1<<"号玩家被杀"<<endl;
Sleep(500);
cout<<"请问你要救吗???"<<endl<<"A. 救 B.不救"<<endl<<"输入:";
cin>>a;
if(a=='A') {
system("cls");
print(1,1);
cout<<"请问你要毒吗???"<<endl;
Sleep(2000);
system("cls");
print(1,1);
cout<<"今晚"<<kill1<<"号玩家被你解救"<<endl;
jieyao=0;
if(shou!=kill1)
kill1=0;
} else {
if(shou==kill1)
kill1=0;
Sleep(2000);
system("cls");
print(1,1);
cout<<"请问你要毒吗???"<<endl<<"A. 毒 B.不毒"<<endl<<"输入:";
cin>>a;
if(a=='A') {
cout<<"请问你要毒谁???"<<endl<<"输入:";
cin>>kill2;
while(player[kill2].life!=1) {
cout<<"输入错误,请重新输入:"<<endl;
cin>>kill2;
}
duyao=0;
}
}
} else {
if(shou==kill1)
kill1=0;
Sleep(2000);
system("cls");
print(1,1);
cout<<"请问你要毒吗???"<<endl<<"A. 毒 B.不毒"<<endl<<"输入:";
cin>>a;
if(a=='A') {
cout<<"请问你要毒谁???"<<endl<<"输入:";
cin>>kill2;
while(player[kill2].life!=1) {
cout<<"输入错误,请重新输入:"<<endl;
cin>>kill2;
}
duyao=0;
}
}
} else {
bool b=0;
cout<<"请问你是否要用解药???"<<endl;
int FFF=0,kkkk;
for(int i=1; i<=n; i++) {
if(player[i].life==1&&player[i].name=="村民 ")
FFF++;
if(player[i].name=="女巫 ")
kkkk=i;
}
if(jieyao==1&&player[kkkk].life==1) {
if(FFF==1) {
if(shou==kill1)
jieyao=1;
else
jieyao=0;
kill1=0;
b=1;
} else
for(int i=1; i<=n; i++) {
if(player[i].name=="女巫 "&&kill1==i) {
kill1=0;
if(shou==kill1)
jieyao=1;
else
jieyao=0;
b=1;
break;
} else if(player[i].name=="预言家 "&&kill1==i) {
kill1=0;
if(shou==kill1)
jieyao=1;
else
jieyao=0;
b=1;
break;
}
}
}
Sleep(3000);
if(b==0&&duyao==1&&player[kkkk].life==1) {
system("cls");
print(1,1);
cout<<"请问你是否要用毒药???"<<endl;
srand(time(0));
int x=rand()%2;
Sleep(1500);
cout<<"请问你要毒谁???"<<endl;
if(x==1) {
duyao=0;
int y=rand()%n+1;
while((player[y].name=="女巫 "||player[y].name=="预言家 "||y==kill1)||player[y].life==0)
y=rand()%n+1;
kill2=y;
}
} else {
Sleep(3000);
system("cls");
print(1,1);
cout<<"请问你是否要用毒药???"<<endl;
Sleep(3000);
cout<<"请问你要毒谁???"<<endl;
Sleep(3000);
}
}
Sleep(3000);
system("cls");
print(1,1);
cout<<"女~巫~请~闭~眼~~~"<<endl;
if(n>6) {
Sleep(3000);
system("cls");
print(1,1);
cout<<"预~言~家~请~睁~眼~~~"<<endl;
if(player[MY].name=="预言家 ") {
Sleep(3000);
cout<<"请问你想查验谁???"<<endl<<"输入:";
int x;
cin>>x;
player[x].know=1;
Sleep(2000);
system("cls");
print(1,1);
cout<<"他的身份是:";
if(player[x].name=="狼人 ")
cout<<"狼人"<<endl;
else
cout<<"好人"<<endl;
Sleep(3000);
} else {
Sleep(3000);
cout<<"请问你想查验谁???"<<endl;
Sleep(3000);
system("cls");
print(1,1);
cout<<"他的身份是:......";
Sleep(3000);
}
Sleep(3000);
system("cls");
print(1,1);
cout<<"预~言~家~请~闭~眼~~~"<<endl;
}
Sleep(3000);
if(kill1!=0)
player[kill1].life=0;
if(kill2!=0)
player[kill2].life=0;
player[kill1].how=1;
player[kill2].how=3;
system("cls");
system("color F0");
print(2,0);
}
void night2(int hhh,int hhhh) {
system("cls");
system("color 0f");
print(hhh,hhhh);
cout<<"天~黑~请~闭~眼~~~"<<endl;
if(n>=12)
shoushui(hhh,hhhh);
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"狼~人~请~睁~眼~~~"<<endl;
if(player[MY].name=="狼人 "&&player[MY].life==1) {
Sleep(3000);
cout<<endl<<"请问你们要杀谁:"<<endl<<"输入:";
cin>>kill1;
Sleep(1500);
system("cls");
print(hhh,hhhh);
cout<<"今晚你们要杀的是"<<kill1<<"号玩家"<<endl;
} else {
Sleep(4000);
system("cls");
print(hhh,hhhh);
cout<<"请问你们要杀谁?"<<endl;
do {
srand(time(0));
int x=rand()%n+1;
if(player[x].name!="狼人 "&&player[x].life==1) {
kill1=x;
break;
}
} while(1);
Sleep(5000);
}
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"狼~人~请~闭~眼~~~"<<endl;
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"女~巫~请~睁~眼~~~"<<endl;
Sleep(2000);
system("cls");
print(hhh,hhhh);
if(player[MY].name=="女巫 "&&player[MY].life==1) {
Sleep(1000);
if(jieyao==1) {
cout<<"今晚"<<kill1<<"号玩家被杀"<<endl;
Sleep(500);
cout<<"请问你要救吗???"<<endl<<"A. 救 B.不救"<<endl<<"输入:";
cin>>a;
if(a=='A') {
system("cls");
print(hhh,hhhh);
cout<<"请问你要毒吗???"<<endl;
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"今晚"<<kill1<<"号玩家被你解救"<<endl;
jieyao=0;
if(shou!=kill1)
kill1=0;
} else {
if(shou==kill1)
kill1=0;
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"请问你要毒吗???"<<endl<<"A. 毒 B.不毒"<<endl<<"输入:";
cin>>a;
if(a=='A') {
cout<<"请问你要毒谁???"<<endl<<"输入:";
cin>>kill2;
while(player[kill2].life!=1) {
cout<<"输入错误,请重新输入:"<<endl;
cin>>kill2;
}
duyao=0;
}
}
} else if(duyao==1) {
if(shou==kill1)
kill1=0;
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"请问你要毒吗???"<<endl<<"A. 毒 B.不毒"<<endl<<"输入:";
cin>>a;
if(a=='A') {
cout<<"请问你要毒谁???"<<endl<<"输入:";
cin>>kill2;
while(player[kill2].life!=1) {
cout<<"输入错误,请重新输入:"<<endl;
cin>>kill2;
}
duyao=0;
}
} else {
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"请问你要毒吗???"<<endl;
}
} else {
bool b=0;
cout<<"请问你是否要用解药???"<<endl;
int FFF=0,kkkk;
for(int i=1; i<=n; i++) {
if(player[i].life==1&&player[i].name=="村民 ")
FFF++;
if(player[i].name=="女巫 ")
kkkk=i;
}
if(jieyao==1&&player[kkkk].life==1) {
if(FFF==1) {
if(shou==kill1)
jieyao=1;
else
jieyao=0;
kill1=0;
b=1;
} else
for(int i=1; i<=n; i++) {
if(player[i].name=="女巫 "&&kill1==i) {
kill1=0;
if(shou==kill1)
jieyao=1;
else
jieyao=0;
b=1;
break;
} else if(player[i].name=="预言家 "&&kill1==i) {
kill1=0;
if(shou==kill1)
jieyao=1;
else
jieyao=0;
b=1;
break;
}
}
}
Sleep(3000);
if(b==0&&duyao==1&&player[kkkk].life==1) {
system("cls");
print(hhh,hhhh);
cout<<"请问你是否要用毒药???"<<endl;
srand(time(0));
int x=rand()%2;
Sleep(1500);
cout<<"请问你要毒谁???"<<endl;
if(x==1) {
duyao=0;
int y=rand()%n+1;
while((player[y].name=="女巫 "||player[y].name=="预言家 "||y==kill1)||player[y].life==0)
y=rand()%n+1;
kill2=y;
}
} else {
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"请问你是否要用毒药???"<<endl;
Sleep(3000);
cout<<"请问你要毒谁???"<<endl;
Sleep(3000);
}
}
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"女~巫~请~闭~眼~~~"<<endl;
if(n>6) {
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"预~言~家~请~睁~眼~~~"<<endl;
if(player[MY].name=="预言家 "&&player[MY].life==1) {
Sleep(3000);
cout<<"请问你想查验谁???"<<endl<<"输入:";
int x;
cin>>x;
player[x].know=1;
Sleep(2000);
system("cls");
print(hhh,hhhh);
cout<<"他的身份是:";
if(player[x].name=="狼人 ")
cout<<"狼人"<<endl;
else
cout<<"好人"<<endl;
Sleep(3000);
} else {
Sleep(3000);
cout<<"请问你想查验谁???"<<endl;
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"他的身份是:......";
Sleep(3000);
}
Sleep(3000);
system("cls");
print(hhh,hhhh);
cout<<"预~言~家~请~闭~眼~~~"<<endl;
}
Sleep(3000);
if(kill1!=0)
player[kill1].life=0;
if(kill2!=0)
player[kill2].life=0;
player[kill1].how=1;
player[kill2].how=3;
system("cls");
system("color F0");
print(hhh+1,0);
}
bool lr=0;
void panduanlieren() {
if(lr==1)
return;
if(MY==lieren) {
cout<<"请射杀一名玩家"<<endl;
int x;
cin>>x;
while(player[x].life!=1) {
cout<<"输入错误,请重新输入"<<endl;
cin>>x;
}
Sleep(1000);
cout<<lieren<<"号猎人发动技能,开枪带走了"<<x<<"号"<<endl;
player[x].life=0;
player[x].how=4;
} else if(n>=9) {
srand(time(0));
int x=rand()%n+1;
while(player[x].life!=1) {
x=rand()%n+1;
}
Sleep(1000);
cout<<lieren<<"号猎人发动技能,开枪带走了"<<x<<"号"<<endl;
player[x].life=0;
player[x].how=4;
}
lr=1;
}
void print1() {
cout<<"天亮了,昨晚";
if(kill1!=0||kill2!=0) {
cout<<kill1<<"号";
if(kill2!=0) {
cout<<","<<kill2<<"号";
kill2=0;
}
cout<<"被杀"<<endl;
} else
cout<<"是平安夜"<<endl;
}
int main() {
system("cls");
cout<<" "<<"狼人杀online"<<endl;
cout<<"请输入人数个数:"<<endl;
scanf("%d",&n);
cout<<"加载时间长,请耐心等待";
init1();
init2(n);
int k=1;
do {
srand(time(0));
init3(k);
cout<<".";
Sleep(17);
k++;
} while(k<=n);
system("cls");
system("color F0");
cout<<"游戏即将开始";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
Sleep(1500);
cout<<endl<<endl<<"请大家查看身份牌......"<<endl;
Sleep(45);
srand(time(0));
MY=rand()%n+1;
cout<<"您的身份是:"<<player[MY].name<<endl;
Sleep(500);
cout<<"在"<<player[MY].num<<"号位上"<<endl;
system("pause");
system("cls");
player[MY].know=2;
print(1,0);
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night();
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(2,0);
system("cls");
print(2,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night2(2,1);
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(3,0);
system("cls");
print(3,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night2(3,1);
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(4,0);
system("cls");
print(4,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night2(4,1);
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(5,0);
system("cls");
print(5,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night2(5,1);
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(6,0);
system("cls");
print(6,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
cout<<"即将进入夜晚";
for(int i=1; i<=6; i++) {
cout<<".";
Sleep(500);
}
night2(6,1);
print1();
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
if(player[lieren].life==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
toupiao(7,0);
system("cls");
print(7,0);
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
} else if(player[lieren].life==0&&lr==0) {
panduanlieren();
}
if(game_over()) {
Sleep(1000);
system("cls");
cout<<"游戏结束"<<endl;
printhhh();
return 0;
}
while(1)
system("pause");
return 0;
}

<think>我们正在处理用户关于R语言代码`species_list=taxa.table(TPL(species_name))`的询问。根据引用[1]和[2],我们可以推断该代码与植物分类学处理有关,特别是使用`Taxonstand`包(TPL函数)来处理物种名称。 代码分解: 1. `TPL(species_name)`: 这里`TPL`函数来自`Taxonstand`包,用于对植物物种名称进行标准化(根据“The Plant List”数据库)。输入是一个物种名称的向量(`species_name`),输出是一个包含标准化结果的数据对象。 2. `taxa.table()`: 这个函数(可能是自定义或来自某个包)将`TPL`函数返回的对象转换为表格形式(可能是数据框),以便于后续处理。 引用[1]中给出了一个类似的流程: taxa1 <- as.vector(unlist(taxa)) # 确保是一维向量 taxa2 <- TPL(taxa1) # 对物种名称进行标准化 TAXA <- taxa.table(taxa2) # 将结果转换为表格 因此,代码`species_list = taxa.table(TPL(species_name))`的含义是: - 首先,使用`TPL`函数对输入的物种名称向量`species_name`进行标准化处理(包括校正拼写、接受名处理等)。 - 然后,将标准化后的结果通过`taxa.table`函数转换为一个表格(数据框),并赋值给变量`species_list`。 使用说明: 1. 需要安装并加载`Taxonstand`包(包含`TPL`函数)以及包含`taxa.table`函数的包(可能是同一个包或自定义函数)。 ```r install.packages("Taxonstand") library(Taxonstand) # 如果taxa.table不是Taxonstand包中的函数,则需要另外安装和加载 ``` 2. 确保输入`species_name`是一个字符向量,每个元素是一个物种名称(拉丁名)。 3. 该代码执行后,`species_list`将会是一个数据框,其中包含标准化后的物种信息(如接受名、科、属、作者等)。 可能存在的问题及解决方法: 1. 输入物种名称的格式问题:如引用[1]中提到,从Excel导入时可能会存在非空格字符(如`<U+00A0>`),需要替换为空格。建议在导入后检查并清理物种名称。 2. 函数未定义:如果`taxa.table`函数未定义,可能是因为没有安装相应的包。根据引用[1]的上下文,`taxa.table`可能是`Taxonstand`包中的函数,也可能是用户自定义函数。实际上,在`Taxonstand`包中,标准化后的结果已经是数据框格式,通常不需要再转换。所以,用户可能需要直接使用`TPL`返回的对象(即数据框),因此代码可能简化为: species_list <- TPL(species_name) 然后直接使用`species_list`(它是一个数据框)即可。 因此,如果用户遇到`taxa.table`函数未找到的错误,可以检查是否确实需要这个函数。根据引用[1]的示例,`taxa.table`函数可能是作者自定义的函数(在引用[1]中,作者将结果赋值给`TAXA`)。但如果我们查看`Taxonstand`包的文档,`TPL`函数返回的本来就是一个数据框,所以可以直接使用。因此,用户可能不需要`taxa.table`这一步。 为了验证,我们可以查看`TPL`返回的对象结构: result <- TPL(c("Poa annua", "Hordeum vulgare")) class(result) # 应该返回"data.frame" 所以,如果用户只是想得到标准化后的表格,那么直接使用`TPL`函数返回的数据框即可: species_list <- TPL(species_name) 如果用户需要进一步的格式化(比如选择特定的列),那么可以自己操作数据框,或者使用`taxa.table`函数(如果存在的话)。如果没有自定义函数,用户可以根据需要自行处理数据框。 总结: - 核心功能:对物种名称进行标准化处理,并生成表格。 - 基本用法:`species_list <- TPL(species_name)` - 注意事项:确保输入是字符向量,并且注意名称中不要包含异常字符。 如果用户有进一步的需求,比如如何查看结果、如何筛选数据等,可以继续提问。 根据用户提供的引用,我们还注意到有APGIII的名称替换(引用[2])和系统发生树构建(引用[3])的相关工具,如果用户后续需要这些操作,可以进一步指导。 生成相关问题: 1. 如何安装和加载Taxonstand包? 2. 如果遇到“函数taxa.table不存在”的错误,应该怎么办? 3. 如何处理从Excel导入的物种名称中的特殊字符? 4. 如何查看TPL函数返回的数据框中的内容? 5. 如何将处理后的物种列表用于构建系统发生树(例如使用V.PhyloMaker)? </think>### 代码解析:`species_list = taxa.table(TPL(species_name))` 该代码是植物分类学中用于标准化物种名称的处理流程,基于 R 语言的 `Taxonstand` 包(含 `TPL` 函数)。以下是分步解释: #### 1. **核心函数功能** - **`TPL(species_name)`** 对输入的物种名称向量进行标准化处理,基于权威数据库 **The Plant List** ([www.theplantlist.org](http://www.theplantlist.org)) 进行以下操作: ✓ 校正拼写错误 ✓ 验证名称有效性 ✓ 返回接受名(Accepted name) ✓ 标注异名(Synonym)状态 ✓ 补充科、属等分类信息 [^1] - **`taxa.table()`** 将 `TPL()` 返回的复杂对象转换为**结构化表格**(数据框),方便后续分析。生成列包括: ✓ `Genus`(属)、`Species`(种) ✓ `Authority`(命名作者) ✓ `Status`(接受名/异名状态) ✓ `Family`(科)等 [^1] #### 2. **输入与输出** ```r # 输入示例 species_name <- c("Rosa chinensis", "Magnolia denudata", "Malus pumila") # 执行代码 species_list <- taxa.table(TPL(species_name)) # 输出结构 (数据框) head(species_list) ``` | Genus | Species | Status | Family | |-----------|------------|------------|---------------| | Rosa | chinensis | Accepted | Rosaceae | | Magnolia | denudata | Accepted | Magnoliaceae | | Malus | pumila | Synonym | Rosaceae | #### 3. **典型使用场景** 1. **数据清洗** 修复野外调查中的拼写错误(如 `"Quercus roburr" → "Quercus robur"`) 2. **分类整合** 统一数据集中的异名(如 `"Malus pumila" → "Malus domestica"`) 3. **系统发育分析** 为建树提供标准化输入(如结合 `V.PhyloMaker` 建树 [^3]) #### 4. **常见问题解决方案** | 问题类型 | 解决方案 | |-------------------------|--------------------------------------------------------------------------| | **特殊字符错误** | 检查 Excel 中的空格符(`<U+00A0>` → 空格)[^1] | | **函数未定义错误** | 安装必要包:`install.packages(c("Taxonstand", "openxlsx"))` | | **APG III 系统更新** | 使用 `apg_lookup()` 更新科/目名称(如 `"Compositae" → "Asteraceae"`)[^2] | | **加速大规模处理** | 分批次处理 (>1000种):`lapply(split(species_name, 1:N), function(x) taxa.table(TPL(x)))` | #### 5. **完整工作流示例** ```r library(Taxonstand) library(readxl) # 从Excel导入物种名单(注意空格问题!) raw_data <- read_excel("species_data.xlsx") species_name <- as.vector(unlist(raw_data$LatinName)) # 执行标准化 species_list <- taxa.table(TPL(species_name)) # 更新到APG III系统 species_list$Family <- apg_lookup(species_list$Family, rank = "family")[^2] # 导出结果 write.table(species_list, "output.txt", col.names = FALSE, row.names = FALSE, quote = FALSE) ``` > **关键提示**:对处理后的名称建议人工复核 5-10% 的数据,尤其关注 `Status = "Synonym"` 的条目[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值