扑克牌加减乘除游戏,是一种集技巧性和运气性于一体的扑克牌游戏。
现实中可以单人玩,也可以不定人数对抗,用若干副扑克牌去掉王即可游戏,推荐用一副牌双人对抗,乐趣无穷。
本程序利用Card类数组模拟扑克牌,定义3个数组分别表示玩家手中的牌,电脑手中的牌和底牌,用srand((unsigned)time(NULL))产生随机数字,将底牌数组中随机的一项从底牌中移动到其他的数组中,模拟从洗好底牌中抓牌。表示出牌。
单人练习模式中,首先记下一个 1到13之间的随机数字,然后玩家抓牌,当手中的牌的点数恰与记下的随机数字相等,或用手中有的任意两张牌,通过加减乘除四则运算可以凑出该随机数字相等的点数,则停止抓牌并将这一张或两张出出去,随即记下一个新的随机数字,开始下一轮,直道手中的全部牌出完,游戏结束。
人机对抗模式中,首先玩家和计算机各分的5张牌,然后比较玩家和计算机手中最小的牌,谁的小谁就打出这张最小的牌,另一方认为自己的牌凑不出这张牌的点数则开始抓牌,直道手中的牌的点数恰与第一个人出的牌相等,或者用手中有的任意两张牌,通过加减乘除四则运算可以凑出第一个人出的牌相等的点数,则停止抓牌并将这一张或两张出出去,然后要求对方以同样的规则,开始下一轮,直道某一方手中的全部牌出完,游戏结束。
电脑的计算能力使得它肯定会以最优的策略出牌,就让我们看看你的运气如何吧!
压缩包下载: 扑克牌加减乘除游戏 (165.59 KB)
------------------------------以下是程序源码---------------------------------------
//扑克牌加减乘除游戏
#include<iostream.h>
#include<string.h>
#include<ctime.h>
#include<iomanip.h>
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<<"["<<design<<"A]";
break;
case 2: cout<<"["<<design<<"2]";
break;
case 3: cout<<"["<<design<<"3]";
break;
case 4: cout<<"["<<design<<"4]";
break;
case 5: cout<<"["<<design<<"5]";
break;
case 6: cout<<"["<<design<<"6]";
break;
case 7: cout<<"["<<design<<"7]";
break;
case 8: cout<<"["<<design<<"8]";
break;
case 9: cout<<"["<<design<<"9]";
break;
case 10:cout<<"["<<design<<"10]";
break;
case 11:cout<<"["<<design<<"J]";
break;
case 12:cout<<"["<<design<<"Q]";
break;
default: cout<<"["<<design<<"K]";
}
}
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<<setfill('*')<<setw(47)<<"*"<<endl;
cout<<" 欢迎体您验扑克牌加减乘除游戏"<<endl;
cout<<setfill('*')<<setw(47)<<"*"<<endl;
cout<<" (1) 单人练习。"<<endl; //显示菜单
cout<<" (2) 人机对抗。"<<endl;
cout<<" (3) 游戏介绍。"<<endl;
cout<<" (4) 开发成员。 "<<endl;
cout<<" (5) 退出游戏。"<<endl;
while(1) //接受用户输入
{
cout<<""<<setfill('=')<<setw(47)<<"="<<endl;
cout<<"请选择1|2|3|4|5:";
cin>>choice;
if(choice>=1&&choice<=5) //遇到合法输入时跳出循环
break;
}
cout<<setfill('=')<<setw(47)<<"="<<endl;
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<CARDS;i++)
rc[i].creatCard(i+1); //循环给52张底牌赋值
}
void siglegame()
//单人游戏欢迎界面
{
cout<<" 单人练习模式"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
Card rc[CARDS]; //底牌数组
Card pc[CARDS]; //玩家牌数组
int rcn=CARDS; //初始化底牌数
int pcn=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<<"你需要凑的随机点数是 "<<want<<endl;
if(pcn>0) //手中有牌,则显示出来
{
cout<<"你现有"<<pcn<<"张牌:"<<endl;
for(i=0;i<pcn;i++)
{
pc[i].shownumber();
if((i+1)%5==0) //显示5张牌换一次行
cout<<endl;
}
cout<<endl;
}
cout<<setfill('=')<<setw(47)<<"="<<endl;
cout<<" (1) 出1张牌。"<<endl;
cout<<" (2) 出2张牌。"<<endl;
cout<<" (3) 抓牌。"<<endl;
cout<<" (4) 玩法提示。"<<endl;
cout<<" (5) 回主界面。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
while(1) //接受用户输入
{
cout<<"请选择1|2|3|4|5:";
cin>>choice;
if(choice>=1&&choice<=5) //遇到合法输入时跳出循环
break;
}
cout<<setfill('=')<<setw(47)<<"="<<endl;
if(choice==3) //抓牌算法
{
if(rcn) //有底牌
{
int temp=rand()%rcn; //产生一个小于底牌数的随机数
pc[pcn]=rc[temp]; //赋给玩家牌
pcn++; //玩家牌数加1
for(int r=temp;r<rcn;r++)
rc[r]=rc[r+1]; //从底牌里删掉这张牌
rcn--; //底牌数减1
}
else
cout<<"没底牌了。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
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<<endl;
rc[rcn]=pc[i]; //将这张牌插回底牌中
rcn++; //底牌数+1
for(int o=i;o<pcn;o++)//从玩家牌里删掉这张牌
pc[o]=pc[o+1]; //玩家牌数-1
pcn--;
if(pcn) //没出净
{
want=rand()%13+1; //产生新的随机数,进入下一轮
sigleplay(pc,rc,pcn,rcn,want);
}
else //出净了
{
cout<<"你牌出完了,你赢了!"<<endl;
upminu();
}
}
if(flag) //监视哨没有被改值
cout<<"出牌有误!"<<endl;
}
else //第一次必须先抓牌哦
cout<<"手中没有牌啊,请先抓牌哦!"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
sigleplay(pc,rc,pcn,rcn,want);
}
else if(choice==2) //出两张牌算法
{
if(pcn>=2) //手中有2张以上的牌
{
int flag=1;
cout<<"请分别输入2张牌的次序:";
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<<"你出2张牌:";
pc[i].shownumber();
pc[j].shownumber();
cout<<endl;
rc[rcn]=pc[i]; //插回底牌
rc[rcn+1]=pc[j];
rcn+=2;
if(i>j) //如果不是按增序输入则交换牌次序
{
i=j;
j=i;
}
for(int k=j;k<pcn;k++) //删除第2张
pc[k]=pc[k+1];
pcn--;
for(int m=i;m<pcn;m++) //删除第1张
pc[m]=pc[m+1];
pcn--;
if(pcn) //没出净
{
want=rand()%13+1; //产生新的随机数,进入下一轮
sigleplay(pc,rc,pcn,rcn,want);
}
else //出净了
{
cout<<"你牌出完了,你赢了!"<<endl;
upminu();
}
}
}
if(flag) //监视哨没有被改值
cout<<"出牌有误!"<<endl;
}
else
cout<<"手中没有2张牌啊,请先抓牌哦!"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
sigleplay(pc,rc,pcn,rcn,want);
}
else if(choice==4) //玩法提示
{
cout<<" 首先记下一个 1到13之间的随机数字,然后玩家"<<endl;
cout<<"抓牌,当手中的牌的点数恰与记下的随机数字相等,或"<<endl;
cout<<"用手中有的任意两张牌,通过加减乘除四则运算可以"<<endl;
cout<<"凑出该随机数字相等的点数,则停止抓牌并将这一张"<<endl;
cout<<"或两张出出去,随即记下一个新的随机数字,开始下一"<<endl;
cout<<"轮,直道手中的全部牌出完,游戏结束。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
sigleplay(pc,rc,pcn,rcn,want);
}
else
welcome();
}
//================================================================================================
void vsgame()
//对抗游戏欢迎界面
{
cout<<" 人机对抗模式:"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
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<<"您和计算机各抽5张牌决定谁先出:"<<endl;
cout<<"您抽到的牌是";
for(i=0;i<5;i++) //开始的5张牌
{
temp=rand()%rcn;
pc[i]=rc[temp];
pc[i].shownumber();
pcn++;
for(int k=temp;k<rcn;k++)
rc[k]=rc[k+1];
rcn--;
}
cout<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
for(i=0;i<5;i++)
{
temp=rand()%rcn;
cc[i]=rc[temp];
ccn++;
for(int k=temp;k<rcn;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<<"计算机最小的牌点数"<<min<<endl;
for(i=0;i<5;i++)
{
if(min>pc[i].getnumber())
{
min=pc[i].getnumber();
pci=i;
whofirst=1; //最小牌在玩家手中,则把whofirst标志置1
}
}
want=min;
cout<<setfill('=')<<setw(47)<<"="<<endl;
if(whofirst) //最小牌在玩家手中
{
cout<<"您拥有最小的牌:"<<endl;
cout<<"所以您先出一张:";
pc[pci].shownumber();
cout<<endl;
rc[rcn]=pc[pci];
rcn++;
for(i=pci;i<pcn;i++)
pc[i]=pc[i+1];
pcn--;
AIplay(pc,cc,rc,pcn,ccn,rcn,want);
}
else //最小牌在计算机手中
{
cout<<"计算机拥有最小的牌:"<<endl;
cout<<"所以计算机先出一张:";
cc[cci].shownumber();
cout<<endl;
rc[rcn]=cc[cci];
rcn++;
for(i=cci;i<ccn;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<<"电脑现有"<<ccn<<"张牌:"<<endl;
//电脑优先考虑出两张牌算法
for(int i=0;i<ccn;i++) //循环访问计算机所有的牌
{
for(int j=i;j<ccn;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<<"电脑出2张牌:";
cc[i].shownumber();
cc[j].shownumber();
cout<<endl;
rc[rcn]=cc[i]; //插回底牌
rc[rcn+1]=cc[j];
rcn+=2;
for(int k=j;k<ccn;k++) //删除第2张
cc[k]=cc[k+1];
ccn--;
for(int m=i;m<ccn;m++) //删除第1张
cc[m]=cc[m+1];
ccn--;
if(ccn) //没出净
playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分
else
{
cout<<"电脑牌出完了,你输了!"<<endl;
upminu();
}
}
}
//出一张牌算法
for(int n=0;n<ccn;n++)
{
p=cc[n].getnumber();
if(p==want)
{
want=p;
cout<<"电脑出1张牌:";
cc[n].shownumber();
cout<<endl;
rc[rcn]=cc[n]; //插回底牌
rcn++; //底牌数+1
for(int o=n;o<ccn;o++) //从电脑牌里删掉这张牌
cc[o]=cc[o+1];
ccn--; //电脑牌数-1
if(ccn) //没出净
playerplay(pc,cc,rc,pcn,ccn,rcn,want);//进入玩家部分
else
{
cout<<"电脑牌出完了,你输了!"<<endl;
upminu();
}
}
cout<<"电脑抓牌,"; //抓牌算法
if(rcn) //有底牌
{
int temp=rand()%rcn; //产生一个小于底牌数的随机数
cc[ccn]=rc[temp]; //赋给电脑牌
ccn++; //电脑牌数+1
for(int r=temp;r<rcn;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<<"你需要凑的牌的点数 "<<want<<endl;
cout<<"你现有"<<pcn<<"张牌:"<<endl;
for(i=0;i<pcn;i++)
{
pc[i].shownumber();
if((i+1)%5==0) //显示5张牌换一次行
cout<<endl;
}
cout<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
cout<<" (1) 出1张牌。"<<endl;
cout<<" (2) 出2张牌。"<<endl;
cout<<" (3) 抓牌。"<<endl;
cout<<" (4) 玩法提示。"<<endl;
cout<<" (5) 回主界面。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
while(1) //接受用户输入
{
cout<<"请选择1|2|3|4|5:";
cin>>choice;
if(choice>=1&&choice<=5) //遇到合法输入时跳出循环
break;
}
cout<<setfill('=')<<setw(47)<<"="<<endl;
if(choice==3)
{
if(rcn) //有底牌
{
int temp=rand()%rcn; //产生一个小于底牌数的随机数
pc[pcn]=rc[temp]; //赋给玩家牌
pcn++; //玩家牌数加1
for(int r=temp;r<rcn;r++)
rc[r]=rc[r+1]; //从底牌里删掉这张牌
rcn--; //底牌数减1
}
else
cout<<"没底牌了。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
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<<endl;
rc[rcn]=pc[i]; //将这张牌插回底牌中
rcn++; //底牌数+1
for(int o=i;o<pcn;o++) //从玩家牌里删掉这张牌
pc[o]=pc[o+1];
pcn--; //玩家牌数-1
if(pcn) //没出净
AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分
else
{
cout<<"你牌出完了,你赢了!"<<endl;
upminu();
}
}
if(flag) //监视哨没有被改值
cout<<"出牌有误!"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
playerplay(pc,cc,rc,pcn,ccn,rcn,want);
}
else if(choice==2) //出两张牌算法
{
if(pcn>=2) //手中有2张以上的牌
{
int flag=1;
cout<<"请分别输入2张牌的次序:";
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<<"你出2张牌:";
pc[i].shownumber();
pc[j].shownumber();
cout<<endl;
rc[rcn]=pc[i]; //插回底牌
rc[rcn+1]=pc[j];
rcn+=2;
if(i>j) //如果不是按增序输入则交换牌次序
{
i=j;
j=i;
}
for(int k=j;k<pcn;k++) //删除第2张
pc[k]=pc[k+1];
pcn--;
for(int m=i;m<pcn;m++) //删除第1张
pc[m]=pc[m+1];
pcn--;
if(pcn) //没出净
{
while(1) //两张选一张让电脑凑
{
cout<<"你选哪张牌让电脑凑?"<<endl;
cout<<"选第一张请按1,选第二张请按2:";
cin>>choice;
if(choice==1)
{
want=p;
break;
}
else if(choice==2)
{
want=q;
break;
}
else
cout<<"输入有误"<<endl;
}
cout<<setfill('=')<<setw(47)<<"="<<endl;
AIplay(pc,cc,rc,pcn,ccn,rcn,want);//进入电脑部分
}
else
{
cout<<"你牌出完了,你赢了!"<<endl;
upminu();
}
}
}
if(flag)
cout<<"出牌有误!"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
playerplay(pc,cc,rc,pcn,ccn,rcn,want);
}
}
else if(choice==4) //玩法提示
{
cout<<" 首先玩家和计算机各分的5张牌,然后比较玩家和"<<endl;
cout<<"计算机手中最小的牌,谁的小谁就打出这张最小的牌,"<<endl;
cout<<"另一方认为自己的牌凑不出这张牌的点数则开始抓牌,"<<endl;
cout<<"直道手中的牌的点数恰与第一个人出的牌相等,或者"<<endl;
cout<<"用手中有的任意两张牌,通过加减乘除四则运算可以凑"<<endl;
cout<<"出第一个人出的牌相等的点数,则停止抓牌并将这一张"<<endl;
cout<<"或两张出出去,然后要求对方以同样的规则,开始下一"<<endl;
cout<<"轮,直道某一方手中的全部牌出完,游戏结束。"<<endl;
cout<<setfill('=')<<setw(47)<<"="<<endl;
playerplay(pc,cc,rc,pcn,ccn,rcn,want);
}
else
welcome();
}
//================================================================================================
void upminu()
//返回上一级菜单
{
cout<<setfill('=')<<setw(47)<<"="<<endl;
int e;
cout<<" (1) 回主界面"<<endl;
cout<<" (2) 退出游戏"<<endl;
do
{
cout<<""<<setfill('=')<<setw(47)<<"="<<endl;
cout<<"请选择1|2:";
cin>>e;
if(e==1)
{
cout<<""<<setfill('=')<<setw(47)<<"="<<endl;
welcome();
}
else if(e==2)
{
cout<<""<<setfill('=')<<setw(47)<<"="<<endl;
exit();
}
}while(e!=1||e!=2);
}
//================================================================================================
void gameinfo()
//游戏简介
{
cout<<" 扑克牌加减乘除游戏,是一种集技巧性和运气性"<<endl;
cout<<"于一体的扑克牌游戏。"<<endl;
cout<<" 现实中可以单人玩,也可以不定人数对抗,用若干"<<endl;
cout<<"副扑克牌去掉王即可游戏,推荐用一副牌双人对抗,乐"<<endl;
cout<<"趣无穷。本程序利用Card类数组模拟扑克牌,设定了单"<<endl;
cout<<"人练习模式和人机对抗模式,如有不懂操作请参考具体"<<endl;
cout<<"提示。"<<endl;
cout<<" 电脑的计算能力使得它肯定会以最优的策略出牌,"<<endl;
cout<<"就让我们看看你的运气如何吧!"<<endl;
upminu();
}
//================================================================================================
void maker()
//制作者
{
cout<<"制作组均来自西北大学软件学院2007级4班:"<<endl;
cout<<" 总策划: 谢峥丹"<<endl;
cout<<" 源代码编者: 曲振波"<<endl;
cout<<" 技术支持: 刘伦椿"<<endl;
cout<<"特别鸣谢:"<<endl;
cout<<" 王建忠,在游戏设计阶段试玩并提出了宝贵的意见。"<<endl;
upminu();
}
//================================================================================================
void exit()
//退出游戏
{
char e;
cout<<"确认退出吗?(Y/N)";
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<<"再见!"<<endl;
cout<<"按回车键退出..."<<endl;
getchar();
getchar();
exit(0);
}