CardGame

一段时间一直喜欢玩欢乐斗地主~~本来打算做出一个“跑得快”(有的地方叫争上游),技术有点欠缺,于是做出了一个类似打牌的卡牌游戏。
玩家将与两个电脑玩家进行游戏,一副牌总共有54张,洗牌后分为3叠,玩家随机得到一叠以开始。
每次只能出一张牌,牌的点数必须比上家的牌的点数大,无牌出则输入 0 以PASS。率先清空牌库的玩家获胜。
所谓的54张牌其实就是类似扑克牌的54个数字,当然出牌的形式就是输入自己“牌库”里的一个数字。

int c[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //一副牌

源代码先给出:

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<windows.h>
using namespace std;int c[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  //一副完整的牌
int player1[18];
int player2[18];
int player3[18];  //将牌分为三份//游戏规则
void Instructions(){char s;cout<<"欢迎来到卡牌接龙游戏!"<<endl;cout<<"是否查看游戏规则?是(y)否(任意字符):";cin>>s;if(s == 'y'){cout<<endl;cout<<"一副牌总共有54张,洗牌后分为3叠,玩家随机得到一叠以开始。"<<endl;cout<<"每次只能出一张牌,牌的点数必须比上家的牌的点数大,无牌出则输入 0 以PASS!率先清空牌库的玩家获胜!"<<endl; cout<<endl;}elsecout<<endl;
}//洗牌函数,打乱牌的顺序
void Shuffle(int *c){cout<<"洗牌中。。。"<<endl;srand(unsigned(time(NULL)));Sleep(1000);int a = rand();while(a>0){for(int i = 53; i > 0; i--){srand(unsigned(time(NULL))); int currentRandom = rand() % i;swap(c[i],c[currentRandom]);}a--;}//发牌, 分为三份 for(int i = 0;i < 18;i++){player1[i] = c[i];}for(int i = 18;i < 36;i++){player2[i-18] = c[i];}for(int i = 36;i < 54;i++){player3[i-36] = c[i];}
}//二分搜索算法,为了找到要出的牌在牌库中的位置
int Binary_Search(int *a, int start, int end, int key){int mid;while(start <= end){mid = (start + end) / 2;if(a[mid] < key){start = mid + 1;}else if (a[mid] > key){end = mid - 1;}else{return mid;}}return -1;
}//快速排序算法,用于排自己的手牌
void QuickSort(int *a, int left, int right){if(left >= right){return ;}int i = left;int j = right;int key = a[left];while(i < j){while(i < j && key <= a[j]){j--;}a[i] = a[j];while(i < j && key >= a[i]){i++;}a[j] = a[i];}a[i] = key;QuickSort(a,left,i-1);QuickSort(a,i+1,right);
}//出牌函数,出掉的牌 牌库中变为 0
void Play(int p,int *player,int round){if(round == 1){cout<<"你出牌 "<<player[p]<<endl;}else if(round == 0){cout<<"电脑玩家1出牌 "<<player[p]<<endl;}else if(round == -1){cout<<"电脑玩家2出牌 "<<player[p]<<endl;}player[p] = 0;QuickSort(player,0,17);
} //自动将三份牌排序
void Sort(){QuickSort(player1,0,17);QuickSort(player2,0,17);QuickSort(player3,0,17);
}//展示牌库
void Display(int *player){cout<<endl;cout<<"你的牌库:"; for(int i = 0;i < 18;i++){if(player[i] != 0)cout<<player[i]<<" ";}cout<<endl;
}//电脑智能选择要出的牌
int Smart(int current,int *player,int pc){int i,S_current;if(current == 0){for(i = 0;i < 18;i++){if(player[i] > 0){S_current = player[i];Play(i,player,pc);return S_current;}}}else{for(i = 0;i < 18;i++){if(player[i] > current){S_current = player[i];Play(i,player,pc);return S_current;}}}if(pc == 0){cout<<"电脑玩家1PASS"<<endl;return current;} else{cout<<"电脑玩家2PASS"<<endl; return current;}
}//判断出的牌是否符合规则
int Judge(int p,int H_current,int S_current,int *player){   if(p == -1){return 1;}else if(H_current <= S_current)return 2;elsereturn 3;
}//玩家出牌
int Human(int S_current,int *player){int H_current,p,i;cin>>H_current;if(H_current == 0){cout<<"我PASS"<<endl;return S_current;}bool j = false;while(!j){if(H_current == 0){cout<<"我PASS"<<endl;return S_current;}p = Binary_Search(player,0,17,H_current);i = Judge(p,H_current,S_current,player);if(i == 3){Play(p,player,1);return H_current;}else if(i == 1){cout<<"你没有此牌!"<<endl;cin>>H_current;}else{cout<<"你无法出此牌!"<<endl;cin>>H_current;}}
}//判断输赢
bool Win(int *player){int s = 0;for(int i = 0;i < 18;i++){s += player[i];}if(s == 0)return true;elsereturn false;
}//宣布结果
void Result(bool S1,bool S2,bool H){if(S1){cout<<endl;cout<<"你输了!"<<endl;cout<<"电脑玩家1获得胜利!"<<endl;}else if (S2){cout<<endl;cout<<"你输了!"<<endl;cout<<"电脑玩家2获得胜利!"<<endl;}else if (H){cout<<"你赢了!"<<endl;}
}int main(){Instructions(); //规则 Shuffle(c);   //洗牌 Sort();    //排序 //随机选择先手 srand(unsigned(time(NULL))); int pick = rand() % 3;int S1_current = 0;int S2_current = 0;int H_current = 0;  //记录出的牌 bool S1_result = false;bool S2_result = false;bool H_result = false;  //判断输赢的变量 //根据先手先出牌原则,以圆桌的顺序一一出牌,一旦有牌库清空,便跳出循坏 if (pick == 0) {while(!S1_result && !S2_result && !H_result){Display(player1);H_current = Human(S2_current,player1);if(H_current == S1_current){H_current = 0;}H_result = Win(player1);if(H_result == true)break;S1_current = Smart(H_current,player2,0);if(S1_current == S2_current){S1_current = 0;}S1_result = Win(player2);if(S1_result == true)break;S2_current = Smart(S1_current,player3,-1);if(S2_current == H_current){S2_current = 0;}S2_result = Win(player3);if(S2_result == true)break;}Display(player1);}else if(pick == 1){while(!S1_result && !S2_result && !H_result){S1_current = Smart(H_current,player2,0);if(S1_current == S2_current){S1_current = 0;}S1_result = Win(player2);if(S1_result == true)break;S2_current = Smart(S1_current,player3,-1);if(S2_current == H_current){S2_current = 0;}S2_result = Win(player3);if(S2_result == true)break;Display(player1);H_current = Human(S2_current,player1);if(H_current == S1_current){H_current = 0;}H_result = Win(player1);if(H_result == true)break;}Display(player1);}else{while(!S1_result && !S2_result && !H_result){S2_current = Smart(S1_current,player3,-1);if(S2_current == H_current){S2_current = 0;}S2_result = Win(player3);if(S2_result == true)break;Display(player1);H_current = Human(S2_current,player1);if(H_current == S1_current){H_current = 0;}H_result = Win(player1);if(H_result == true)break;S1_current = Smart(H_current,player2,0);if(S1_current == S2_current){S1_current = 0;}S1_result = Win(player2);if(S1_result == true)break;}Display(player1);}Result(S1_result,S2_result,H_result);   //宣布结果 system("pause");return 0;
}

界面如下:


C++游戏编程:卡牌游戏相关推荐

  1. 天池 在线编程 卡牌游戏(01背包)

    文章目录 1. 题目 2. 解题 1. 题目 你跟你的朋友在玩一个卡牌游戏,总共有 n 张牌. 每张牌的成本为 cost[i] 并且可以对对手造成 damage[i] 的伤害. 你总共有 totalM ...

  2. 一个卡牌游戏的DEMO(0)

    最近有一个卡牌游戏的创意,打算用Unity把Demo实现出来练练手.我尽量尝试每天记录一下开发的进度. 打算在这里主要记录游戏设计和开发的过程,作为自己的一个摸索的记录. 虽然只有一个人在做,但还是打 ...

  3. 用js写卡牌游戏(一)

    用js写卡牌游戏(一) 不想看废话的点这 直接看代码的点这 废话(前言) 现在游戏多了,不过总是感觉不太对自己的口味,每个游戏都感觉和自己想象中的要差了那么一点点,所以我决定尝试着自己写一个游戏. 因 ...

  4. 用js写卡牌游戏(八)

    前言 好久不见,离发布上次分享,已经过去很久很久了,这段时间发生了很多变故,经历了跳槽.离职.创业等等,手头也一直有很多事情在忙,不过鸽这么久其实是有别的理由,有一个非常重要的功能一直卡住,没有思路, ...

  5. 【概率DP】$P2059$ 卡牌游戏

    [概率DP]P2059 卡牌游戏 链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张 ...

  6. 动漫品牌“爆笑虫子”宣布与xNFT Protocol战略合作,开发NFT数字卡牌游戏

    2021年4月23日,xNFT Protocol与动漫品牌"爆笑虫子"进行战略合作,推动"爆笑虫子"在卡牌游戏领域进行数字化转型.IP的数字(NFT)化是xNF ...

  7. CCF201612-5 卡牌游戏(募集解题代码)

    试题编号: 201612-5 试题名称: 卡牌游戏 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 小Q和小M是游戏数值策划师,他们最近在测试自己新设计的卡牌对战游戏.游戏总共 ...

  8. 算法题 - 卡牌游戏问题 - Python

    问题描述: 卡牌游戏问题   小a和小b玩一个游戏,有 n张卡牌,每张上面有两个正整数 x, y.取一张牌时,个人积分增加 x,团队积分增加 y.求小a,小b各取若干张牌,使得他们的 个人积分相等,且 ...

  9. java卡牌游戏详解

    代码如下: package zxc;//文件夹名称 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.even ...

  10. 基于QT开发的开源局域网联机UNO卡牌游戏报告(附github仓库地址)

    源代码: https://github.com/yunwei37/UNO-game-oop 目录 1. 需求分析 1.1. UNO卡牌游戏的基本功能 1.2. UNO卡牌游戏的规则 2. 总体设计 3 ...

最新文章

  1. 分计算iv值_机器学习-变量筛选之IV值和WOE
  2. 大型网站核心架构要素--扩展性
  3. 图数据的攻与防:智谱AI和biendata联合组织KDD Cup 2020
  4. 【后缀数组】【poj2774】【 Long Long Message】
  5. MS CRM 2011 RibbonExport Utility下载以及实用说明
  6. matlab 取43阶上部分,求教关于matlab四阶累积量函数里变量的意义。
  7. 企业实战(Jenkins+GitLab+SonarQube)_09_jenkins发布项目到测试环境
  8. 1.django 开发环境搭建
  9. 【AI视野·今日CV 计算机视觉论文速览 第164期】Fri, 18 Oct 2019
  10. java Flink使用addSink方法保存流到mysql数据库中
  11. 机器学习之KNN算法学习笔记
  12. 这才是设计 React 的万金油!
  13. mysql for update死锁_Mysql 数据库死锁过程分析(select for update)
  14. LED显示驱动(七):图层基本测试总结
  15. 奇迹服务器断开怎么修复,奇迹挂机怎么总是掉线?
  16. 六年如逆旅,我亦是行人
  17. 六级单词词组积累(三)
  18. python之html和css基础
  19. 突然的:图形设备驱动程序错误代码 43 -(已解决)
  20. 一种基于多维时序数据预测综合判定的方法(内存告警)

热门文章

  1. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第十一章 攻击性取证
  2. 马斯克的收购让员工感到恐慌 CEO安抚称公司不会被“挟持”
  3. Linux常用系统管理命令详解
  4. npm切换淘宝镜像源
  5. 网站优化seo批量发文软件
  6. 终端执行php,命令行执行php语句
  7. 常见的语音相关的基本特征
  8. TCP/IP分层模型与网络认知
  9. CDH中yarn的动态资源池配置
  10. Milo源码解析(二)