#ifndef _CARDPLAYER_H
#define _CARDPLAYER_H
#include "Card.h"
#include "CardBox.h"
class CardPlayer
{
private:
char *name ;//例如选手名字为LuciferDragon
Card *card ;
protected:
mutable TypeValue CardAmount ;//玩家拥有的牌数
TypeValue NameSize ;//玩家名字字符数
int Score ;//玩家得分
int Money ;//玩家金钱
bool Drop ;//是否弃牌
mutable bool sort ;//是否已经排序好
public:
CardPlayer() ;//构造函数,初始化玩家数据
void Sort() ;//对玩家手中的牌进行排序
void SetName() ;//设置玩家姓名
void SetNameSize() ;//设置用户名长度
void SendCard() ;//从玩家手动发牌
void DisplayCard() ;//显示玩家手中的牌
void DisplayName() ;//显示选手姓名
int GetScore() const ;//返回玩家得分
int GetMoney() const ;//返回玩家手中金钱
void DisplayCardPos() ;//显示牌的位置
void SendCard( const TypeValue &n ) ;//从玩家指定位置发牌
bool IsSort() const ;//判断玩家是否已经排序好
bool IsEmpty() const ;//判断玩家手中是否有牌
bool IsDrop() const ;//判断玩家是否已经弃牌
TypeValue& GetCardAmount() const ;//返回玩家手中的牌数
bool GetCardFrom(CardBox& Box) const ;//判断能否从盒子中发牌给玩家
Card& GetCardOf(const TypeValue &n) const ;//返回玩家指定位置的牌
};
CardPlayer::CardPlayer()
{
NameSize = 15;//定义用户名长度,默认值15
CardAmount = 7;//初始化牌数
card=new Card[CardAmount];//初始化玩家手中的牌
name="计算机";//默认选手姓名
Score=0;//初始化游戏积分
Money=1000;//初始化玩家金钱
Drop=false;//开始时默认没有放弃比赛
sort=true;//默认已经排序好
}
void CardPlayer::Sort()
{//对没有排序好的牌进行排序
if( IsSort() );//如果已经排序好则直接结束
else
{//否则进行冒泡排序
for( TypeValue i = CardAmount - 1 ; i > -1 ; --i )
for( TypeValue j = 0 ; j < i ; ++j )
if( card[j] > card[j+1] )
card[j].Swap( card[j+1] ) ;
}
}
void CardPlayer::SetName()
{//最多读取size-1个字符或size/2个汉字,遇到回车则终止输入
name = new char[NameSize];
int count=0;
do{
cout<<"请输入选手姓名:";
cout.flush();//清空缓冲区
cin.clear();
cin.ignore(1);//忽略一个字符,否则会将上一行的回车符号读进去
cin.get(name,NameSize,'/n');
}while(name[1]=='/n');
}
void CardPlayer::SetNameSize()
{
int Size;
do
{
cout.flush();//清空缓冲区
cin.clear();
cin.ignore(1);
cout<<"请输入您的用户名长度(正整数):";
cin>>Size;
while(!cin || Size < 1 || Size > 32766 )
{//当输入的数据类型与定义的变量类型不一致并且分配内存过大时
const int N=6;
char str[N];
cout.flush();//清空缓冲区
cin.clear();//清空输入缓存区
cin.get(str,N,'/n');//接收原输入数据
if( !atoi( str ) )
{
cout<<"非法输入,请输入一个整数:";
cin>>Size;//重新输入
}
}
}while( Size < 1 || Size > 32766 );
NameSize = Size + 1 ;//分配内存最大值是32767
}
void CardPlayer::SendCard()
{
char *pos = new char ;
int n ;
cout<<"请出牌!/n";
cout<<"选择要出的牌的位置:/t";
cin>>pos;
n = atoi( pos ) ;
while( n < 0 || n > CardAmount )
{
cout<<"ERROR POSTION!/a/n";
cout<<"选择要出的牌的位置:/t";
cin>>pos;
n = atoi( pos ) ;
}
if( !n ) ;//如果n=0则不做任何操作
else
{
card[n-1].ShowCard() ;
cout<<endl;
for( TypeValue i = n - 1 ; i < CardAmount - 1 ; ++i )
card[ i ] = card[ i + 1 ] ;
card[ CardAmount - 1 ] .ClearCard();
--CardAmount ;//*与--优先级相同,并且都是从右至左
}
}
void CardPlayer::DisplayCard()
{
for(TypeValue i=0;i< CardAmount;++i)
{
card[i].ShowCard();
cout<<" " ;
}
}
void CardPlayer::DisplayName()
{ cout << name ; }
int CardPlayer::GetScore() const
{ return Score ; }
int CardPlayer::GetMoney() const
{ return Money ; }
void CardPlayer::DisplayCardPos()
{
for(short i = 1 ; i < CardAmount + 1 ; ++i )
{
cout<< i << " : " ;
card[i-1].ShowCard() ;
cout<<endl ;
}
}
void CardPlayer::SendCard(const TypeValue &n)
{
card[n-1].ShowCard() ;
cout<<endl ;
for( TypeValue i = n - 1 ; i < CardAmount - 1 ; ++i )
card[ i ] = card[ i + 1 ] ;
card[ CardAmount - 1 ] .ClearCard();
--CardAmount ;//*与--优先级相同,并且都是从右至左
}
bool CardPlayer::IsSort() const //此处需要注意要声明为mutable型变量
{//是否已排序好,升序排序//优先级由高到低:-,< <=,&,=
for( TypeValue i = 0 ; i < CardAmount - 1 ; ++i )
sort &= ( card[i] < card[i+1] ) ;
return sort;//因为IsSort()const函数将对此变量进行更改
}
bool CardPlayer::IsEmpty() const
{ return card[0].IsClear() ; }
bool CardPlayer::IsDrop() const
{ return Drop ; }
TypeValue& CardPlayer::GetCardAmount() const
{ return CardAmount ; }
bool CardPlayer::GetCardFrom(CardBox& Box) const
{//判断是否发了一张牌
if( Box.GetCardAmount() < CardAmount )
{//若盒中的牌少于玩家应发的牌数返回false
cout<<"Out Of Bounds!" ;
return false ;
}
else
{//否则从盒子Box中取CardAmount张牌发给选手返回true
for( TypeValue i = 0 ; i < CardAmount ; ++i )
Box.SendCardTo( card[i] ) ;
return true ;
}
}
Card& CardPlayer::GetCardOf(const TypeValue &n) const
{
if( n < 0 || n > CardAmount - 1 )
{
cout<<"Out Of Bounds!";
return Card();//如果牌已经发出则返回一个空牌
}
return card[n];
}
#endif