#include<iostream.h>
#include<stdlib.h>//用于随机数列发生器rand()和pause(),system()函数
#include<string.h>
#include<time.h>
#include<conio.h>//用于函数getch()
#include <stdio.h>
#define SUPER_CODE "123456789987"//超级用户密码
#define HIGH_CODE "123456789987"//高级用户密码
int random(long hi,long lo)//取两个参数之间的随机整数
{ int ran;
srand((unsigned)time(NULL));//初始化随机数种子,使rand起始位置发生变化
ran=rand()%(hi-(lo-1))+lo;
return(ran);
}
void wait(int milli)//暂停milli分秒
{ clock_t start;
start=clock();
while((clock()-start)<milli);
}
class Game
{
public:
Game()//初始构造函数
{
win=0,lose=0,draw=0,playerturns=0,cputurns=0,money=100,bet=0;
player=0,cpu=0;
};
void rules();//显示规则给玩家看
void BET(); //下注
void deal();//交易
void run(Game &);//进行异常处理
void next1();//拿下一张牌
void next2();//确保庄家点数大于16
void print();//打印出最后结果
void results();//最后的胜利结果
void check();//检验是否爆庄
void replay(char &ans);//是否进行新一轮的游戏
void clean();//清屏
private:
int playerturns,cputurns,money;
int win,lose,draw,bet;
float player,cpu;
char answer1[12];
char answer2[12];
};
void Game::rules()//让玩家了解游戏规则
{
cout<<endl;
cout<<"\t\t\t 这里是游戏规则:"<<endl;
cout<<"\t\t\t一、每轮游戏你最多只可以有5张牌。"<<endl;
cout<<"\t\t\t二、如果你的点数超过21将输掉这轮游戏。"<<endl;
cout<<"\t\t\t三、每次要牌后都可以设定赔率。"<<endl;
cout<<"\t\t\t四、如果你赢了,你将得到2倍的注金。"<<endl;
cout<<"\t\t\t五、庄家牌点数不会小于16点。"<<endl;
cout<<"\t\t\t祝您好运!\n";
cout<<"\t\t\t";
system("pause");
}
void Game::BET()//下注
{
system("cls");//执行系统命令cls清屏
cout<<"\t\t\t你的资本:$"<<money<<endl;
cout<<"\t\t\t你想下多少赌注?: ";
cin>>bet;
if(bet<0)
{
bet=bet*-1;
}
if(money-bet>=0)
{
money-=bet;
}
else
{
cout<<"\t\t\t重新下注: ";
cin>>bet;
while(money-bet<0)
{
cout<<"\t\t\t重新下注: ";
cin>>bet;
}
money-=bet;
}
}
void Game::deal()//交易
{
int playercard1,playercard2,cpucard1,cpucard2;
float ccard1,ccard2,pcard2,pcard1;
playerturns=2;//开始给玩家发两张牌
cputurns=2;//庄家也发两张牌
playercard1=random(13,1);//在1到13中找出一个随机数
cout<<"*****正在洗牌,请您稍等一会*****"<<endl;
wait(400);
playercard2=random(13,1);
wait(200);
cout<<"["<<playercard1<<"]";
cout<<"["<<playercard2<<"]";
if(playercard1>10)//大于十的牌点数全部置为0.5
{
pcard1=0.5,player=pcard1,playercard1=0;
}
if(playercard2>10)//大于十的牌点数全部置为0.5
{
pcard2=0.5,player+=pcard2,playercard2=0;
}
player+=playercard1+playercard2;//总点数
cout<<"\t\t\t你现在的点数为:"<<player<<endl;
cout<<endl;
cpucard1=random(13,1);
wait(350);
cpucard2=random(13,1);
cout<<"\t\t\t庄家有一张 "<<cpucard1<<" 为正面牌!"<<endl;
cout<<"[*] "<<" ["<<cpucard1<<"]";
if(cpucard1>10)//大于十的牌点数全部置为0.5
{
ccard1=0.5,cpu=ccard1,cpucard1=0;
}
if(cpucard2>10)//大于十的牌点数全部置为0.5
{
ccard2=0.5,cpu+=ccard2,cpucard2=0;
}
cpu+=cpucard1+cpucard2;//总的点数
cout<<endl;
}
//======================================================================================
void Game::run(Game &c2)//进行异常处理
{
char ans;
do{
int m=0;
system("cls");//执行系统命令cls
c2.clean();//进行新的一轮游戏!
c2.check();//检验是否爆庄
c2.BET(); //进行下注
c2.deal(); //先发两张牌
do{
if(playerturns>5)
cout<<"你已经不能再要牌了!"<<endl;
do{
try{ //开始捕获异常处理
cout<<"\t\t\t你愿意继续吗?(y愿意,n否):";
m=0;
cout.flush();//刷新流
cin>>ans;
cin.ignore(20,'\n');//把输入行中的其余字符取空,以便后面的输入从新一轮开始
if((ans=='y')||(ans=='Y')||(ans=='n')||(ans=='N')) break;
else throw ans;//产生异常事件
}
catch(char)//开始处理异常机制
{
cout<<"你的输入有误!:(请重新输入"<<endl;
m=1;
}
catch(...){
cout<<"你的输入有误!:(请重新输入"<<endl;
m=2;
}
}while(m!=0);
if((ans=='Y')||(ans=='y'))
{
playerturns++;
if(playerturns>5)
{
cout<<"\t\t\t你所拥有的牌不能多于5张!"<<endl;
}
}
if((playerturns<6)&&(ans=='y'))
{
cout<<endl;
c2.next1();
}
}while((ans=='y')||(ans=='Y'));
for(;(cpu<16)&&(cputurns<6);cputurns++)
{
cout<<endl;
cout<<"\t\t\t庄家得到一张牌!"<<endl;
c2.next2();
}
cout<<endl;
cout<<endl;
cout<<"\t\t\t庄家的点数为:"<<cpu<<endl; //显示庄家的总点数
cout<<"\t\t\t你的点数为:"<<player<<endl;//显示玩家的总点数
cout<<endl;
c2.results(); //看你是否赢了
c2.replay(ans);
}while((ans=='y')||(ans=='Y'));
}
//==========================================================================================
void Game::next1()//取下一张并把它加入总和
{ int card=0,copycard=0,bet1=0,scard;
int i=0,j;
char ch;
float cards=0,scards=0;
char ans,s1[100];
char answer1[]=HIGH_CODE;
char answer2[]=SUPER_CODE;
card=random(13,1);//1--13随机
copycard=card;//复制一份
if(card>10)
{ cards=0.5,card=0;}//如果是JOK 算半点
player+=cards+card;//加到玩家总点数
cout<<"高级(超级)玩家可以看牌,你是否要事先看牌?(y or n):";
cin>>ans;
password1: if(ans=='y'||ans=='Y'){ //看玩家是否想看牌
for(int i=0;i<999;i++)
{
j=0;
cin.ignore(20,'\n');//把输入行中的其余字符取空,以便后面的输入从新一路轮开始
cout<<"请输入12位密码:";
cout<<"输入Enter表示密码输入结束";
//#define N 13
cout.flush();//提取密码
ch=getch();//获取一个字符
while(ch!=13) //当上一个获取的字符不是回车时循环
{ //如果是回车 跳出循环 到}外的第一句
s1[j++]=ch;//把字符放入数组
cout<<'*';//输出*代替字符
cout.flush();//清空输出流
ch=getch();//再次获取一个字符 跳到while判断是不是回车
}
s1[j]=0;//把输入的字符串放到s1里
if(strlen(s1)!=12)cout<<"对不起,你输入的密码错误!"<<endl;//判断密码的长度是否等于12
else break;
}
if(strncmp(s1,answer1,12)==0)//比较字符串
{
cout<<"\t\t\t这张牌是:"<<copycard<<endl;
cout<<"你是否要这张牌(y or n)"<<endl;
cin>>ans;
if((ans=='y')||(ans=='Y'))
{
cout<<"\t\t\t你的总点数为 :"<<player<<endl;
}
else {
playerturns--;
if(cards==0.5)player-=cards;
else player-=copycard;
cout<<"\t\t\t你的总点数为 :"<<player<<endl;
}
}
//高级玩家看牌
else{
cout<<"对不起,你输入的密码错误!不能看牌"<<endl;
cout<<"是否再次输入密码(yes or no)?"<<endl;
cin>>ans;
if(ans=='y'||ans=='Y')
goto password1;
else {
cout<<"\t\t\t总点数是:"<<player<<endl;
}
}
}
cout<<"超级玩家可以指定下一张牌,是否指定(y or n):";
cin>>ans;
if((ans=='y')||(ans=='Y')) //超级玩家可以指定牌
{ playerturns++;
for(int i=0;i<999;i++)
{ j=0;
cin.ignore(20,'\n');//把输入行中的其余字符取空,以便后面的输入从新一路轮开始
cout<<"请输入12位密码:";
cout<<"输入Enter表示密码输入结束";
// #define N 13
cout.flush();
ch=getch();
while(ch!=13)
{ s1[j++]=ch;
cout<<'*';
cout.flush();
ch=getch();
}
s1[j]=0;//提取密码
if(strlen(s1)!=12)cout<<"对不起,你输入的密码错误!"<<endl;//判断密码的长度是否等于12
else break;
}
password2: if(strncmp(s1,answer2,12)==0)//比较字符串
{ cout<<"请输入你指定的牌"<<endl;
cin>>scard;
if(scard>10)
{ scards=0.5;}
if(scards==0.5)
{
player=player-cards-card;
player=player+scards;
}
else
{
player=player-cards-card;
player=player+scard;
}
cout<<"你的总点数是"<<player<<endl;
}
else{
cout<<"对不起,你输入的密码错误!不能看牌"<<endl;
cout<<"是否再次输入密码(yes or no)?"<<endl;
cin>>ans;
if(ans=='y'||ans=='Y')
goto password2;
}
}
else {
cout<<"\t\t\t总点数为 :"<<player<<endl;
}
cout<<"是否加注(y or n):";
cin>>ans;
if(ans=='y'||ans=='Y'){
cout<<"你的现金还有$"<<money<<endl;
cout<<"你要加多少注?(你也可以不加)";
cin>>bet1;
if(bet1<0)
{
bet1=bet1*-1;
}
if(money-bet1>=0)
{
money=money-bet1;
bet+=bet1;
}
else
{
cout<<"余额不足,加注失败!\n";
}
}
}
void Game::next2()//确保庄家点数大于16
{
int card=0,copycard=0;
float cards=0;
card=random(13,1);//调用函数
copycard=card;
cout<<"这张牌是:"<<card;
if(card>10)
{
cards=0.5,card=0;
}
cpu=cpu+cards+card;
if(cpu>21){
if(cards==0)cpu-=copycard;//当card小于10但总数大于21时执行
else cpu-=cards; //当card大于10且点数大于21时执行
cout<<"\t\t\t总点数为:"<<cpu<<endl;
}
if(cpu<16)//确保庄家点数大于等于16
{
cpu=16;
cout<<"\t\t\t总点数是:"<<cpu<<endl;
}
}
//============================================================================================
void Game::results()//找出赢家
{
if(cpu==player)
{
cout<<"\t\t\t***********点数一样,你们平了!**********"<<endl;
draw++;
money+=bet;
}
if(player>21)
{
cout<<"\t\t\t*******:(不好意思,你爆了!:(*************"<<endl;
lose++;
}
else
{
if(cpu<player)
{
cout<<"\n\t\t\t********^*^恭喜你,你赢了!^*^*********";
money=money+(bet*2);
win++;
}
}
if(cpu>21)
{
cout<<"\t\t\t*********^*^恭喜你,庄家爆了!^*^***********"<<endl;
if(player<21)
{
cout<<"\n\t\t\t*********^*^恭喜你,你赢了!^*^********* ";
win++;
money=money+(bet*2);
}
}
else
{
if(cpu>player)
{
cout<<"\t\t\t**********:(很遗憾,你输了!:(**********"<<endl;
lose++;
}
}
}
//======================================================================================
void Game::clean()//清零
{
win=this->win,lose=this->lose,draw=this->draw,playerturns=0,cputurns=0,money=this->money,bet=0,player=0,cpu=0;
}
//==========================================================================================
void Game::replay(char &ans)//是否继续游戏
{
cout<<"\n\t\t\t你是否想继续游戏(yes or no)?";
cin>>ans;
}
//===========================================================================================
void Game::check()
{
if(money<=0) //检查钱的多少
{
cout<<":(对不起,你输光了,你不能玩了!:("<<endl; //检查你是否可以继续游戏
exit(0);
}
}
//========================================================================================
void Game::print()//打印最后结果
{
//void sign();
cout<<"\t\t\t\t赢 :"<<win<<endl;
cout<<"\t\t\t\t负 :"<<lose<<endl;
cout<<"\t\t\t\t平 :"<<draw<<endl;
cout<<"\t\t\t\t余额 :"<<money<<endl;
if(money<=-1000)cout<<"\t\t\t:(你输的真惨啊:("<<endl;
}
//========================================================================================
int main()
{
system("mode con cols=120 lines=30");//设置控制台输出大小
Game c2;
char ans;
c2.rules();//调用函数
cout<<"游戏可以开始了吗?(y or n):";
cin>>ans;
if((ans == 'y')||(ans=='Y')) //看你是否想要进行游戏
{
cout<<"\t\t\t你现在拥有的赌本为$100!"<<endl; //设定起始赌金
cout<<"\t\t\t"<<flush;//刷新流
system("pause");
}
else //如果否退出游戏
{
cout<<"您的输入有误!"<<endl;
return(0);
}
c2.run(c2);//进行游戏
c2.print();//输出最后结果
cout<<endl;
cout<<"欢迎再次进入21点扑克牌游戏世界!"<<endl;
return(0);
}
21点扑克牌游戏
最新推荐文章于 2020-01-13 16:35:23 发布