练习 类和对象

1、声明一个扑克牌类,拥有方法:传入花色和点数生成扑克牌、打印扑克牌。 
2、声明一个玩家类,每人拥有18张扑克牌。拥有方法:增加手牌(摸牌)、展示手牌,其中展示手牌要求降序排序展示。 
完成程序: 
1、随机生成18张扑克牌,当做一个玩家的手牌。 
2、用54张不同的扑克牌构成牌堆,发给3个玩家。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>

using namespace std;

enum 
{
	SPADES,//黑桃♠,枚举赋值默认从0开始
	HEARTS,//红桃♥
	CLUBS,//梅花♣
	DIAMONDS,//方块♦
	JOKEER//王
};

//全局变量g_ 局部静态变量s_成员变量m_

class Poker
{
	char m_type;
	int m_point;
public:
	Poker() :
		m_type(0),
		m_point(0)
	{
	}
	Poker(char type, int point) :
		m_type(type),
		m_point(point)
	{
	}

	void makePoker(char type, int point)
	{
		m_type = type;
		m_point = point;

		if (m_type == JOKEER)
		{
			m_point += 13;
		}
	}

	void outputPoker()
	{
		char *type[5] = { "黑桃", "红桃", "梅花", "方块", "" };
		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 == JOKEER && (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)
	{
		int i;
		for ( i = m_size; i>0 && m_HandCard[i-1].cmppoker(newCard); 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');
	}
};

void pokerTest()
{
	srand((unsigned)time(NULL));
	Player p1;
	Poker tmp(0, 3);

	int i;
	for ( i = 0; i < 18; i++)
	{
		tmp.makePoker(rand() % 4, rand() % 13 + 1);
		p1.getCard(tmp);
	}
	p1.showCard();
}

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 miao17;

	for (auto &i:tmp)
	{
		i.makePoker(j / 13, j % 13 + 1);
		j++;
	}

	srand((unsigned)time(NULL));

	int declard;

	int i;
	for ( i = 0; i < 18; i++)
	{
		declard = randnum(tmp);
		ayi.getCard(tmp[declard]);
		tmp[declard].makePoker(-1, -1);

		declard = randnum(tmp);
		laoye.getCard(tmp[declard]);
		tmp[declard].makePoker(-1, -1);

		declard = randnum(tmp);
		miao17.getCard(tmp[declard]);
		tmp[declard].makePoker(-1, -1);
	}

	ayi.showCard();
	laoye.showCard();
	miao17.showCard();

	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值