遇到一个模拟斗地主发牌过程的编程题,在这里记录一下,供大家参考。

首先,斗地主有三个玩家,一共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++相关推荐

  1. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序

    一副扑克有54张牌:大小王+4*13,接下来我们来模拟一下斗地主的发牌过程 首先,我们需要买牌,新买来的牌都是按顺序摆放的,因此下一步是洗牌,最后就是发牌了,不过发牌的时候要注意还要在最后留三张底牌. ...

  2. Python3模拟斗地主发牌

    模拟斗地主发牌,牌共54张, 花色:黑桃('\u2660'),梅花('\u2663'),方块('\u2665'),红桃('\u2666'),种类为:A2-10JQK,大小王(X, x) 三个人,每个人 ...

  3. python斗地主出牌算法_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  4. python 斗地主发牌_tkinter模拟斗地主发牌

    在上一篇文章的最后,我们留了一个小作业:花果山美男子:tkinter模拟扑克牌和狼人杀发牌​zhuanlan.zhihu.com 小作业2:模拟斗地主发牌,上方是牌库,实现从牌库到三个方向的动态发牌, ...

  5. 模拟斗地主发牌功能的设计与实现

    模拟斗地主发牌功能的设计与实现 参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色:三名玩家,其中地主比其他玩家多3张牌) 牌类 牌有牌面值.花色及实际大小三个属性 import ja ...

  6. python实现单机斗地主_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  7. java基础语法day20(Map、模拟斗地主发牌)

    第1章 Map接口 1.1 Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. 1. Collection中的集合, ...

  8. java中使用集合模拟斗地主发牌的两种排序(根据大小或者花色)

    第一种排序 根据花色,把相同的花色排到一起,然后将其花色一样的再进行排序 第一种排序参照代码中all()方法 第二种排序 真实的模拟斗地主游戏的排序玩法,即按照大王(这里用的是JOKER)joker2 ...

  9. 用php模拟斗地主发牌,php模拟实现斗地主发牌

    本文实例为大家分享了php实现斗地主发牌的具体代码,供大家参考,具体内容如下 闲来无聊,就写了这个方法,也算是熟悉下php的数组操作,还请各位大神多指教.$arr 数组,好像有点问题,应该 2=> ...

最新文章

  1. linux vim 基本操作
  2. 【思维导图】redis
  3. 【完整代码】Scala akka入门示例
  4. ES6对于数组的扩展
  5. 【MyBatis框架】高级映射-多对多查询
  6. 苹果推出“轻触支付”新方式 目前仅面向美国
  7. Python生成1000个随机字符的字符串,统计每个字符的出现次数(choices函数和Counter的使用)
  8. wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例
  9. c语言 465串口编程,用C语言编写串口程序
  10. java web程序设计答案郭克华_清华大学出版社郭克华JavaWeb程序设计上机习题答案及解析.doc...
  11. 【音频】G711编码原理
  12. 查看java堆栈信息
  13. 矢量绘图工具 Ipe
  14. 微信公众号第三方平台开发PYTHON教程 PART 1
  15. J2EE下使用AJAX(四) 隐藏帧 -- 史前的AJAX实现
  16. 重力感应失灵/更新win10后不能自动旋转屏幕
  17. Excel シートインポート、Excel シートエクスポート
  18. Java中的过滤器doFilter里的chain.doFilter()函数理解
  19. 了解计算机的组成和硬件系统
  20. inn之CTS debug小技巧(1)

热门文章

  1. DDR4之DM,DBI and TDQS
  2. C++ 与cocos2d-x-4.0完成太空飞机大战 (五)
  3. 贪心算法解决背包问题
  4. 通过Exiv2读取照片的Exif信息获取GPS,焦距等信息
  5. windows安装小爱同学
  6. [转]开源日志系统比较
  7. 利用Gitlab进行代码的协作开发
  8. 人机协作机器人发展趋势_“人机协作”从概念到趋势的解析(一):从协作机器人的前世今生说起...
  9. ipad iphone开发_如何在iPad或iPhone上安装字体
  10. 建筑施工企业数字化转型目标和应用价值