主题:希望大侠们帮帮小弟,能帮我解决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;
}
顺便大侠写的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;
}