要求如下:
数组与函数
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函数结束
虽然没有按要求。但是改改还能用上。。