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

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

本程序利用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);

}

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

  1. c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏

    C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...

  2. C语言编程学习开发的俄罗斯方块小游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  3. C语言 (编程题:约瑟夫环 报数游戏)

    1.前言 最近有点emo,写博客也没有什么特别想写的内容 这篇博客把约瑟夫环用C语言来写一下 巩固一下原来学过的知识. 2.什么是约瑟夫环 这有个历史故事还是比较有意思的:据说著名犹太历史学家Jose ...

  4. C语言编程题:分数的加减乘除

    先求公因子 再编程化成最简式 再进行加减乘除的函数编写 #include <stdio.h> #include <stdlib.h>typedef struct{int fen ...

  5. C语言魔术阵,C语言编程:扑克牌魔术

    看到一个扑克牌魔术的题目,觉得挺有意思. 题目网址:http://zhidao.baidu.com/question/407505626.html 这个题目已经有了答案. 但是答案的程序,看起来有些费 ...

  6. C语言编程:扑克牌魔术

    看到一个扑克牌魔术的题目,觉得挺有意思. 题目网址:http://zhidao.baidu.com/question/407505626.html 这个题目已经有了答案. 但是答案的程序,看起来有些费 ...

  7. c语言编程数独游戏,编程做数独游戏

    数独游戏非常好玩,可以训练玩家的逻辑推理能力.数独游戏的规则是: 1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 2.必须满足的条件:每一行 ...

  8. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  9. c语言填数字游戏求解过程解读,c语言编程--数字游戏.doc

    c语言编程--数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...

最新文章

  1. eclipse运行 Maven Test命令时控制台输出乱码的解决办法
  2. 【Cocosd2d实例教程六】Cocos2d实现屏幕背景的自动滚动
  3. 什么是量子计算-超级简单的给你个解释
  4. boost::set_difference相关的测试程序
  5. 人人都能掌握的Java服务端性能优化方案
  6. J2EE基础之Web服务简介
  7. 时间管理,从洗碗开始
  8. sql判断数据库类型数据_SQL数据类型
  9. mysql desc show_mysql 查看信息的命令(show\desc\explain)
  10. python 字符串排序 偶数位交换_在Python中将字符串列表转换为整数排序列表
  11. 【数据分享】错颌畸形生长患者治疗数据集
  12. 简单常用的sql语句
  13. 直线方程求x坐标c语言,已知两点坐标,求直线方程、距离其中一点距离为L的某点...
  14. WinCE 5.0下的鼠标键盘驱动分析
  15. java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
  16. opencv-车牌识别
  17. 【英语竞赛】听力速记
  18. 第五章运算符表达式和语句
  19. 程序员的职业病,一定要注重身体健康才是最重要的
  20. html鼠标移入显示图片动画,HTML5+CSS3鼠标移入移出图片生成随机动画_html/css_WEB-ITnose...

热门文章

  1. gradle全集 下载 蓝凑云(非百度网盘)
  2. java实现、项目开发团队分配管理软件
  3. java输出罗马数字,【Java】【刷穿 LeetCode】13. 罗马数字转整数(简单)
  4. Anaconda与PyCharm安装与配置
  5. Libra R-CNN理解
  6. 1998年4月全国计算机等级考试二级C语言笔试试题
  7. webpack css字体引入使用
  8. 关于文案、营销、生活的15条思考!
  9. Android 系统NFC模块
  10. LTE学习笔记之无线资源管理