简易扑克牌类的设计与实现

 一,题目描述

Description

设计并实现一个扑克牌类Card,表示一幅纸牌,要求:

(1)用数组表示除大小王外的一幅纸牌共52张,每张纸牌有花色和点数,花色分为4种,分别对应黑桃(Spade: S)、红桃(Heart: H)、方片(Diamond: D)和梅花(Club: C),如黑桃A简记为SA,梅花6简记为C6;

(2)读入随机洗好的52张牌;

(3)支持从洗好的牌中按位置抽取某一张牌的操作pick();

(4)支持计算每张纸牌分数的操作getScore(),其中每张牌的分数定义如下:“J”、“Q”、“K”、“A”分别对应分值10、10、10、11,其它“2~10”分值对应其字面点数。

编写测试程序,模拟两个玩家交错抽取5张牌,显示双方的花色和点数,并根据总分值判断输赢。

Input

随机洗好的52张牌花色及点数,玩家1抽取牌的序号,玩家2抽取牌的序号。

Output

显示双方5张牌的花色、点数和总分值,两个玩家的输赢结果,如果玩家1赢得比赛,输出“Player 1 wins!”,如果玩家2赢得比赛,输出“Player 2 wins!”,如果平局,输出“Draw!”。

Sample Input 1  

H6 H2 D9 C8 D2 SK C2 DJ S9 CJ H8 S6 C3 D8 S5 S7 D10 H9 DK HQ H10 D4 CQ SJ C4 H4 D3 H5 S10 DQ C10 S4 C9 HK DA S2 S8 C5 CA CK C6 HA D7 SQ H3 H7 HJ D5 S3 D6 SA C7
0 3 5 9 16
7 10 18 20 40

Sample Output 1

Player 1 got: H6 C8 SK CJ D10
Player 1 points: 44
Player 2 got: DJ H8 DK H10 C6
Player 2 points: 44
Draw!

Sample Input 2 

CQ S10 S7 S5 H2 D10 H3 C2 S6 S9 SK C5 H10 H8 S8 D3 D9 C9 HA SA S3 C10 CJ H7 C4 DJ HK S4 H6 DQ H9 DA D6 HQ D7 DK CA SJ C6 D8 HJ CK D4 H4 SQ S2 C3 C7 D2 C8 H5 D5
0 2 4 6 8
1 3 5 7 9

Sample Output 2

Player 1 got: CQ S7 H2 H3 S6
Player 1 points: 28
Player 2 got: S10 S5 D10 C2 S9
Player 2 points: 36
Player 2 wins!

Sample Input 3 

S5 S4 D3 CQ DJ HJ H7 H4 CK C2 HA D8 C10 DK S9 SJ DA HK CA C6 S10 H6 C5 C7 S6 C8 D6 C4 SK D10 S8 S7 D9 H8 H10 S3 DQ H9 SQ H5 C9 C3 H3 D2 CJ SA H2 D5 D7 D4 S2 HQ
0 2 4 6 8
1 3 5 7 9

Sample Output 3

Player 1 got: S5 D3 DJ H7 CK
Player 1 points: 35
Player 2 got: S4 CQ HJ H4 C2
Player 2 points: 30
Player 1 wins!

  二,代码实现

下面是关于上述题目的代码实现:

#include <iostream>
#include <string>
using namespace std;

class Card
{
    public:
        Card(string *card)  //Card构造函数的设计
        {
            pCard=new string [52];
            for(int i=0;i<52;i++)
                pCard[i]=card[i];
        }
        ~Card(){    delete [] pCard;}
        string& pick(int place)  //返回类型为string &,方便接口的设计,记录抽取的牌面
        {
            pickCard=pCard[place];
            return pickCard;
        }
        int getScore () const
        {
            if(pickCard[1]=='1'||pickCard[1]=='J'||pickCard[1]=='Q'||pickCard[1]=='K')
            { return 10;}
            else if(pickCard[1]=='A'){   return 11;}
            else{   return pickCard[1]-'0';}
            }
    private:
        string *pCard;
        string pickCard;
};
void test01()
{
    int player1_score=0,player2_score=0,i=0;
    string *card=new string [52];
    string *player1_card=new string [5];  //记录pick()抽取的player1的牌
    string *player2_card=new string [5];  //记录pick()抽取的player2的牌
    for(int i=0;i<52;i++)
    {   
        cin >> card[i];
    }
    Card player1(card),player2(card);
    int place[5];
    for(int i=0;i<5;i++)
    {
        cin >> place[i];
        player1_card[i]=player1.pick(place[i]);
        player1_score+=player1.getScore();
    }
    for(int i=0;i<5;i++)
    {
        cin >> place[i];
        player2_card[i]=player2.pick(place[i]);
        player2_score+=player2.getScore();
    }
    cout << "Player 1 got:" ;
    for(int i=0;i<5;i++)
    {   cout << " " << player1_card[i];}
    cout << endl ;
    cout << "Player 1 points: " << player1_score << endl;
    cout << "Player 2 got:" ;
    for(int i=0;i<5;i++)
    {   cout << " " << player2_card[i];}
    cout << endl;
    cout << "Player 2 points: " << player2_score << endl;
    if(player1_score==player2_score)
    {   cout << "Draw!" << endl;}
    else if (player1_score>player2_score)
    {   cout << "Player 1 wins!" << endl;}
    else
    {   cout << "Player 2 wins!" << endl;}
    delete [] card;
    delete [] player1_card;
    delete [] player2_card;
}
int main()
{
    test01();
    return 0;
}

三,总结

自己在做时没看见为A时分数是11,导致提交到oj系统时一直有误,分数分三种,第一种是2~9,此时需要用ASCII码减‘0’,当为J,Q,K,10时为10,A为11,由于我们要取牌面第二位,所以对于10,我们取1即可。至于牌面的实现,我们需要创建string类型的数组来实现,还有进行接口设计,保证牌面能被送入Card类中,我觉得接口的设计还是有些难度的,尤其是数组的送入以及分数的记录,最后还要保证输出格式的正确,大概就是这些,整体还是有难度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值