要求:
请编写一个简单的扑克牌对抗游戏,2名游戏者手中个有5张牌,游戏具有洗牌、对抗,以及显示游戏者当前手中所有牌面的功能。
游戏规则:
洗牌之后花色相同的牌按点数升序排列;对抗之时游戏者手中牌面点数累计大者获胜。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
class PlayingCard{ //定义 PlayingCard类
public:
enum Suits{Spade,Diamond,Club,Heart}; //定义花色为枚举类型
Suits suit(){return suitValue;}
int rank(){return rankValue;}
PlayingCard(Suits is,int ir){
suitValue=is;
rankValue=ir;}
private:
Suits suitValue;
int rankValue;
};
PlayingCard card1[5]={ //定义第一副牌,这里的牌是人为制定的,并非发牌
PlayingCard(PlayingCard::Spade,3),
PlayingCard(PlayingCard::Heart,1),
PlayingCard(PlayingCard::Diamond,4),
PlayingCard(PlayingCard::Club,3),
PlayingCard(PlayingCard::Spade,2)};
PlayingCard card2[5]={ //定义第二副牌
PlayingCard(PlayingCard::Spade,2),
PlayingCard(PlayingCard::Heart,6),
PlayingCard(PlayingCard::Diamond,7),
PlayingCard(PlayingCard::Club,5),
PlayingCard(PlayingCard::Spade,4)};
void Display() //定义显示游戏者牌面的函数
{
int i,j;
cout<<"player1's Card"<<endl;
cout<<"suit"<<" "<<"rank"<<endl;
for(i=0;i<5;i++)
{
cout<<" "<<card1[i].suit()<<" "<<card1[i].rank()<<endl;
}
cout<<endl;
cout<<"player2's Card"<<endl;
cout<<"suit"<<" "<<"rank"<<endl;
for(j=0;j<5;j++)
cout<<" "<<card2[j].suit()<<" "<<card2[j].rank()<<endl;
cout<<endl;
}
int main()
{
int i,j;
PlayingCard t(PlayingCard::Diamond,1);
for(j=0;j<5;j++) //对第一副牌进行花色筛选,相同花色排在一起。人为假设只有两张花色相同
{for(i=1;i<=4-j;i++) //不知有没有其他更好的办法
if(card1[j].suit()==card1[j+i].suit() && i!=j+1)
{t=card1[j+1];card1[j+1]=card1[j+i];card1[j+i]=t;}
}
for(i=0;i<=3;i++) //对第一副牌中花色相同的牌进行点数排序,这里人为假设只有两张牌的花色相同
{
if(card1[i].suit==card1[i+1].suit && card1[i+1].rank()<card1[i].rank())
{t=card1[i];card1[i]=card1[i+1];card1[i+1]=t;}
}
int M1=0,M2=0,k; //对两名游戏者手中牌对数进行计数
for(k=0;k<5;k++)
M1+=card1[k].rank();
for(k=0;k<5;k++)
M2+=card2[k].rank();
for(j=0;j<5;j++) //对第一副牌进行花色筛选,相同花色排在一起。
{for(i=1;i<=4-j;i++)
if(card2[j].suit()==card2[j+i].suit() && i!=j+1)
{t=card2[j+1];card2[j+1]=card2[j+i];card2[j+i]=t;}
}
for(i=0;i<=3;i++) //对第一副牌中花色相同的牌进行点数排序,这里人为假设只有两张牌的花色相同
{if(card2[i].suit==card2[i+1].suit && card2[i+1].rank()<card2[i].rank())
{t=card2[i];card2[i]=card2[i+1];card2[i+1]=t;}
}
Display();
cout<<endl;
if(M1>M2) //对抗
cout<<"player1 won"<<endl;
else
cout<<"player2 won"<<endl;
cout<<"player1's rank "<<endl<<M1<<endl<<endl;
cout<<"player2's rank "<<endl<<M2<<endl;
return 0;
}
遗留问题:
对两名游戏者的牌进行花色筛选和排序应该可以是用一个函数来解决,但是不知怎么调用。以上程序两次使用同一段代码对两副牌进行排序,显得有点冗余。
我写的排序函数如下,怎么调用或怎么更改呢?
void Rank(PlayingCard &)
{
int i,j;
PlayingCard t(PlayingCard::Diamond,1);
for(j=0;j<5;j++)
for(i=1;i<=4-j;i++)
if(card[j].suit()==card[j+i].suit() && i!=j+1)
{t=card[j+1];card[j+1]=card[j+i];card[j+i]=t;}
for(i=0;i<=4;i++)
if(card[i].suit==card[i+1].suit && card[i].rank()>card1[i+1].rank())
{t=card[i];card[i]=card[i+1];card[i+1]=t;}
}