永发信息网

21点游戏的C++代码

答案:2  悬赏:50  手机版
解决时间 2021-05-12 03:04

要求如下:

数组与函数

1. 实验目的:掌握数组与函数的使用方法,掌握,面向过程的程序设计方法,复习分支与循环语句的使用。

2. 实验内容:设计一个21点的游戏,游戏规则如下:

两个玩家,一个是人,一个是电脑。首先由电脑随机派两张牌给人类玩家(牌不能重复,牌的表示方式为 花色牌号,如红桃8),然后玩家通过自己判断再选择是否继续要牌。如果要,则继续随机派给玩家一张牌,若此时所有牌的点数之和大于21,则判断玩家为输,如果不是,则玩家可以继续选择要牌与否。如果不要牌,则人类玩家阶段结束。轮到电脑。电脑阶段与玩家阶段基本相同。电脑首先自己要两张牌,然后由电脑自己判断是否继续要牌,判断的最重要依据是刚好赢人类玩家就收手。而输赢是按照两家的点数与牌数,赢的一方是点数较大的一方,若点数相同,则取牌数量更多的一方胜,若牌数也一样,则不分胜负。

点数的计算方式为:不论花色(红桃,黑桃,梅花,方块),数字牌(2到10)按照数字算,A按照1来算, J,Q,K均算成0.5点。

3. 难点提示:1.由于牌是不能重复,可以把纸牌当成一个全局数组,2.细分程序为各种功能的函数,可以大致分成这几个函数:洗牌(将玩家手中的牌收回),发牌(随机发给玩家一张牌),显示牌号(将数组映射成相应的扑克牌),玩家阶段(包括发牌,要牌,判断是否超过21点了),电脑阶段,判断输赢阶段(在双方点数均不超21点的情况下)。

4. 标准输入输出:加粗加大的是输入部分

第一种情况:玩家超过21点了

玩家阶段

玩家获得牌 梅花5 方块8

是否继续要牌(y/n):y

继续要一张牌:梅花5 方块8 红桃10

玩家输了

是否继续(y/n):n

第二种情况:

玩家阶段

玩家获得牌 红桃7 方块Q

是否继续要牌(y/n):y

继续要一张牌:红桃7 方块Q 红桃3

是否继续要牌(y/n):y

继续要一张牌:红桃7 方块Q 红桃3 梅花8

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 方块8 红桃4

继续要一张牌:方块8 红桃4 红桃J

继续要一张牌:方块8 红桃4 红桃J 梅花5

继续要一张牌:方块8 红桃4 红桃J 梅花5 红桃8

玩家赢了

是否继续(y/n):n

第三种情况:

玩家阶段

玩家获得牌 红桃2 黑桃Q

是否继续要牌(y/n):y

继续要一张牌:红桃2 黑桃Q 方块10

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 红桃4 方块K

继续要一张牌:红桃4 方块K 红桃6

继续要一张牌:红桃4 方块K 红桃6 梅花10

玩家输了

是否继续(y/n):n

第四种情况:

玩家阶段

玩家获得牌 黑桃6 方块5

是否继续要牌(y/n):y

继续要一张牌:黑桃6 方块5 红桃9

是否继续要牌(y/n):y

继续要一张牌:黑桃6 方块5 红桃9 红桃Q

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 梅花7 黑桃8

继续要一张牌:梅花7 黑桃8 黑桃A

继续要一张牌:梅花7 黑桃8 黑桃A 黑桃3

继续要一张牌:梅花7 黑桃8 黑桃A 黑桃3 黑桃2

玩家输了

是否继续(y/n):n

最佳答案

#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函数结束



虽然没有按要求。但是改改还能用上。。

全部回答
JS代码不行?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
夏普的液晶屏幕是最好的吗?
关于鞋面儿脱胶
执业药师就要考试了,没时间看书怎么办?
小学男女诗歌朗诵大全,求一篇励志的诗歌,适
我想问做餐厅如果做才能更吸引顾客来消费?如
那本小说的男主角叫蓝宸魅?
认为怎样才能做到安全生产?
生理性脱发是什么意思啊
在银行开了张银行卡,怎样才能知道自己的账号
名侦探柯南哪集毛利小五郎的老婆回来了!
聪明好学的诗句,关于学习的诗句是
现在摆夜市什么好卖?
吃什么可以把月经推迟,吃什么使绝经期推迟
女方是独生女,男方入赘女方,男方的户口可以
我要工作!!!!
推荐资讯
tamas wells
梦幻西游69比武?
立秋给客户祝福信息,夏天给客户发什么祝福短
火炬铂金火花塞怎么样,看了不会被4S店忽悠,
想问你央美城院的问题
惠普CQ40装XP系统 WDMWinxpSTHDA.inf 在哪里
表达两个人不合适句子,描写恋人在水中相吻的
寻仙奇门给服装加点,加哪种决啊?
花瓣为希澈唱的歌有哪些
谁有卡巴斯基2011的序列号或key
哪有这样的鞋卖?
PS2皇牌空战
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?