CardPlayer 类

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值