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);
}
c语言编程的扑克牌游戏,扑克牌加减乘除游戏相关推荐
- c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏
C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...
- C语言编程学习开发的俄罗斯方块小游戏
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- C语言 (编程题:约瑟夫环 报数游戏)
1.前言 最近有点emo,写博客也没有什么特别想写的内容 这篇博客把约瑟夫环用C语言来写一下 巩固一下原来学过的知识. 2.什么是约瑟夫环 这有个历史故事还是比较有意思的:据说著名犹太历史学家Jose ...
- C语言编程题:分数的加减乘除
先求公因子 再编程化成最简式 再进行加减乘除的函数编写 #include <stdio.h> #include <stdlib.h>typedef struct{int fen ...
- C语言魔术阵,C语言编程:扑克牌魔术
看到一个扑克牌魔术的题目,觉得挺有意思. 题目网址:http://zhidao.baidu.com/question/407505626.html 这个题目已经有了答案. 但是答案的程序,看起来有些费 ...
- C语言编程:扑克牌魔术
看到一个扑克牌魔术的题目,觉得挺有意思. 题目网址:http://zhidao.baidu.com/question/407505626.html 这个题目已经有了答案. 但是答案的程序,看起来有些费 ...
- c语言编程数独游戏,编程做数独游戏
数独游戏非常好玩,可以训练玩家的逻辑推理能力.数独游戏的规则是: 1.在9×9的大九宫格内,已给定若干数字,其他宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 2.必须满足的条件:每一行 ...
- 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)
原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...
- c语言填数字游戏求解过程解读,c语言编程--数字游戏.doc
c语言编程--数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...
最新文章
- eclipse运行 Maven Test命令时控制台输出乱码的解决办法
- 【Cocosd2d实例教程六】Cocos2d实现屏幕背景的自动滚动
- 什么是量子计算-超级简单的给你个解释
- boost::set_difference相关的测试程序
- 人人都能掌握的Java服务端性能优化方案
- J2EE基础之Web服务简介
- 时间管理,从洗碗开始
- sql判断数据库类型数据_SQL数据类型
- mysql desc show_mysql 查看信息的命令(show\desc\explain)
- python 字符串排序 偶数位交换_在Python中将字符串列表转换为整数排序列表
- 【数据分享】错颌畸形生长患者治疗数据集
- 简单常用的sql语句
- 直线方程求x坐标c语言,已知两点坐标,求直线方程、距离其中一点距离为L的某点...
- WinCE 5.0下的鼠标键盘驱动分析
- java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
- opencv-车牌识别
- 【英语竞赛】听力速记
- 第五章运算符表达式和语句
- 程序员的职业病,一定要注重身体健康才是最重要的
- html鼠标移入显示图片动画,HTML5+CSS3鼠标移入移出图片生成随机动画_html/css_WEB-ITnose...