c语言编程的扑克牌游戏,扑克牌加减乘除游戏

扑克牌加减乘除游戏,是一种集技巧性和运气性于一体的扑克牌游戏。

现实中可以单人玩,也可以不定人数对抗,用若干副扑克牌去掉王即可游戏,推荐用一副牌双人对抗,乐趣无穷。

本程序利用Card类数组模拟扑克牌,定义3个数组分别表示玩家手中的牌,电脑手中的牌和底牌,用srand((unsigned)time(NULL))产生随机数字,将底牌数组中随机的一项从底牌中移动到其他的数组中,模拟从洗好底牌中抓牌。表示出牌。

单人练习模式中,首先记下一个 1到13之间的随机数字,然后玩家抓牌,当手中的牌的点数恰与记下的随机数字相等,或用手中有的任意两张牌,通过加减乘除四则运算可以凑出该随机数字相等的点数,则停止抓牌并将这一张或两张出出去,随即记下一个新的随机数字,开始下一轮,直道手中的全部牌出完,游戏结束。

人机对抗模式中,首先玩家和计算机各分的5张牌,然后比较玩家和计算机手中最小的牌,谁的小谁就打出这张最小的牌,另一方认为自己的牌凑不出这张牌的点数则开始抓牌,直道手中的牌的点数恰与第一个人出的牌相等,或者用手中有的任意两张牌,通过加减乘除四则运算可以凑出第一个人出的牌相等的点数,则停止抓牌并将这一张或两张出出去,然后要求对方以同样的规则,开始下一轮,直道某一方手中的全部牌出完,游戏结束。

电脑的计算能力使得它肯定会以最优的策略出牌,就让我们看看你的运气如何吧!

压缩包下载: 扑克牌加减乘除游戏

------------------------------以下是程序源码---------------------------------------

//扑克牌加减乘除游戏

#include

#include

#include

#include

using namespace std;

//================================================================================================

class Card

//定义扑克牌Card类

{

private:

char design;//花色

int number;//点数

public:

Card()//默认构造方法

{

design=0;

number=0;

}

void creatCard(int i=1)//带参初始化方法

{

number=i;

if(i>=1&&i<=13)

design=3;

else if(i>=14&&i<=26)

design=4;

else if(i>=27&&i<=39)

design=5;

else if(i>=40&&i<=52)

design=6;

}

void shownumber()//显示牌

{

int i=number%13;

switch(i)

{

case 1: cout<

break;

case 2: cout<

break;

case 3: cout<

break;

case 4: cout<

break;

case 5: cout<

break;

case 6: cout<

break;

case 7: cout<

break;

case 8: cout<

break;

case 9: cout<

break;

case 10:cout<

break;

case 11:cout<

break;

case 12:cout<

break;

default: cout<

}

}

int getnumber()//得到牌的真实点数

{

if(number%13)

return number%13;

else

return 13;

}

~Card(){}//析构方法

};

//================================================================================================

const int CARDS=52;//扑克牌总数

//函数声明

void welcome();//欢迎界面

void start(Card *rc);//初始化底牌

void siglegame();//单人游戏欢迎界面

void sigleplay(Card *pc,Card *rc,int& pcn,int& rcn,int want);//单人游戏执行算法

void vsgame();//对抗游戏欢迎界面

void playerplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want);//对抗时玩家算法

void AIplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want);//对抗时计算机算法

void upminu();//返回上一级菜单

void gameinfo();//游戏简介

void maker();//制作者

void exit();//退出游戏

//================================================================================================

int main()

//主函数

{

srand((unsigned)time(NULL));//随机种子发生器

welcome();

return 0;

}

//================================================================================================

void welcome()

//欢迎界面

{

int choice;//申请变量接受用户输入

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

while(1)//接受用户输入

{

cout<

cout<

cin>>choice;

if(choice>=1&&choice<=5)//遇到合法输入时跳出循环

break;

}

cout<

switch(choice)

{

case 1: siglegame();//跳转到各个函数

break;

case 2: vsgame();

break;

case 3: gameinfo();

break;

case 4: maker();

break;

default: exit();

}

}

//================================================================================================

void start(Card *rc)

//初始化底牌

{

for(int i=0;i

rc[i].creatCard(i+1);//循环给52张底牌赋值

}

void siglegame()

//单人游戏欢迎界面

{

cout<

cout<

Card rc[CARDS];//底牌数组

Card pc[CARDS];//玩家牌数组

int rcn=CARDS;//初始化底牌数

intpcn=0;//初始化玩家牌数

int want;//申请变量接受随机数

start(rc);//初始化底牌

want=rand()%13+1;//生成1-13的随机数

sigleplay(pc,rc,pcn,rcn,want);//调用单人游戏执行算法

}

//================================================================================================

void sigleplay(Card *pc,Card *rc,int& pcn,int& rcn,int want)

//单人游戏执行算法

{

int choice,p,q,i,j;//申请辅助变量

cout<

if(pcn>0)//手中有牌,则显示出来

{

cout<

for(i=0;i

{

pc[i].shownumber();

if((i+1)%5==0)//显示5张牌换一次行

cout<

}

cout<

}

cout<

cout<

cout<

cout<

cout<

cout<

cout<

while(1)//接受用户输入

{

cout<

cin>>choice;

if(choice>=1&&choice<=5)//遇到合法输入时跳出循环

break;

}

cout<

if(choice==3)//抓牌算法

{

if(rcn)//有底牌

{

int temp=rand()%rcn;//产生一个小于底牌数的随机数

pc[pcn]=rc[temp];//赋给玩家牌

pcn++;//玩家牌数加1

for(int r=temp;r

rc[r]=rc[r+1];//从底牌里删掉这张牌

rcn--;//底牌数减1

}

else

cout<

cout<

sigleplay(pc,rc,pcn,rcn,want);//递归调用

}

else if(choice==1)//出一张牌算法

{

if(pcn)//手中有牌

{

int flag=1;//定义监视哨

cout<

cin>>i;

i--;

p=pc[i].getnumber();

if(p==want)//满足条件

{

flag=0;

cout<

pc[i].shownumber();

cout<

rc[rcn]=pc[i];//将这张牌插回底牌中

rcn++;//底牌数+1

for(int o=i;o

pc[o]=pc[o+1];//玩家牌数-1

pcn--;

if(pcn)//没出净

{

want=rand()%13+1; //产生新的随机数,进入下一轮

sigleplay(pc,rc,pcn,rcn,want);

}

else//出净了

{

cout<

upminu();

}

}

if(flag)//监视哨没有被改值

cout<

}

else           //第一次必须先抓牌哦

cout<

cout<

sigleplay(pc,rc,pcn,rcn,want);

}

else if(choice==2)//出两张牌算法

{

if(pcn>=2)//手中有2张以上的牌

{

int flag=1;

cout<

cin>>i>>j;

i--;

j--;

if(i!=j)//两张牌可不能是同一张哦

{

p=pc[i].getnumber();

q=pc[j].getnumber();

if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)

{//满足条件

flag=0;

cout<

pc[i].shownumber();

pc[j].shownumber();

cout<

rc[rcn]=pc[i];   //插回底牌

rc[rcn+1]=pc[j];

rcn+=2;

if(i>j)//如果不是按增序输入则交换牌次序

{

i=j;

j=i;

}

for(int k=j;k

pc[k]=pc[k+1];

pcn--;

for(int m=i;m

pc[m]=pc[m+1];

pcn--;

if(pcn)//没出净

{

want=rand()%13+1; //产生新的随机数,进入下一轮

sigleplay(pc,rc,pcn,rcn,want);

}

else//出净了

{

cout<

upminu();

}

}

}

if(flag)//监视哨没有被改值

cout<

}

else

cout<

cout<

sigleplay(pc,rc,pcn,rcn,want);

}

else if(choice==4)//玩法提示

{

cout<

cout<

cout<

cout<

cout<

cout<

cout<

sigleplay(pc,rc,pcn,rcn,want);

}

else

welcome();

}

//================================================================================================

void vsgame()

//对抗游戏欢迎界面

{

cout<

cout<

Card rc[CARDS];//底牌数组

Card pc[CARDS];//玩家牌数组

Card cc[CARDS];//电脑牌数组

int rcn=CARDS;//初始化底牌数

int pcn=0;//初始化玩家牌数

int ccn=0;//初始化计算机牌数

int temp,want,i,pci,cci;//申请辅助变量

int min=13,whofirst=0;

start(rc);//初始化底牌

cout<

cout<

for(i=0;i<5;i++)//开始的5张牌

{

temp=rand()%rcn;

pc[i]=rc[temp];

pc[i].shownumber();

pcn++;

for(int k=temp;k

rc[k]=rc[k+1];

rcn--;

}

cout<

cout<

for(i=0;i<5;i++)

{

temp=rand()%rcn;

cc[i]=rc[temp];

ccn++;

for(int k=temp;k

rc[k]=rc[k+1];

rcn--;

}

for(i=0;i<5;i++)//寻找最小的牌

{

if(min>cc[i].getnumber())

{

min=cc[i].getnumber();

cci=i;

}

}

cout<

for(i=0;i<5;i++)

{

if(min>pc[i].getnumber())

{

min=pc[i].getnumber();

pci=i;

whofirst=1;//最小牌在玩家手中,则把whofirst标志置1

}

}

want=min;

cout<

if(whofirst)//最小牌在玩家手中

{

cout<

cout<

pc[pci].shownumber();

cout<

rc[rcn]=pc[pci];

rcn++;

for(i=pci;i

pc[i]=pc[i+1];

pcn--;

AIplay(pc,cc,rc,pcn,ccn,rcn,want);

}

else//最小牌在计算机手中

{

cout<

cout<

cc[cci].shownumber();

cout<

rc[rcn]=cc[cci];

rcn++;

for(i=cci;i

cc[i]=cc[i+1];

ccn--;

playerplay(pc,cc,rc,pcn,ccn,rcn,want);

}

}

//================================================================================================

void AIplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want)

//对抗时计算机算法

{

int p,q,temp;

cout<

//电脑优先考虑出两张牌算法

for(int i=0;i

{

for(int j=i;j

{

p=cc[i].getnumber();

q=cc[j].getnumber();

if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)

{//满足条件

temp=rand()%2;//电脑随机选一张让玩家凑

temp?want=p:want=q;

cout<

cc[i].shownumber();

cc[j].shownumber();

cout<

rc[rcn]=cc[i];//插回底牌

rc[rcn+1]=cc[j];

rcn+=2;

for(int k=j;k

cc[k]=cc[k+1];

ccn--;

for(int m=i;m

cc[m]=cc[m+1];

ccn--;

if(ccn)//没出净

playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分

else

{

cout<

upminu();

}

}

}

//出一张牌算法

for(int n=0;n

{

p=cc[n].getnumber();

if(p==want)

{

want=p;

cout<

cc[n].shownumber();

cout<

rc[rcn]=cc[n];//插回底牌

rcn++;//底牌数+1

for(int o=n;o

cc[o]=cc[o+1];

ccn--;//电脑牌数-1

if(ccn)//没出净

playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分

else

{

cout<

upminu();

}

}

cout<

if(rcn)//有底牌

{

int temp=rand()%rcn;//产生一个小于底牌数的随机数

cc[ccn]=rc[temp];       //赋给电脑牌

ccn++;//电脑牌数+1

for(int r=temp;r

rc[r]=rc[r+1];//从底牌里删掉这张牌

rcn--;//底牌数-1

AIplay(pc,cc,rc,pcn,ccn,rcn,want);//递归调用

}

}

}

}

//================================================================================================

void playerplay(Card *pc,Card *cc,Card *rc,int& pcn,int& ccn,int& rcn,int want)

//对抗时玩家算法

{

int choice,p,q,i,j;

cout<

cout<

for(i=0;i

{

pc[i].shownumber();

if((i+1)%5==0)//显示5张牌换一次行

cout<

}

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

while(1)//接受用户输入

{

cout<

cin>>choice;

if(choice>=1&&choice<=5)//遇到合法输入时跳出循环

break;

}

cout<

if(choice==3)

{

if(rcn)//有底牌

{

int temp=rand()%rcn;//产生一个小于底牌数的随机数

pc[pcn]=rc[temp];//赋给玩家牌

pcn++;//玩家牌数加1

for(int r=temp;r

rc[r]=rc[r+1];//从底牌里删掉这张牌

rcn--;//底牌数减1

}

else

cout<

cout<

playerplay(pc,cc,rc,pcn,ccn,rcn,want);//递归调用

}

else if(choice==1)//出一张牌算法

{

int flag=1;//定义监视哨

cout<

cin>>i;

i--;

p=pc[i].getnumber();

if(p==want)//满足条件

{

flag=0;

cout<

pc[i].shownumber();

cout<

rc[rcn]=pc[i];//将这张牌插回底牌中

rcn++;//底牌数+1

for(int o=i;o

pc[o]=pc[o+1];

pcn--;//玩家牌数-1

if(pcn)//没出净

AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分

else

{

cout<

upminu();

}

}

if(flag)//监视哨没有被改值

cout<

cout<

playerplay(pc,cc,rc,pcn,ccn,rcn,want);

}

else if(choice==2)//出两张牌算法

{

if(pcn>=2)//手中有2张以上的牌

{

int flag=1;

cout<

cin>>i>>j;

i--;

j--;

if(i!=j)

{

p=pc[i].getnumber();

q=pc[j].getnumber();

if(p*q==want||(p%q==0&&p/q==want)||(q%p==0&&q/p==want)||p+q==want||p-q==want||q-p==want)

{//满足条件

flag=0;

cout<

pc[i].shownumber();

pc[j].shownumber();

cout<

rc[rcn]=pc[i];   //插回底牌

rc[rcn+1]=pc[j];

rcn+=2;

if(i>j)//如果不是按增序输入则交换牌次序

{

i=j;

j=i;

}

for(int k=j;k

pc[k]=pc[k+1];

pcn--;

for(int m=i;m

pc[m]=pc[m+1];

pcn--;

if(pcn)//没出净

{

while(1)//两张选一张让电脑凑

{

cout<

cout<

cin>>choice;

if(choice==1)

{

want=p;

break;

}

else if(choice==2)

{

want=q;

break;

}

else

cout<

}

cout<

AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分

}

else

{

cout<

upminu();

}

}

}

if(flag)

cout<

cout<

playerplay(pc,cc,rc,pcn,ccn,rcn,want);

}

}

else if(choice==4)//玩法提示

{

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

playerplay(pc,cc,rc,pcn,ccn,rcn,want);

}

else

welcome();

}

//================================================================================================

void upminu()

//返回上一级菜单

{

cout<

int e;

cout<

cout<

do

{

cout<

cout<

cin>>e;

if(e==1)

{

cout<

welcome();

}

else if(e==2)

{

cout<

exit();

}

}while(e!=1||e!=2);

}

//================================================================================================

void gameinfo()

//游戏简介

{

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

upminu();

}

//================================================================================================

void maker()

//制作者

{

cout<

cout<

cout<

cout<

cout<

cout<

upminu();

}

//================================================================================================

void exit()

//退出游戏

{

char e;

cout<

do

{

cin>>e;

if(e=='y'||e=='Y')

break;

else if(e=='N'||e=='n')

welcome();

}while(e!='y'||e!='Y'||e!='N'||e!='n');

cout<

cout<

getchar();

getchar();

exit(0);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值