21点扑克牌游戏

#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);
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值