此题为一个简单的扑克牌人机对弈的程序。首先生成一副无序的扑克牌,共52张(不含大、小王)。每次给玩家和计算机各发两张牌,比较玩家和计算机牌的大小,决定胜负。 2.6.2 课程设计要求
1.生成一副无序的牌,共52张(不含大、小王)。其中,J、Q、K对应的数值是11,12,13,而A对应的数值是14(比K大)。玩家和计算机的牌从此副牌中发出。由于每局游戏要用掉4张牌(玩家和计算机各2张牌),52张牌只够玩13次,之后应该重新生成一副牌。
超导电机
2.每局游戏结束时应询问玩家是否继续玩牌,以决定是否进行下次游戏。 3.玩家和计算机各有两张牌,两张牌比大小的规则如下:
1)同花的一对大于不同花的一对(相同牌型则比点值)。
2)一对大于两张散牌。
3)散牌比大小时,先比较各自的最大牌,如果最大牌的点值不同,则立刻分出胜负,如果最大牌点值相同,再比次大牌,以此类推,最终比出大小,如果所有点值相等,则平局。
4.在发牌前,玩家先下盲注,发牌后,玩家可根据自己的牌,决定是否继续下注。下注金额超过玩家自有赌本时,应提示玩家重新下注。
5.选做:该程序只考虑2张牌比大小,可考虑更多牌比较大小的情况。
2.6.3 程序算法说明
2.6.4节给出了单张扑克牌类PlayingCard和一副扑克牌类Deck。在此基础上再增加一个扑克牌玩家类CardPlayer。每个玩家有两张牌,每张牌是单张扑克牌类PlayingCard的对象。CardPlayer中还应包括玩家输、赢及平局的次数,总赌本和每牌下的赌注。CardPlayer类的设计如下,仅供参考。
class CardPlayer
{
private:
PlayingCard card[2];//每个玩家2张牌
int nWin;//赢的次数
int nLose;//输的次数
int nDraw;//平局的次数
int nBet;//赌注
int nMoney;//总的赌本
public:
friend int Compare(CardPlayer&,CardPlayer&);//友元函数
CardPlayer();//构造函数
void GetCard(Deck&);//从整副牌中获得两张牌
void DisplayCard();//显示玩家的牌 void Win();//赢时修改赢的次数,收回赢的钱(是赌注的两倍,含自己的赌注在内)
void Lose();//输时修改输的次数
void Draw();//平局时修改平局次数,并把赌注收回
void SetBet(int);//下赌注
int GetBet();//获得总赌注
二氧化碳保护焊
void AddBet(int);//加赌注
void Show();//显示最后结果
int GetMoney();//返回当前钱数
};
为了使CardPlayer类中的成员函数void GetCard(Deck&)能访问Deck对象的私有数据,应将CardPlayer类声明为Deck类的友元类或将 GetCard函数声明为Deck类的友元函数。
为了比较玩家和计算机的两张牌的大小,可设计一个全局函数Compare(CardPlayer& player, CardPlayer& cpu)进行大小的比较,为了能访问CardPlayer对象的私有数据,应将Compare函数声明为CardPlayer类的友元函数。
2.6.4 部分关键源代码注解
以下程序代码仅供参考。
/*第6题 扑克牌对抗游戏--源代码及关键源代码注解如下:*/
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
//*******************************************************************
class PlayingCard //扑克类
{
private:
int nValue; //扑克牌面值对应的数值
char chSuit ; //扑克的花(黑、红、梅、方)
public:
PlayingCard(); //构造函数
void ShowCard(); //显示扑克牌
void CardMake(int,char); //生成扑克牌
锚钉
int GetValue();//返回当前牌的面值
char GetSuit();//返回当前牌的花
};
class Deck //一副扑克(52张)
{
private:
PlayingCard m_cardarray[52]; //52张扑克
int nLastDelt; //当前可用扑克牌的位置,初值为0
public:
friend class CardPlayer;
Deck(); // 构造函数
void MakeDeck(); //生成一副扑克牌
void DealOne(); // 从整副牌中发出(删除)一张扑克牌
void ShowDeck(); // 显示一副牌
};
//全局子函数声明
void CenterText(char []); // 居中显示字符串
char pause(); // 暂停,按任意键继续
PlayingCard::PlayingCard() // 构造函数
{
chSuit = ' '; // 初始化为空
nValue = 0;
}
int PlayingCard::GetValue()//返回当前牌的面值
{
return nValue;
}
char PlayingCard::GetSuit()//返回当前牌的花
{
return chSuit;
}
void PlayingCard::ShowCard() //显示单张扑克牌
{
cout<<" ";
switch(nValue)
{
case 14:cout<<"A";break;
case 13:cout<<"K";break;
case 12:cout<<"Q";break;
case 11:cout<<"J";break;
default:cout<<nValue;break;
}
cout<<(char)chSuit;
cout<<" ";
cout.flush();
}
void PlayingCard::CardMake(int num,char suit)//生成一张牌
{
nValue = num;
chSuit = suit;
}
Deck :: Deck() //构造函数,生成一副空牌
{
int i;
for(i=0;i<=51;i++)
{
m_cardarray[i] = PlayingCard();
}
nLastDelt = 0;//当前牌的有效起始位置
}
void Deck::MakeDeck() //生成一副无序的牌,相当于洗牌之后的牌
{
int i, j, index;
char suit[4]={6,3,5,4};//ASCII码为6的是红桃,3黑桃,5梅花,4方块
int flag[52]={0}; //记录52张牌的位置中哪些位置已经有牌了,1表示已经有牌了
nLastDelt=0;
for(i=2;i<=14;i++) lc谐振放大器//2-A共13种面值的牌,其中A的值为14,比K大
{
for(j=0; j<4; j++) //每个面值的牌又有4个花
{
do
{
index = rand()%52; //生成0-51之间的随机数
}while(flag[index]==1);//如果随机选的位置上已经有牌了,则重新选择
m_cardarray[index].CardMake(i, suit[j] );
flag[index]=1;
}
}
}
void Deck::ShowDeck()
{
int index = nLastDelt; //从当前可用的牌开始显示,即不显示已经发出去的牌
int newline = 0;
// CenterText("完整的一副牌");
cout << endl;
while(index<=51)
{
if(newline % 11 == 0) cout << endl;
大灯清洗装置
m_cardarray[index].ShowCard();
newline++;
index++;
}
}
void Deck::DealOne()
{
if(nLastDelt <52) // 检查是否还有牌可以发出去
{
//cout <<"被删除的牌是:";
// m_cardarray[nLastDelt].ShowCard();
nLastDelt++;
}
else
{
cout << "没有牌可以发了";
cout<<"请按任意键继续……"<<endl;
getch();
}
}
int main()
{
srand( (unsigned)time( NULL ) ); // Seeds GetRandInt
CenterText("欢迎来到扑克牌游戏");
cout << endl<<'\n';
char ans;
Deck deck_1;//定义一副牌对象
//询问玩家是否玩牌,若是,才有以下操作,否则程序结束
//52张牌只够玩13次,之后应该重新洗牌
cout<<"重新洗牌……"<<endl;
deck_1.MakeDeck(); //乱序生成一副牌
deck_1.ShowDeck(); //显示整副牌,此行为调试用,玩游戏时不能看到整副牌
pause();//暂停,按任意键继续
//玩家下盲注
//给两个玩家各发两张牌
大数据恢复
//显示玩家的牌,询问是否加注
//询问玩家是否要增加赌注,当下注资金超过现有资金,报错,重新下注
//显示玩家和计算机的牌
//比较玩家和计算机牌的大小
//输出本次牌的比较结果
//显示目前为止,胜、负、平局次数及玩家现有总资金数
cout<<"\n请按任意键退出程序……"<<endl;//玩家选择不玩游戏后,结束程序
getch();
return 1;