题目
- 声明一个扑克牌类,拥有方法:传入花色和点数生成扑克牌、打印扑克牌。
- 声明一个玩家类,每人拥有18张扑克牌。拥有方法:增加手牌(摸牌)、展示手牌。
用54张不同的扑克牌构成牌堆,发给3个玩家。手牌要求降序排序展示
注意
- 发牌的时候,牌不能重复派发(需要将派发过的牌置为无效牌)
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
using namespace std;
enum {
spades, //黑桃
hearts, //红桃
clubs, //梅花
diamonds,//方片
joker, //大小王
};
class Poker {
char m_type;
int m_point;
public:
//初始化函数的正规写法
Poker() :
m_type(0),
m_point(0)
{
}
//制作扑克
void makePoker(char type, int point) {
m_type = type ;
m_point = point;
if (m_type == joker)
{
m_point += 13;
}
}
//打印扑克
void outputPoker() {
const char *type[5] = { "黑桃", "红桃", "梅花", "方片", "" };
const char *point[16] = { "", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "小王", "大王" };
printf("%s%s", type[m_type], point[m_point]);
}
//设置缺省参数
bool cmppoker(Poker tmp) {
return (m_point < tmp.m_point) || (m_point == tmp.m_point && m_type < tmp.m_type);
}
//扑克牌是有效的
bool isEff() {
if (m_type == 4 && (m_point == 14 || m_point == 15)) {
return true;
}
if ((unsigned char)m_type > 3 || (unsigned int)m_point - 1 > 13) {
return false;
}
return true;
}
};
class Player {
Poker m_HandCard[18];
int m_size;
public:
//初始化函数的另一种写法
Player() {
m_size = 0;
}
//玩家得到一张扑克,并将其插入自己已有的手牌中
void getCard(Poker newCard) {
Poker tmp = newCard;
int i;
for (i = m_size; i > 0 && m_HandCard[i - 1].cmppoker(tmp); i--) {
m_HandCard[i] = m_HandCard[i - 1];
}
m_HandCard[i] = newCard;
m_size++;
}
//名牌
void showCard() {
for (auto& i : m_HandCard) {
i.outputPoker();
putchar(' ');
}
putchar('\n');
}
};
//设置随机数,随机发牌
//为了避免随机多次,却不能取到有效牌,将其设置为如果无效牌则+1,这样最多循环54次
int randnum(Poker * cardHeap) {
int tmp = rand() % 54;
while (1) {
if(cardHeap[tmp].isEff()){
return tmp;
}
else {
tmp++;
if (tmp == 54) {
tmp = 0;
}
}
}
}
int main() {
Poker tmp[54];//牌堆
int j = 0;
Player ayi;
Player laoye;
Player miao;
for (auto& i : tmp) {
i.makePoker(j / 13, j % 13 + 1);
j++;
}
srand((unsigned)time(NULL));
int delcard;
int i;
for (i = 0; i < 18; i++) {
delcard = randnum(tmp);//返回调用的是第几张牌
ayi.getCard(tmp[delcard]);
tmp[delcard].makePoker(-1, -1);//将本张牌置为无效牌(花色,点数),避免重复调用
delcard = randnum(tmp);
laoye.getCard(tmp[delcard]);
tmp[delcard].makePoker(-1, -1);
delcard = randnum(tmp);
miao.getCard(tmp[delcard]);
tmp[delcard].makePoker(-1, -1);
}
ayi.showCard();
laoye.showCard();
miao.showCard();
return 0;
}
代码生成图