模拟斗地主发牌过程 C++
遇到一个模拟斗地主发牌过程的编程题,在这里记录一下,供大家参考。
首先,斗地主有三个玩家,一共54张扑克牌,玩家抽完牌后剩余3张底牌。题目要求将54张牌发给三个玩家,并给每个玩家手中的扑克牌进行排序。
扑克牌有四种花色,分别是黑桃,红桃,梅花,方块,即"♠", "♥", "♣", "♦"。
扑克牌大小顺序(从左往右依次递增):"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",“小王”,“大王”。
我们有两个主要的目的,一是发牌,二是排序。
发牌
首先,我们在玩斗地主时,在发牌之前要先洗牌,打乱扑克牌顺序,这样游戏才公平。
//随机打乱扑克牌数组顺序
void random(string s[],int a[],int n)
{int index,p;string tmp;srand(time(NULL));for(int i = 0; i < n; i++){index = rand() % (n-i) + i;if(index != i){//交换字符顺序tmp = s[i];s[i] = s[index];s[index] = tmp;//交换数字顺序p = a[i];a[i] = a[index];a[index] = p;}}
}
其次是发牌。一共三个玩家,按每个玩家每人每次摸3张牌的顺序发牌,最后每人手里都有17张牌。最后剩余3张底牌。
int i = 0,x = 0,y = 0,z = 0;for(k = 0; k < 54; k++){if(k >= 51){ //最后剩余3张底牌d[i] = numbr[k];numd[i] = sum[k];i++;}else{ //i对3取模,对应3个玩家抽牌if(k % 3 == 0){a[x] = numbr[k];num1[x] = sum[k];x++;}else if(k % 3 == 1){b[y] = numbr[k];num2[y] = sum[k];y++;}else if(k % 3 == 2){c[z] = numbr[k];num3[z] = sum[k];z++;}}}
排序
发牌结束后需要给每个玩家手里的牌进行排序。按照正常的斗地主游戏规则,牌面大小顺序(从左往右依次递增):"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",“小王”,“大王”。
//扑克牌排序。牌面数值我们事先给定其大小,然后在这里按照数值大小排序
void card(string s[],int a[],int n){for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(a[i] > a[j]){//交换牌面数字int temp = a[i];a[i] = a[j];a[j] = temp;//交换牌面字符string str = s[i];s[i] = s[j];s[j] = str;}}}
}
详细源代码如下:
#include<iostream>
#include<time.h>
using namespace std;string hs[4] = {"♠", "♥", "♣", "♦"};
string number[13] = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int numer[13] = {3,4,5,6,7,8,9,10,11,12,13,14,15}; //对应number里面的每个牌面的数值大小
string numbr[54]; //存储组合后的牌//随机打乱扑克牌数组顺序
void random(string s[],int a[],int n)
{int index,p;string tmp;srand(time(NULL));for(int i = 0; i < n; i++){index = rand() % (n-i) + i;if(index != i){//交换字符顺序tmp = s[i];s[i] = s[index];s[index] = tmp;//交换数字顺序p = a[i];a[i] = a[index];a[index] = p;}}
}
//扑克牌排序
void card(string s[],int a[],int n){for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(a[i] > a[j]){//交换牌面数字int temp = a[i];a[i] = a[j];a[j] = temp;//交换牌面字符string str = s[i];s[i] = s[j];s[j] = str;}}}
}//输出
void output(string s[],int a[],int n)
{card(s,a,n);for(int i = 0; i < n; i++){cout << s[i] <<" ";}cout << endl;
}int main()
{int k = 0;int num = 0;int sum[54]; //存储牌面数值for(int i = 0; i < 13; i++){for(int j = 0; j < 4; j++){string temp = number[i] + hs[j]; //将花色和数字组合num++;numbr[k] = temp; //牌面sum[k] = numer[i]; //牌面数值k++;}}//添加 大王、小王string tmp1 = "大王";numbr[k] = tmp1; //存储牌面sum[k] = 16; //添加牌面数值大小num++;k++;string tmp2 = "小王";numbr[k] = tmp2;sum[k] = 17;num++;string a[18],b[18],c[18],d[4]; //玩家a b c 和底牌int num1[18],num2[18],num3[18],numd[4]; //每一个玩家和底牌的牌面数值random(numbr,sum,54); //调用函数打乱扑克牌顺序int i = 0,x = 0,y = 0,z = 0;for(k = 0; k < 54; k++){if(k >= 51){ //最后剩余3张底牌d[i] = numbr[k];numd[i] = sum[k];i++;}else{ //i对3取模,对应3个玩家抽牌if(k % 3 == 0){a[x] = numbr[k];num1[x] = sum[k];x++;}else if(k % 3 == 1){b[y] = numbr[k];num2[y] = sum[k];y++;}else if(k % 3 == 2){c[z] = numbr[k];num3[z] = sum[k];z++;}}} cout << "玩家a:";output(a,num1,17);cout << "玩家b:";output(b,num2,17);cout << "玩家c:";output(c,num3,17);cout << "底牌:";output(d,numd,3);return 0;
}
运行结果图:
模拟斗地主发牌过程 C++相关推荐
- java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
一副扑克有54张牌:大小王+4*13,接下来我们来模拟一下斗地主的发牌过程 首先,我们需要买牌,新买来的牌都是按顺序摆放的,因此下一步是洗牌,最后就是发牌了,不过发牌的时候要注意还要在最后留三张底牌. ...
- Python3模拟斗地主发牌
模拟斗地主发牌,牌共54张, 花色:黑桃('\u2660'),梅花('\u2663'),方块('\u2665'),红桃('\u2666'),种类为:A2-10JQK,大小王(X, x) 三个人,每个人 ...
- python斗地主出牌算法_python模拟斗地主发牌
本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...
- python 斗地主发牌_tkinter模拟斗地主发牌
在上一篇文章的最后,我们留了一个小作业:花果山美男子:tkinter模拟扑克牌和狼人杀发牌zhuanlan.zhihu.com 小作业2:模拟斗地主发牌,上方是牌库,实现从牌库到三个方向的动态发牌, ...
- 模拟斗地主发牌功能的设计与实现
模拟斗地主发牌功能的设计与实现 参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色:三名玩家,其中地主比其他玩家多3张牌) 牌类 牌有牌面值.花色及实际大小三个属性 import ja ...
- python实现单机斗地主_python模拟斗地主发牌
本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...
- java基础语法day20(Map、模拟斗地主发牌)
第1章 Map接口 1.1 Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. 1. Collection中的集合, ...
- java中使用集合模拟斗地主发牌的两种排序(根据大小或者花色)
第一种排序 根据花色,把相同的花色排到一起,然后将其花色一样的再进行排序 第一种排序参照代码中all()方法 第二种排序 真实的模拟斗地主游戏的排序玩法,即按照大王(这里用的是JOKER)joker2 ...
- 用php模拟斗地主发牌,php模拟实现斗地主发牌
本文实例为大家分享了php实现斗地主发牌的具体代码,供大家参考,具体内容如下 闲来无聊,就写了这个方法,也算是熟悉下php的数组操作,还请各位大神多指教.$arr 数组,好像有点问题,应该 2=> ...
最新文章
- linux vim 基本操作
- 【思维导图】redis
- 【完整代码】Scala akka入门示例
- ES6对于数组的扩展
- 【MyBatis框架】高级映射-多对多查询
- 苹果推出“轻触支付”新方式 目前仅面向美国
- Python生成1000个随机字符的字符串,统计每个字符的出现次数(choices函数和Counter的使用)
- wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例
- c语言 465串口编程,用C语言编写串口程序
- java web程序设计答案郭克华_清华大学出版社郭克华JavaWeb程序设计上机习题答案及解析.doc...
- 【音频】G711编码原理
- 查看java堆栈信息
- 矢量绘图工具 Ipe
- 微信公众号第三方平台开发PYTHON教程 PART 1
- J2EE下使用AJAX(四) 隐藏帧 -- 史前的AJAX实现
- 重力感应失灵/更新win10后不能自动旋转屏幕
- Excel シートインポート、Excel シートエクスポート
- Java中的过滤器doFilter里的chain.doFilter()函数理解
- 了解计算机的组成和硬件系统
- inn之CTS debug小技巧(1)
热门文章
- DDR4之DM,DBI and TDQS
- C++ 与cocos2d-x-4.0完成太空飞机大战 (五)
- 贪心算法解决背包问题
- 通过Exiv2读取照片的Exif信息获取GPS,焦距等信息
- windows安装小爱同学
- [转]开源日志系统比较
- 利用Gitlab进行代码的协作开发
- 人机协作机器人发展趋势_“人机协作”从概念到趋势的解析(一):从协作机器人的前世今生说起...
- ipad iphone开发_如何在iPad或iPhone上安装字体
- 建筑施工企业数字化转型目标和应用价值