大模拟,没什么好说的
为了简化操作,运用c++STL
对于牌堆,明显可以用队列模拟
对于玩家的牌,用vector储存,出牌可直接调用库函数
对牌单独定义结构体吗,方便操作
对于名字,不要打一堆if
尽量所有函数式编程,尽量复用代码,缩短代码长度,减少调试难度
以下给出2个代码
std
#include<bits/stdc++.h>
using namespace std;
struct card{
string col;
string pattern;
card(){};
card(string a,string b): col(a),pattern(b){};
}consult;
int n,Round,direction=1;
string name[5]={"xiran","sanqiu","shixin"};
queue<card> pai;
vector<card> v[5];
void get_card(int x,int ad)
{
while(ad--){
if(pai.size()==0){
puts("There are no cards to take");//无牌可拿
for(int i=0;i<3;i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j].col<<" "<<v[i][j].pattern<<" ";
puts("");
}
exit(0);
}
v[x].push_back(pai.front());
pai.pop();
}
}
void next(int x){Round=((Round+x*direction)%3+3)%3;}
void discard(int i)
{
card k= v[Round][i];
consult=k;//参考牌替换
pai.push(k);//加入牌堆
v[Round].erase(v[Round].begin()+i,v[Round].begin()+i+1);//删除此玩家的手牌
if(k.pattern=="Skip"){next(2);}
else if(k.pattern=="Reverse"){direction=-direction;next(1);}
else if(k.pattern=="Draw_Two"){next(1);get_card(Round,2);next(1);}
else{next(1);}
}
void work()
{
for(int i=0;i<v[Round].size();i++)
if(v[Round][i].col==consult.col||v[Round][i].pattern==consult.pattern){
discard(i);
return;
}
//无牌可出
while(1){
get_card(Round,1);// 获得一张牌
int k=v[Round].size()-1;
if(v[Round][k].col==consult.col||v[Round][k].pattern==consult.pattern){
discard(k);
return;
}
}
}
int main()
{
consult=card("g","1");//规定初始参考牌为 绿色的1
cin>>n;
for(int i=1;i<=n;i++){
string a,b;
cin>>a>>b;
pai.push( card(a,b) );//加入牌堆
}
for(int i=0;i<3;i++) get_card(i,7);//每人获得7张的初始牌
while(v[0].size()&&v[1].size()&&v[2].size()){
work();
}
for(int i=0;i<3;i++) if(!v[i].size()) cout<<name[i]<<"\n";
for(int i=0;i<3;i++){
for(int j=0;j<v[i].size();j++)
cout<<v[i][j].col<<" "<<v[i][j].pattern<<" ";
puts("");
}
return 0;
}审题人代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
char col;
string act;
}card[4][10005];
node allofcard[10005];
bool aim[4][10005];
int nowcard[4];
int leacard[4];
void print()
{
for(int j=1;j<=nowcard[1];j++)
{
if(aim[1][j]==0)
cout<<card[1][j].col<<" "<<card[1][j].act<<" ";
}
cout<<endl;
for(int j=1;j<=nowcard[2];j++)
{
if(aim[2][j]==0)
cout<<card[2][j].col<<" "<<card[2][j].act<<" ";
}
cout<<endl;
for(int j=1;j<=nowcard[3];j++)
{
if(aim[3][j]==0)
cout<<card[3][j].col<<" "<<card[3][j].act<<" ";
}
}
int main()
{
int n;
scanf("%d",&n);
int cnt=0;
int now=1;
for(int i=1;i<=n;i++)
{
if(now==4)
{
cin>>allofcard[++cnt].col;
getchar();
cin>>allofcard[cnt].act;
}
else
{
cin>>card[now][++cnt].col;
getchar();
cin>>card[now][cnt].act;
nowcard[now]++;
if(cnt==7)
now++,cnt=0;
}
}
if(now<=3)
{
printf("There are no cards to take\n");
print();
return 0;
}
for(int i=1;i<=3;i++)
leacard[i]=nowcard[i];
int order=1;
char stacol='g';
string stact="1";
int peo=1;
int pointo=1;
// cout<<"——————————————————————————————"<<endl;
while(1)
{
bool flag=false;
for(int i=1;i<=nowcard[peo];i++)
{
if(!aim[peo][i]&&(card[peo][i].col==stacol||card[peo][i].act==stact))
{
aim[peo][i]=1;
leacard[peo]--;
flag=true;
stacol=card[peo][i].col;
stact=card[peo][i].act;
// cout<<stacol<<" "<<stact<<endl;
allofcard[++cnt].col=stacol;
allofcard[cnt].act=stact;
if(leacard[peo]==0)
{
if(stact=="Draw_Two")
{
int now1=peo;
now1+=order;
if(now1>3)
now1=1;
if(now1<1)
now1=3;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
card[now1][++nowcard[now1]]=allofcard[pointo++];
leacard[now1]++;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
leacard[now1]++;
card[now1][++nowcard[now1]]=allofcard[pointo++];
}
if(peo==1)
cout<<"xiran"<<endl;
else if(peo==2)
cout<<"sanqiu"<<endl;
else
cout<<"shixin"<<endl;
print();
return 0;
}
if(stact=="Skip")
{
peo+=order;
if(peo>3)
peo=1;
if(peo<1)
peo=3;
}
else if(stact=="Reverse")
{
order*=-1;
}
else if(stact=="Draw_Two")
{
peo+=order;
if(peo>3)
peo=1;
if(peo<1)
peo=3;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
card[peo][++nowcard[peo]]=allofcard[pointo++];
leacard[peo]++;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
leacard[peo]++;
card[peo][++nowcard[peo]]=allofcard[pointo++];
}
break;
}
}
if(leacard[peo]==0)
{
if(stact=="Draw_Two")
{
int now1=peo;
now1+=order;
if(now1>3)
now1=1;
if(now1<1)
now1=3;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
card[now1][++nowcard[now1]]=allofcard[pointo++];
leacard[now1]++;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
leacard[now1]++;
card[now1][++nowcard[now1]]=allofcard[pointo++];
}
if(peo==1)
cout<<"xiran"<<endl;
else if(peo==2)
cout<<"sanqiu"<<endl;
else
cout<<"shixin"<<endl;
print();
return 0;
}
if(!flag)
{
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
while(!(allofcard[pointo].col==stacol||allofcard[pointo].act==stact))
{
card[peo][++nowcard[peo]]=allofcard[pointo++];
leacard[peo]++;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
}
stacol=allofcard[pointo].col;
stact=allofcard[pointo].act;
pointo++;
allofcard[++cnt].col=stacol;
allofcard[cnt].act=stact;
// cout<<stacol<<" "<<stact<<endl;
if(stact=="Skip")
{
peo+=order;
if(peo>3)
peo=1;
if(peo<1)
peo=3;
}
else if(stact=="Reverse")
{
order*=-1;
}
else if(stact=="Draw_Two")
{
peo+=order;
if(peo>3)
peo=1;
if(peo<1)
peo=3;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
card[peo][++nowcard[peo]]=allofcard[pointo++];
leacard[peo]++;
if(pointo>cnt)
{
printf("There are no cards to take\n");
print();
return 0;
}
leacard[peo]++;
card[peo][++nowcard[peo]]=allofcard[pointo++];
}
}
peo+=order;
if(peo>3)
peo=1;
if(peo<1)
peo=3;
}
}
京公网安备 11010502036488号