📄 扑克牌游戏.cpp
字号:
/*第1题 扑克牌游戏*/
//编游戏者:顾波波 03303176
//*******************preprocessor directives***********************
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h> // 用来产生随机抽取数
//******************************************************************
class Playing_Card //扑克类
{
private:
int m_Value; //扑克的值
char m_Face[3]; //扑克的数字大小
char m_Suit ; //扑克的花色(黑、红、梅、方)
public:
Playing_Card(); // 扑克类的构造函数
int getvalue(); // 成员函数,用于取扑克的值
void showcard(); // 显示扑克的数字大小和花色
void Card_Make(int); // 给各张牌置面值,数字大小,花色
};
class Deck //一副扑克(54张)
{
private:
Playing_Card m_cardarray[54]; // 定义扑克类数组
int m_lastdelt; // 定义变量,表示扑克编号
public:
Deck(); // 初始化构造函数
void MakeDeck() ; // 创建一副完整的扑克牌
void Deal_One(); // 从扑克牌的最顶上发一张牌
void ShowDeck(); // 在屏幕上显示扑克牌
void DeckShuff(int); // 洗牌(次数为刮号里的整数)
void showleftdeck(); // 移去用过的牌并显示
void Remove_Card(); // 任意移去一张牌
void showremainingDeck(); // 显示剩下的牌
void SendDeck1(); // 把牌分发给四个玩家(删牌后的)
void SendDeck2(); // 把牌分发给四个玩家(不删牌的)
};
//***************************prototypes**********************************
void Program_Init(); // 程序信息函数
int main(); // 主函数
void Center_Text(char []); // 输出刮号里的内容
int get_number(); // 从用户取一个整数
char Get_Key(); // 程序停止,从用户取一个字符
void DeckMakeDriver(); // 测试扑克牌的各项功能
int getRandInt(int min, int max); // 随机抽取一个数
void prog_close(); // 在程序终止前停止程序
//****************************Main*************************************
int main() //主函数,用来测试各种功能
{
srand( (unsigned)time( NULL ) ); // 产生随机数
int Card_Number = 0;
Program_Init(); // 显示标题
char t;
do{
DeckMakeDriver(); // 扑克牌主要功能测试函数
cout<<"要继续玩吗?要按Y不要按N"<<endl;
cin>>t;
t=toupper(t);
}while(t=='Y');
prog_close(); // 程序终止提示
return 1;
}
Deck :: Deck() // 初始化构造函数
{
int lastdelt = 0;
int i;
for(i=0;i<=53;i++)
{
m_cardarray[1] = Playing_Card();
}
}
Playing_Card::Playing_Card() // 扑克牌类初始化构造函数
{
int i;
for(i=1;i<=3;)
{
m_Face[i] = ' '; //置默认值为空
i++;
}
m_Suit = ' '; //置默认值为空
m_Value = 0; //默认值为0
}
void Program_Init() // 在程序开始时输出程序信息
{
Center_Text("扑克牌游戏"); //输出“扑克牌游戏 ”
cout << endl <<"\n" ;
Center_Text("编者:顾波波 03303176"); //输出“编者:顾波波 03303176”
cout << endl <<"\n" ;
Center_Text("(新建一副扑克牌)按回车继续..");//输出“(新建一副扑克牌)按回车继续..”
cin.get();
}
char Get_Key() // 要求用户输入一个字符并返回这个字符
{
char x;
x = cin.get(); // 取一个字符
cout << endl;
return x; // 返回字符
}
int Playing_Card::getvalue() // 成员函数,用于取扑克的值
{
return m_Value; // 返回扑克的值
}
void Playing_Card::showcard() // 输出扑克牌的数值和花色
{
cout << " ";
cout << m_Face ; // 输出数值
cout.width(1);
cout << m_Suit; // 输出花色
cout << " ";
}
void Center_Text(char ShellText[80]) // 输出刮号里的提醒信息
{
int length; //定义长度变量
int center; //定义变量
length= strlen(ShellText); //取字符串长度
center = (80 - length)/2;
for(;center!=0;center--) //输出空格
{
cputs(" ");
}
cputs(ShellText); //输出提醒信息
}
int get_number() //要求用户输入一个整数,并返回这个整数
{
int Input_Integer = 0;
Center_Text("Please enter an integer between 0 and 51. 52 to quit.");
cout << endl;
cin >> Input_Integer; // 输入一个整数
return Input_Integer; // 返回整数
}
void Playing_Card::Card_Make(int num) // 给各张牌置面值,数字大小,花色
{
if(num>=52)
switch(num)
{case 52:strcpy(m_Face," w");break; //置小王
case 53:strcpy(m_Face," W");break;} //置大王
else{
int i = 0;
char j;
int face_num = num % 13; // 牌的数字大小
if(face_num <= 9)m_Value = face_num + 1; // 给牌置面值
if(face_num >= 10)m_Value = 10;
switch(face_num) // 给牌置数字大小
{
case 0: strcpy(m_Face," A");break;
case 9: strcpy(m_Face,"10");break;
case 10: strcpy(m_Face," J");break;
case 11: strcpy(m_Face," Q");break;
case 12: strcpy(m_Face," K");break;
default:
j = char(face_num + 49);
if(i<3)
{
m_Face[i] = ' '; i++;
m_Face[i] = j;i++;
m_Face[i] = NULL;
break;
}
}
}
if(num <= 12)m_Suit = 6; // 给牌置花色
if(num >12 && num <= 25)m_Suit = 3; // 给牌置花色
if(num >25 && num <= 38)m_Suit = 5; // 给牌置花色
if(num >38 && num <= 51)m_Suit = 4; // 给牌置花色
if(num >51 && num <= 53){m_Suit = 1;m_Value = 10;} // 给大小王置色
}
void DeckMakeDriver() //主要功能测试函数
{
Deck deck_1; //定义一个扑克类
deck_1.MakeDeck(); // 建一副扑克牌
deck_1.ShowDeck(); // 在屏幕上显示牌
cout<<endl<<" 按回车洗牌";
Get_Key(); // 程序暂停
deck_1.DeckShuff(250); // 洗牌250次
deck_1.ShowDeck(); // 在屏幕上显示牌
cout<<endl<<"你要删去其中任意一张吗?要按Y不要按N。"<<endl; // 提醒信息
char x,d;
cin>>x; // 输入字符
x=toupper(x); // 转换为大写
if(x=='Y') {deck_1.Remove_Card(); deck_1.showremainingDeck();}//删去任意一张,再显示
else cout<<endl;
cout<<endl<<"你想分发给四个玩家还是一张一张发?前者按S后者按D。"<<endl;
cin>>d;
d=toupper(d);
if(d=='S'){
if(x=='Y')deck_1.SendDeck1(); //把牌分发给四个玩家( 删牌后的)
else deck_1.SendDeck2(); //把牌分发给四个玩家( 不删牌的)
}
else if(d=='D')
{
char y;
do
{
deck_1.Deal_One(); //一张一张发牌
cout << endl;
cout <<endl<<"你想把发过的牌删去并显示剩余的牌吗?是按Y,不是按N。";
cin>>x;
x=toupper(x);
if(x=='Y')deck_1.showleftdeck(); //删去已发的牌并显示剩下的
else cout<<endl;
cout << endl << endl << "继续发牌按Y,要停止按N。"<< endl; // 选择是否继续
cin >> y;
y = toupper(y);
}while(y == 'Y' );
}
else cout<<"error!";
}
void Deck::MakeDeck() // 建一副完整的扑克牌
{
m_lastdelt = 53;
while(m_lastdelt >-1) // 循环直到牌建满为止
{
m_cardarray[m_lastdelt].Card_Make(m_lastdelt);// 为每张牌置面值,大小,花色
m_lastdelt--;
}
}
void Deck::ShowDeck() //显示扑克牌
{
int index = m_lastdelt + 1;
int newline = 0; //置行数为0
Center_Text("扑克牌从头到尾排列"); // 输出信息
cout << endl;
while(index<=53) //循环输出
{
if(newline % 11 == 0) cout << endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -