- #include<iostream>
- #include<string>
- #include<time.h>
- using namespace std;
- #define NUM 1000
- int j=2;//定义为全局变量
- int randNum[NUM];//因为rand()函数有一定的缺陷,所以在程序中定义了randNum数组来存放随机数
- //即使使用了种子函数srand(),由于程序运行时间比较短,也不太好设置种子。因此
- 使用数组来存放随机数
- class Poker
- {
- private:
- int poker[53]; //扑克
- int pokerValue[53]; //扑克代表的数值
- string pokerName[53]; //扑克名
- int money; //玩家钱数
- int bet; //玩家的赌注
- int pokerF[5]; //玩家手中的牌 F:Farmer L:Landlord
- int pokerL[5]; //庄家手中的牌 F:Farmer L:Landlord
- int pokerNumF; //玩家手中的牌数
- int pokerNumL; //庄家手中的牌数
- public:
- Poker(); //构造函数,对牌初始化
- void initPoker(); //洗牌,在每轮游戏开始前进行
- string getPokerF(); //用字符串的形式返回玩家的牌
- string getPokerL(); //用字符串的形式返回庄家的牌
- int getSumF(); //返回玩家牌的点数,用以判断是否超过21点
- int getSumL(); //返回庄家牌的点数
- void farmerAsk(); //玩家要牌
- void landlordAsk(); //庄家要牌
- void inputBet(); //玩家输入赌注
- void newGame(); //开始新游戏
- void landlordProcess(); //在玩家不要牌时进行处理
- };
- Poker::Poker()
- {
- poker[0]=0;
- for(int i=1;i<=13;i++) //|
- { //|
- poker[i]=i; //|用构造函数对牌初始化
- poker[i+13]=i; //|
- poker[i+26]=i; //|
- poker[i+39]=i; //|
- }//for结束
- pokerValue[0]=0;
- for(i=1;i<=52;i++)
- {
- if(poker[i]<=10) pokerValue[i]=poker[i];
- else pokerValue[i]=10;
- }//for结束
- pokerName[0]="";
- for(i=0;i<4;i++)
- {
- pokerName[1+13*i]="A";
- pokerName[2+13*i]="2";
- pokerName[3+13*i]="3";
- pokerName[4+13*i]="4";
- pokerName[5+13*i]="5";
- pokerName[6+13*i]="6";
- pokerName[7+13*i]="7";
- pokerName[8+13*i]="8";
- pokerName[9+13*i]="9";
- pokerName[10+13*i]="10";
- pokerName[11+13*i]="J";
- pokerName[12+13*i]="Q";
- pokerName[13+13*i]="K";
- }//for结束
- money=200; //玩家开始玩游戏时钱数是200
- bet=0;
- for(i=0;i<5;i++)
- {
- pokerF[i]=0; //|对pokerOfFarmer初始化
- pokerL[i]=0; //|对pokerOfLandlord初始化
- }
- pokerNumF=0;//玩家手中的牌数初始化为0
- pokerNumL=0;//庄家手中的牌数初始化为0
- srand((int)time(0));
- for(i=0;i<NUM;i++)
- {
- randNum[i]=rand()*51/32767+1;//产生随机数数组
- }
- }//构造函数Poker()结束
- void Poker::initPoker()
- {
- cout<<"新一局游戏开始,开始洗牌>>>>>"<<endl;
- pokerF[0]=randNum[j++]; //产生1-52的随机数
- pokerF[1]=randNum[j++]; //产生1-52的随机数
- pokerL[0]=randNum[j++]; //产生1-52的随机数
- pokerL[1]=randNum[j++]; //产生1-52的随机数
- pokerNumF=2;
- pokerNumL=2;
- cout<<"洗牌完成,你的牌为:"<<getPokerF()<<endl;
- }//void Poker::initPoker()结束
- string Poker::getPokerF()//用字符串的形式返回玩家的牌
- {
- int i;
- string result="";
- for(i=0;i<pokerNumF;i++)
- result=result+pokerName[pokerF[i]]+" ";
- return result;
- }//string Poker::getPokerF()结束
- string Poker::getPokerL()//用字符串的形式返回庄家的牌
- {
- int i;
- string result="";
- for(i=0;i<pokerNumL;i++)
- result=result+pokerName[pokerL[i]]+" ";
- return result;
- }//string Poker::getPokerL()结束
- int Poker::getSumF() //返回玩家的总点数
- {
- int result=0;
- for(int i=0;i<pokerNumF;i++)
- result=result+pokerValue[pokerF[i]];
- return result;
- }
- int Poker::getSumL()//返回庄家的总点数
- {
- int result=0;
- for(int i=0;i<pokerNumL;i++)
- result=result+pokerValue[pokerL[i]];
- return result;
- }
- void Poker::farmerAsk()
- {
- if(pokerNumF>=5)
- {
- cout<<"你的牌数已够5张,不能再要牌了"<<endl;
- landlordProcess();
- }
- else
- {
- pokerF[pokerNumF++]=randNum[j++]; //产生1-52的随机数
- cout<<"你的牌为:"<<getPokerF()<<endl;
- if(getSumF()>21)
- {
- cout<<"你撑死了,你输了"<<bet<<"元"<<endl;
- money=money-bet;
- if(money<=0)
- {
- cout<<"你已经输光了,哈哈"<<endl;
- cout<<"游戏结束"<<endl;
- exit(0);
- }
- inputBet();
- initPoker();
- }
- else if(getSumF()==21)
- {
- landlordProcess();
- }
- }
- }
- void Poker::landlordAsk()
- {
- if(pokerNumL>=5)
- {
- if(getSumF()>getSumL())
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"你赢了,你赢了"<<bet<<"元"<<endl;
- money=money+bet;
- inputBet();
- initPoker();
- }
- else if(getSumF()==getSumL())
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"平手"<<endl;
- inputBet();
- initPoker();
- }
- else if(getSumF()<getSumL())
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"你输了,你输了"<<bet<<"元"<<endl;
- money=money-bet;
- if(money<=0)
- {
- cout<<"你已经输光了,哈哈"<<endl;
- cout<<"游戏结束"<<endl;
- exit(0);
- }
- inputBet();
- initPoker();
- }
- }
- else
- {
- pokerL[pokerNumL++]=randNum[j++]; //产生1-52的随机数
- if(getSumL()>21)
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"庄家撑死了,你赢了"<<bet<<"元"<<endl;
- money=money+bet;
- inputBet();
- initPoker();
- }
- else landlordProcess();
- }
- }
- void Poker::inputBet()
- {
- cout<<"你现在有"<<money<<"元,请输入赌注:";
- do
- {
- cin>>bet;
- if(bet>money)
- cout<<"笨蛋,你没那么多钱,少来,重新输入吧:";
- }while(bet>money);
- }
- void Poker::newGame()
- {
- inputBet();
- initPoker();
- cout<<"你得到的牌为:"<<getPokerF()<<endl;
- }
- void Poker::landlordProcess()
- {
- if(getSumL()>=17)
- {
- if(getSumL()>getSumF())
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"庄家获胜,你输了"<<bet<<"元"<<endl;
- money=money-bet;
- if(money<=0)
- {
- cout<<"你已经输光了,哈哈"<<endl;
- cout<<"游戏结束"<<endl;
- exit(0);
- }
- inputBet();
- initPoker();
- }
- else if(getSumF()==getSumL())
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"本次游戏平手"<<endl;
- inputBet();
- initPoker();
- }
- else
- {
- cout<<"庄家的牌为"<<getPokerL()<<endl;
- cout<<"你赢了,你赢了"<<bet<<"元"<<endl;
- money=money+bet;
- inputBet();
- initPoker();
- }
- }
- else
- {
- landlordAsk();
- }
- }
- int main()
- {
- int choose=1;
- Poker poker;
- cout<<"****************** 欢迎玩二十一点游戏 ******************"<<endl<<endl;
- poker.inputBet();
- poker.initPoker(); //洗牌
- while(choose==1||choose==2||choose==3||choose==4)
- {
- cout<<"1.要牌 2.不要牌 3.重新开始 4.退出 >>请输入数字选择操作:";
- cin>>choose;
- if(choose==1) poker.farmerAsk();
- else if(choose==2) poker.landlordProcess();
- else if(choose==3) poker.newGame();
- else if(choose==4) exit(0);
- }
- return 0;
- }//main函数结束
来源: http://www.phpxs.com/code/1004222/