回 帖 发 新 帖 刷新版面

主题:希望大侠们帮帮小弟,能帮我解决C语言扑克牌比大小游戏,作业就要交了。。

输出的按照我上传附件里的压缩包里的要求输出。
顺便大侠写的C代码注释一下,不然小弟看不懂。
谢谢大侠了。。。。


/// 防止头文件重复引用
#pragma once 

//-----------------------------------------------------
// 游戏所需的库文件
//-----------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

//-----------------------------------------------------
// 游戏所需的宏定义
//-----------------------------------------------------

/// 安全释放(C++内容)
#define SAFE_DELETE(p) { if (p) { delete p; p = NULL; } }
/// 一副牌的数量
#define CARDCOUNT  52
/// 牌的副数(一共六副牌)
#define CARDNUMBER 6
/// 牌的总数(52 × 6)
#define CARDTOTAL  CARDCOUNT * CARDNUMBER

//-----------------------------------------------------
// 自命名的一些基本数据类型
//-----------------------------------------------------

/// 把无符号字符取别名BYTE
typedef unsigned char BYTE;
/// 把无符号整型取别名UINT
typedef unsigned int  UINT;

//-----------------------------------------------------
// 自命名的一些自定义类型
//-----------------------------------------------------

/// 牌花色的枚举
typedef enum CardType
{
    CLUB     = 0x02,    // 梅花
    DIAMOND = 0x12,    // 方块
    HEART     = 0x22,    // 红桃
    SPADE     = 0x32    // 黑桃
} CARDTYPE;

/// 牌的结构体
typedef struct card
{
private:
    BYTE  m_CardPoint;

public:
    /// 带参构造函数(C++内容,目的是给牌的牌点赋值)
    card(BYTE cardPiont){ m_CardPoint = cardPiont; }
    /// 获取牌点
    BYTE getPoint() { return m_CardPoint; }
} CARD;
//-----------------------------------------------------
// 与游戏相关的一些全局变量
//-----------------------------------------------------

CARD*        g_CardList[312];        // 牌的列表
CARD*       g_pCard = NULL;        // 牌的指针
static UINT g_Num = CARDTOTAL;        // 当前牌的位置
CARDTYPE    g_CardType = CLUB;        // 牌的花色
BYTE        g_Banker;            // 庄家
BYTE        g_Player;            // 玩家
UINT        g_Count = 1000;        // 玩家初始赌资
UINT        g_Round = 0;        // 局数

//-----------------------------------------------------
// 函数声明
//-----------------------------------------------------

/// 装入牌
void PushCard();
/// 显示牌
void ShowCard(BYTE cardPoint);
/// 显示所有牌
void ShowAllCard();
/// 洗牌
void RiffleCard();
/// 清牌
void ClearCard();
/// 发牌
void DealCard(BYTE& banker, BYTE& player);
/// 抽牌
void TakeCard(BYTE& banker, BYTE& player);
/// 比较牌
int  CompareCard(BYTE& banker, BYTE& player);
/// 判断输入是否有效
bool CheckIn(char c, const char t);

//-----------------------------------------------------
// 主函数,在此调用以上相关函数,并配合自身逻辑实现游戏
//-----------------------------------------------------

int main()
{
    return 0;
}

//-----------------------------------------------------
// 函数实现
//-----------------------------------------------------

void PushCard()
{
    for (UINT i = 0; i < CARDNUMBER; i ++)
        for (UINT j = 0; j < CARDCOUNT; j ++)
        {
            // j / 13 结果有0 1 2 3 
            switch (j / 13)
            {
            case 0:
                g_CardType = CLUB; break;
            case 1:
                g_CardType = DIAMOND; break;
            case 2:
                g_CardType = HEART; break;
            case 3:
                g_CardType = SPADE; break;
            }
            // j % 13 结果是 0——12
            g_pCard = new CARD(g_CardType + j % 13);
            // 加入vector容器
            g_CardList[i * CARDCOUNT + j] = g_pCard;
        }
}

void RiffleCard()
{
    int r;
    CARD* temp;
    srand((unsigned)time(NULL));
    for(int i = 0; i < CARDTOTAL; i ++)
    {
        r = rand() % CARDCOUNT;
        temp = g_CardList[i];
        g_CardList[i] = g_CardList[r];
        g_CardList[r] = temp;
    }        
}

void ShowCard(BYTE cardPoint)
{
    // 取模0xf0以后根据前一位数判断牌的花色
    switch (cardPoint & 0xf0)
    {
    case 0x00:
        printf("%c", 0x05); break;
    case 0x10:
        printf("%c", 0x04); break;
    case 0x20:
        printf("%c", 0x03); break;
    case 0x30:
        printf("%c", 0x06); break;
    }
    // 取模0x0f以后根据后一位数判断牌的点数
    switch (cardPoint & 0x0f)
    {
    case 0x0a:
        printf("10 "); break;
    case 0x0b:
        printf("J "); break;
    case 0x0c:
        printf("Q "); break;
    case 0x0d:
        printf("K "); break;
    case 0x0e:
        printf("A "); break;
    default:
        printf("%d", cardPoint & 0x0f); break;
    }
}

void ShowAllCard()
{
    for (int i = 0; i < CARDTOTAL; i ++)
        ShowCard(g_CardList[i]->getPoint());
}

void ClearCard()
{
    for (int i = 0; i < CARDTOTAL; i ++)
        SAFE_DELETE(g_CardList[i]);
}

void DealCard(BYTE& banker, BYTE& player)
{
    for (int i = 0; i < 2; i ++)
    {
        // 从最后一个元素开始发牌,先发玩家再庄家
        ((i == 0) ? player : banker) = g_CardList[-- g_Num]->getPoint();
        SAFE_DELETE(g_CardList[g_Num]);
    }
}

void TakeCard(BYTE& banker, BYTE& player)
{
    BYTE temp[3];
    // 从容器尾部抽三张牌
    for (int i = 0; i < 3; i ++)
    {
        temp[i] = g_CardList[-- g_Num]->getPoint();
        SAFE_DELETE(g_CardList[g_Num]);
    }

    // 随机发给玩家和庄家
    srand((unsigned)time(NULL));
    int r = rand() % 3;
    player = temp[r];
    if ((++ r) > 2)
        r = 0;
    banker = temp[r];
}

int CompareCard(BYTE& banker, BYTE& player)
{
    if ((g_Banker & 0x0f) > (g_Player & 0x0f))
        return -1;
    else if ((g_Banker & 0x0f) < (g_Player & 0x0f))
        return 1;
    else
    {
        if ((g_Banker & 0xf0) > (g_Player & 0xf0))
            return -1;
        else if ((g_Banker & 0xf0) < (g_Player & 0xf0))
            return 1;
    }

    return 0;
}

bool CheckIn(char c, const char t)
{
    // 根据字符大小写判断是否输入正确
    if ((c != t) && (c != t - 32))
        return false;

    return true;
}


回复列表 (共1个回复)

沙发

那位大侠帮帮小弟吧,不然两个学分就没了。
输出格式如下:
是否开始游戏?(Y or N)
y
检测到你的存档记录,是否要加载?(Y or N)
n
第1局。
请下注。(你共有1000赌资)
你是否愿意在平局区下注?(平局区的赔率是10:1哦! Y or N)
n
下注:--
你的注为:--
庄家开始发牌,分别抽出一张牌给你和他自己。
庄家的牌是:--
你的牌是:--
你的牌大,恭喜你赢了!
是否继续?(Y or N)
    .
    .
    .
庄家的牌大,庄家赢。
你已经输光了,留条内裤滚回家去吧!
游戏结束。是否保存你的记录?(Y or N)

我来回复

您尚未登录,请登录后再回复。点此登录或注册