当前位置:文档之家› 黑杰克21点程序设计

黑杰克21点程序设计

#include
#include
#include
#include
using namespace std;
#define max 100
#define HoT "\003"
#define HeT "\006"
#define MH "\005"
#define FP "\004"
int poker[15];

//第二幅牌
struct pk
{
int huase[6];
int num[6];
int number;
int sum;
int betting;
};
//玩家属性
struct people
{
int num[6]; //要到的牌大小
int number; //已经有几张
int huase[6]; //花色
int sum; //点数之和
int principal; //本金
int betting[4]; //投注betting[0]:原始投注,betting[1]:保险,betting[2]:投对子
bool ifinsurance; //判断是否买保险
bool ifbettingdyad; //判断是否投对子
bool ifdyad; //判断是否是对子
bool ifdouble; //判断是否加倍
bool ifbjack; //判断是否是黑杰克
bool ifa;
bool ifescape; //是否逃跑
bool ifdivide; //判断是否分牌
int other; //若投注对子投给谁
pk next;
}player[max];
void Showprincipal(int n);

//初始化
void initial(int n)
{
int i;
for(i=0;i{
player[i].ifdyad =false; //初始每人对子都为false
player[i].ifbettingdyad =false; //初始都没投对子
player[i].ifinsurance =false; //初始都没保险
player[i].ifdouble=false; //初始不加倍
player[i].ifbjack=false; //初始不是黑杰克
player[i].ifdivide= false; //初始不分牌
player[i].sum=0; //初始化点数之和
player[i].next .betting =0;
}
for(i=1;i<=13;i++)
poker[i]=0;
}

void cardhuase(int x,int h)
{
if(x==1)
{
printf("┌————┐\n│A │\n│ │\n│ │\n│ ");
switch(h)
{
case 1: printf( HeT );break;
case 2: printf( HoT );break;
case 3: printf( MH );break;
case 4: printf( FP );break;
default:printf("error\n");
}
printf(" │\n│ │\n│ │\n│ A│\n└————┘\n");
}
else if(x==11)
{
printf("┌————┐\n│J │\n│ │\n│ │\n│ ");
switch(h)
{
case 1: printf( HeT );break;
case 2: printf( HoT );break;
case 3: printf( MH );break;
case 4: printf( FP );break;
default:printf("error\n");
}
printf(" │\n│ │\n│ │\n│ J│\n└————┘\n");
}
else if(x==12)
{
printf("┌————┐\n│Q │\n│ │\n│ │\n│ ");
switch(h)
{
case 1: printf( HeT );break;
case 2: printf( HoT );break;
case 3: printf( MH );break;
case 4: printf( FP );break;
default:printf("error\n");
}
printf(" │\n│ │\n│ │\n│ Q│\n└————┘\n");
}
else if(x==13)
{
printf("┌————┐\n│K │\n│ │\n│ │\n│ ");
switch(h)
{
case 1: printf( HeT );break;
case 2: printf( HoT );break;
case 3: printf( MH

);break;
case 4: printf( FP );break;
default:printf("error\n");
}
printf(" │\n│ │\n│ │\n│ K│\n└————┘\n");
}
else
{
printf("┌————┐\n│%2d │\n│ │\n│ │\n│ ",x);
switch(h)
{
case 1: printf( HeT );break;
case 2: printf( HoT );break;
case 3: printf( MH );break;
case 4: printf( FP );break;
default:printf("error\n");
}
printf(" │\n│ │\n│ │\n│ %2d│\n└————┘\n",x);
}
cout<}
//要牌
void Want(people &a)
{
int r; //定义随机变量
while(poker[r=rand()%13+1]>=4); //产生随机数(~13)
int h=abs(rand()*37)%4+1;
poker[r]++;
a.num[a.number]=r;
a.huase[a.number]=h;
a.number+=1;
if(r>10) a.sum+=10;
else a.sum+=r;
}

//加倍
void Double(people & a)
{
a.principal-=a.betting[0];
a.betting[0]*=2; //投注金额加倍
int r;
while(poker[r=rand()%13+1]>=4); //产生随机数(~13)
int h=abs(rand()*37)%4+1;
poker[r]++; //扑克牌中该牌被拿
a.num[a.number]=r; //牌到玩家手中
a.huase[a.number]=h;
a.number+=1; //玩家手牌增加一张
if(r>10) a.sum+=10; //如果是J,Q,K则当点算
else a.sum+=r;
}

//判断是否是对子
void Dyad(int n)
{
int i;
for(i=1;iif(player[i].num[0]==player[i].num[1])
{
player[i].ifdyad=true;
}
}

//投了对子后的得失
void Afterdyad(int n)
{
Dyad(n);
for(int i=1;iif(player[i].ifbettingdyad ==true &&player[player[i].other].ifdyad ==true) //投了对子且投的玩家是对子则获得对子赔偿;
{
player[i].principal +=player[i].betting[2]*12;
player[0].principal -=player[i].betting[2]*11;
player[i].betting[2]=0;
cout<<"闲家"<}
else if(player[i].ifbettingdyad ==true) //投了对子但投的玩家不是对子则输掉对子的押注
{
player[0].principal +=player[i].betting[2];
player[i].betting[2]=0;
cout<<"闲家"<}
}
//逃跑后的得失

void Afterescape(int n)
{
int i;
for(i=0;i{
if(player[0].ifescape==true)
{
for(int j=1;jplayer[j].principal=player[j].principal+player[j].betting[0];
player[0].principal-=player[j].betting[0];
Showprincipal(n);
exit(0);
}
else if(player[i].ifescape==true)
{
player[i].principal=player[i].principal;
player[0].principal=player[0].principal;
for(int jb=1;jbif(jb!=i)
player[jb].principal+=player[jb].betting[0];
Showprincipal(n);
exit(0);
}
}

}

//是否加注对子
void Bettingdyad(int n)
{
char a;
int p,c; //定义几号玩家和投注金额变量

cout<<"是否加注对子:输入Y/N,若Y"<
for(int i=1;i{
cout<<"玩家"<while(cin>>a)
{
if(a=='Y'||a=='y') //投对子
{
cou

t<<"请输入你要下注的玩家以及金额(最高20)"<while(cin>>p>>c)
{
if(p0&&c<=20&&c>0) //输入符合要求
{
player[i].ifbettingdyad =true;
player[i].other =p;
player[i].betting[2]=c;
player[i].principal -=c;
cout<<"玩家"<cout<<"发牌中,请稍等..."<break;
}
else
cout<<"玩家或投注金额输入错误请重新输入投注玩家和金额:"<}
break;
}
else if(a=='N'||a=='n')
{
cout<<"不投注对子"<cout<<"发牌中,请稍等..."<break;
}
else cout<<"输入错误,请重新输入:";
}
}
}

//投注
void Betting(int n)
{
int i;
int betting;
for(i=1;i{
cout<<"玩家"<while(cin>>betting)
{
if(player[i].principal>=betting&&betting>0&& betting<=50) //符合投注要求
{
player[i].betting[0]=betting;
player[i].principal -=betting;
break;
}
else
cout<<"输入错误请重新输入:";
}
}
Bettingdyad(n);
}
void wait(int milli)
{
clock_t start;
start =clock();
while((clock()-start) < milli);
}

//发牌
void Dealing(people &a,int n)
{
for(int i=0;i<2;i++) //随机发牌
{
srand(time(0));
a.huase[i]=abs(rand()*37)%4+1;
a.num[i]=rand()%13+1;
if(a.num[i]<10)
{
a.sum+=a.num[i];
}
else
{
a.sum+=10;
}
wait(750);
}
a.number=2;
if(a.sum==11&&(a.num[0]==1||a.num[1]==1))
{
a.sum=21;
a.ifbjack = true;
cout<} //判断是否是黑杰克
}

//判断是否买保险
void Insurance(int n)
{
int i;
char a;

if(player[0].num[1]==1)
{
cout<<"是否买保险:输入Y/N"<for(i=1;i{
cout<<"闲家"<while(cin>>a)
{
if(a=='Y'||a=='y')
{
player[i].ifinsurance=true;
player[i].betting[1]=player[i].betting[0]/2;
break;
}
else if(a=='N'||a=='n') break;
else cout<<"输入错误,请重新输入:";
}
}
if(player[0].num[0]>=10) //是黑杰克
{
for(i=1;i{
if(player[i].ifinsurance==false)
{
player[0].principal+=player[i].betting[0]; //拿走原始投注
player[i].betting[0]=0;
}
}
}
else //不是黑杰克
{
for(i=1;i{
if(player[i].ifinsurance ==true)
{
player[0].principal +=player[i].betting[1]; //拿走保险
}
}
}
}
}

//显示各玩家还有多少本金
void Showprincipal(int n)
{
int i;

for(i=0;iif(i==0)
cout<<"庄家的本金为:"<else
cout<<"玩家"<}

//庄家是否是点且有张A
int ifaa(people &a)
{
if(a.num[0]==1||a.num[1]==1||a.num[2]==

1||a.num[2]==1||a.num[4]==1)
{
return a.ifa= true;
}

}


void Display(people &a)
{
int i;
for(i=0;icardhuase(a.num[i],a.huase[i]) ;
cout<}
//分牌
void divide(people &a,int n)//n是玩家号
{
a.number = 1;
a.principal -= a.betting[0];
a.sum -= a.num[0];
a.ifdivide=true;
a.ifbjack = false;
a.next.num[0]=a.num[0];
a.next.betting =a.betting[0];
a.next.number = 1;
a.next.sum=a.num[0];

cout<<"玩家"<Display(a);
cout<<"玩家"<for(int i=0;i{
cardhuase(a.num[i],a.huase[i]) ;
cout<}
cout<char type;
int _number;
cout<<"玩家"<while(cin>>type&&a.number < 5 && a.next .number < 5)
{
if(type=='S'||type=='s')
break; //停牌
else if(type=='Y'||type=='y')
{
cin>>_number;
if(_number==1&&a.sum<=21) Want(a);
else if(_number==2&&a.next.sum<=21)
{
int r;
srand(time(0));
while(poker[r=rand()%13+1]>=4); //产生随机数(~13)
poker[r]++;
a.next.num[a.next.number]=r;
a.next.huase[i]=abs(rand()*37)%4+1;
a.next.number+=1;
if(r>10) a.next.sum+=10;
else a.next.sum+=r;
}
else
cout<<"输入错误重新操作: "<}
else
cout<<"输入错误重新操作: ";
cout<<"玩家"<Display(a);
cout<<"玩家"<for(int i=0;i{
srand(time(0));
a.next.huase[i]=abs(rand()*37)%4+1;
cardhuase(a.next.num[i],a.next.huase[i]) ;
cout<cout<}
cout<cout<<"玩家"<}
}


//玩家操作
void Playerplay(int n)
{
int i;
char type;
for(i=1;i{
cout<<"玩家"<cin>>type;
if(type=='T'||type=='t')
{
player[i].ifescape=true;
}
else if(type=='N'||type=='n')
{
if(player[i].sum>=21||player[i].number >=5||player[i].ifbjack==true)
{
break;
}

cout<<"玩家"<while(cin>>type) //玩家操作类型
{
if(type=='S'||type=='s')
{
break;
}//停牌
else if(type=='D'||type=='d' && player[i].number ==2) //加倍
{
Double(player[i]);
cout<<"玩家"<Display(player[i]);
break;
}
else if(type=='Y'||type=='y') //要牌
{
Want(player[i]);
cout<<"玩家"<Display(player[i]);
if(player[i].sum>=21||player[i].number >=5)
break;
cout<<"玩家"<}
else if(type=='F'||type==

'f') //分牌
{
if(!player[i].ifdyad)
cout<<"你不是对子不能分牌"<else
{
divide(player[i],i);
break;
}
}
else cout<<"输入错误重新操作: ";
}
}
}
}
void fa(people &a)
{
if(player[0].ifa=true&&(a.sum<=11))
{
a.sum+=10;
}
else if(player[0].ifa=true&&a.sum>21&&a.sum<=31)
{
a.sum-=10;
}
else
{
a.sum=a.sum;
}

}

//庄家操作
void Bankerplay()
{
char type;
cout<<"庄家是否逃跑"<<"操作:T:逃跑,N:继续"<cin>>type;
if(type=='T'||type=='t')
{
player[0].ifescape=true;
}
else
{
cout<<"庄家操作:"<cout<<"庄家的牌为:"<Display(player[0]);
ifaa(player[0]);
while(player[0].sum<17)
{
if(player[0].ifa==false)
{
Want(player[0]);
Display(player[0]);
if(player[0].sum>21||player[0].number >=5)
break;
}
else if(player[0].ifa==true)
{
fa(player[0]);
if(player[0].sum<17)
{
Want(player[0]);
Display(player[0]);
if(player[0].sum>21)
{
fa(player[0]);
player[0].ifa=false;
}
cout<<"庄家的牌为:"<Display(player[0]);
}
}
cout<<"庄家的牌为:"<Display(player[0]);
}
}
}


//比较玩家与庄家的大小
void compare(int n)
{
int i;
if(player[0].sum>21) //庄家爆牌
{
for(i=1;iif((player[i].sum <= 21 && !player[i].ifdivide) || (player[i].ifdivide && player[i].sum <= 21 && player[i].next.sum <= 21)) //玩家没爆牌且没分牌或分牌副都没爆牌
{
cout<<"玩家"<player[i].principal += player[i].betting[0] * 2 + player[i].next .betting *2;
player[0].principal -= player[i].betting[0] + player[i].next .betting;
}
else if((player[i].sum > 21 && !player[i].ifdivide) || (player[i].ifdivide && player[i].sum > 21 && player[i].next .sum > 21)) //玩家爆牌且没分牌或分牌都爆牌
{
cout<<"玩家"<player[0].principal += player[i].betting[0]+player[i].next .betting ;
}
else //玩家分牌其中一副牌爆牌
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]*2;
}
}
else if(player[0].sum<21) //庄家没爆牌
{
for(i=1;iif(player[i].sum < player[0].sum||player[i].sum > 21) //玩家点数小或爆牌
{
if((!player[i].ifdivide) || (player[i].next.sum == player[0].sum)) //没分牌或分牌有一副牌平局则输
{
cout<<"玩家"<player[0].principal += player[i].betting[0];
}
else if(player[i].next .sum < player[0].sum || player[i].sum > 21) //分牌且第二幅牌点数小或爆牌
{
cout<<"玩家"<<

i<<"输: "<player[0].principal += player[i].betting[0]+player[i].next .betting ;
}
else
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]+player[i].next .betting ;
}
}
else if(player[i].sum > player[0].sum) //没分牌且点数大
{
if(!player[i].ifdivide || player[i].next .sum == player[0].sum) //没分牌或第二幅手牌相等
{
cout<<"玩家"<player[i].principal +=player[i].betting[0] * 2;
player[0].principal -= player[i].betting[0];
}
else if(player[i].next .sum < player[0].sum || player[i].sum > 21) //分牌且第二幅牌小或爆牌
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]+player[i].next .betting ;
}
else //分牌且副牌都大
{
cout<<"玩家"<player[i].principal += player[i].betting[0] * 2 + player[i].next .betting *2;
player[0].principal -= player[i].betting[0] + player[i].next .betting;
}
}
else
{
if(!player[i].ifdivide || player[i].next .sum == player[0].sum) //没分牌或第二幅牌相等
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]+player[i].next .betting ;
}
else if(player[i].next .sum < player[0].sum || player[i].sum > 21) //分牌且第二幅牌小或爆牌
{
cout<<"玩家"<player[0].principal += player[i].next .betting ;
}
else
{
cout<<"玩家"<player[i].principal +=player[i].next .betting * 2;
player[0].principal -= player[i].next .betting;
}
}
}
else if(player[0].ifbjack == true) //庄家是黑杰克
{
for(i=1;iif(player[i].ifbjack == true) //玩家也是黑杰克则平局
{
cout<<"玩家"<player[i].principal +=player[i].betting[0];
}
else //玩家不是黑杰克则输
{
cout<<"玩家"<player[0].principal += player[i].betting[0]+player[i].next .betting ;
}
}
else //庄家不是黑杰克但是是点
{
for(i=1;iif(player[i].ifbjack == true&&player[0].ifbjack == false) //玩家是黑杰克则赢
{
cout<<"玩家"<player[i].principal +=player[i].betting[0] * 2;
player[0].principal -= player[i].betting[0];
}
else if(player[i].ifbjack == true&&player[0].ifbjack == true)
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]+player[i].next .betting ;
}
else if(player[i].

sum==21 && !player[i].ifdivide || player[i].sum==21&&player[i].next .sum == 21) //玩家不是黑杰克但是点或副手牌都是点
{
cout<<"玩家"<player[i].principal +=player[i].betting[0]+player[i].next .betting ;
}
else if(!player[i].ifdivide || player[i].ifdivide && player[i].sum!=21&&player[i].next .sum !=21) //没分牌且不等于或分牌副都不等于
{
cout<<"玩家"<player[0].principal += player[i].betting[0]+player[i].next .betting ;
}
else
{
cout<<"玩家"<player[0].principal += player[i].betting[0];
}
}
}

void main()
{
cout<<"###################################################################"<cout<<"###################欢迎来到21点的游戏##############################"<cout<<"------------------------------------------------------------------"<cout<<"###################################################################"<
int n;
int i,j;
cout<<"输入玩游戏的人数:";
cin>>n;
player[0].principal =30000;
for(i=1;iplayer[i].principal =1000; //初始每人分
char to;
cout<<"按任意键开始,E退出: ";
while(cin>>to)
{
if(to=='E'||to=='e')
break;
cout<<"************************************************"<Showprincipal(n); //显示本金
cout<<"************************************************"<initial(n); //初始化玩家的信息
Betting(n); //投注
for(i=0;i{
j=i;
Dealing(player[j],j);
player[j].number=2;
}
cout<<"你看到的牌:"<for(j=0;j{
if(j==0)
{
cout<<"庄家的牌为: ";
cout << endl;
printf("┌————┐\n│xxxxxxxx│\n│xxxxxxxx│\n│xxxxxxxx│\n│x");
printf("x");
printf("xxxxxx│\n│xxxxxxxx│\n│xxxxxxxx│\n│xxxxxxxx│\n└————┘\n");
cout<cardhuase(player[j].num[1],player[j].huase[1]);
cout << endl;
}
else
{
cout<<"玩家"<cout<for(int i=0;i<2;i++)
{
cardhuase(player[j].num[i],player[j].huase[1]) ;
cout<}
}
}
Afterdyad(n); //投注了对子的得失
cout<<"************************************************"<Showprincipal(n); //显示本金
cout<<"************************************************"<Insurance(n); //是否达到投保险要求
cout<<"************************************************"<Showprincipal(n); //显示本金
cout<<"************************************************"<Playerplay(n);//玩家操作
Bankerplay(); //庄家操作
Afterescape(n); //逃跑惩罚
compare(n); //比较
cout<<"************************************************"<<

endl;
Showprincipal(n);
cout<<"************************************************"<cout<<"按任意键继续,E退出: ";
}
system("pause");
}

相关主题
文本预览
相关文档 最新文档