题目:模拟斗地主发牌

要求:给3个玩家随机发牌,发牌完成后对玩家的牌从大到小输出,最后输出底牌

解题思路:

1、定义一个string字符串 hand[]来表示1副扑克牌,

定义时不能随便定义,需要考虑到后面需要用到这些串进行比较排序,如果没有规则的定义字符串来表示54张牌,到后面进行比较排序时就可能出错。

例如:

刚开始,我使用

"0x01","0x02","0x03","0x04","0x05","0x06","0x07","0x08","0x09","0x0A","0x0B","0x0C","0x0D"

来定义方片A到方片K,到后面进行排序时,就不能通过比较每个串的后两个字符进行排序。

我的解决办法是:去掉"0x01","0x02",增加"0x0E","0x0F"

2、定义好牌型后,就需要把54张牌中的51张随机发给3个玩家,

可以通过定义一个二维数组 string player[3][20];  来表示3个玩家,这里每个数组都是20个字符串空间,其中有2个是农民,只需要17个空间,所以多定义了6个空间,不知道还有没有其他办法优化。

然后通过rand()%n 产生1个0到(n-1)的随机数,这里需要注意,如果只使用这个函数,会导致每次运行的结果都是一样的。如果想要每次运行结果都不一样,只需要在rand()函数之前使用srand()函数,产生随机种子,可以以系统时间作为参数,如srand((int)time(0)),这样每次运行产生的随机数都不一样。

生成随机num后,就通过1个for循环把hand[num]依次发给3个玩家

例如:

第一次生出一个随机数13,那么就把第14张底牌hand[13]赋值给第一个玩家的第一张牌player[0][0],然后再把第54张底牌移动到第13张底牌的位置

第二次生成一个随机数26,那么就把第27张底牌hand[26]赋值给第二个玩家的第一张牌player[1][0],然后再把第53张底牌移动到第26张底牌的位置

第三次生成一个随机数17,那么就把第18张底牌hand[17]赋值给第三个玩家的第一张牌player[2][0],然后再把第52张底牌移动到第17张底牌的位置

到最后发完牌了,hand[0],hand[1],hand[2]就是3张底牌

3、发完牌之后需要对牌进行排序

排序也很简单,使用的是冒泡排序,即取第一张牌的最后一个字符和第二张牌的最后一个字符进行比较,如果第一张牌的最后一个字符 < 第二张牌的最后一个字符,则把两张牌交换顺序,如果最后一个字符相等,则比较倒数第二个字符,这样一轮比较下来就能把最小的牌放到最后去了,2个for循环就能把牌排好序。

4、输出3个玩家拿到的牌和底牌

使用1个for循环输出就可以啦

具体请看代码,有不懂或觉得写得不好有优化的地方,欢迎留言讨论!

#include <iostream>
#include <string>
#include <cstdlib>  //rand()
#include <ctime>    //time()using namespace std;void auto_deal_card(string hand[],string player[3][20]);//自动发牌
void sort_string(string s[], int n); // 声明函数后,在main()函数中才可调用 ,函数作用:对牌进行排序
void print_card(string hand[],string player[3][20]); int main(){string hand[] = {"0x03","0x04","0x05","0x06","0x07","0x08","0x09","0x0A","0x0B","0x0C","0x0D","0x0E","0x0F","0x13","0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1C","0x1D","0x1E","0x1F","0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C","0x2D","0x2E","0x2F","0x33","0x34","0x35","0x36","0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x3E","0x3F","0xxW","0xDw"};//用来表示方片3到大王string player[3][20];  //用来表示3个玩家  auto_deal_card(hand,player); //给3个玩家发牌  sort_string(player[0],17); //给第1个玩家手牌进行排序 sort_string(player[1],17);sort_string(player[2],17);sort_string(hand,3); //给底牌进行排序    print_card(hand,player); //输出3个玩家手牌和底牌   return 0;
} //定义函数,用于输出玩家拿到的手牌和剩余底牌
void print_card(string hand[],string player[3][20]){for(int i=0; i<3; i++){cout<<"第"<<i+1<<"个玩家拿到的牌型:"; for(int j=0;j<17;j++){cout<<player[i][j]<<" ";}cout<<endl;}cout<<"剩余底牌:";for(int i=0; i<3; i++){cout<<hand[i]<<" ";}
} //定义函数,用于给3个玩家随机发牌
void auto_deal_card(string hand[],string player[3][20]){srand((int)time(0));  // 产生随机种子int n = 54, p1 = 0, p2 = 0, p3 = 0;for(int i=0;i<51;i++){int num = rand()%n;n--;if(i%3 == 0){player[0][p1] += hand[num];          p1++;}else if(i%3 == 1){player[1][p2] += hand[num]; p2++;}else{player[2][p3] += hand[num]; p3++;}hand[num] = hand[n];}
}//定义函数,用于给玩家手牌进行排序
void sort_string(string s[], int n){for(int i=0; i<n; i++){for(int j=0;j<n-i-1; j++){if(s[j][3] < s[j+1][3]){string replace = s[j];s[j] = s[j+1];s[j+1] = replace;}if(s[j][3] == s[j+1][3]){if(s[j][2] < s[j+1][2]){string replace = s[j];s[j] = s[j+1];s[j+1] = replace;}}}}
}

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. 模拟斗地主发牌过程 C++

    遇到一个模拟斗地主发牌过程的编程题,在这里记录一下,供大家参考. 首先,斗地主有三个玩家,一共54张扑克牌,玩家抽完牌后剩余3张底牌.题目要求将54张牌发给三个玩家,并给每个玩家手中的扑克牌进行排序. ...

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

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

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

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

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

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

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

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

最新文章

  1. 仿照redis写的nginx开机画面
  2. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor...
  3. 黑马程序员_Java基础GUI
  4. app 图标规格参考表
  5. openstack 教程_OpenStack的新提示,技巧和教程
  6. 20155227第十二周课堂实践
  7. Contki 相关链接备忘
  8. 人工智能?你需要了解的内容和AI学习路线
  9. 10个谷歌浏览器调试技巧
  10. oracle 12c 容器数据库公共用户去访问pdb数据库
  11. html仿百度贴吧,利用Canvas模仿百度贴吧客户端loading小球的方法示例
  12. python中trun是什么意思_Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun錯誤解決方案...
  13. 淘宝教育视频加速观看(在淘宝教育上看学习视频,需要加速,在谷歌浏览器上安装视频加速插件)
  14. 通过XtraBackup进行数据库表备份和表空间传输实例
  15. 汽车美容店管理系统如何管理店铺数据?
  16. AH8669_DC650V/AC265V高压IC,输出5V12V24V500MA电源芯片方案
  17. 软件工程 - 基于UML的面向对象设计报告模板
  18. KaLinux破解查看无线密码
  19. 百度AI开发者大会-你是其中一个嘛?百度Create大会(无人驾驶)
  20. Nginx限制或允许IP或IP段访问

热门文章

  1. 中国矿业大学计算机保研去向,喜报!中国矿业大学1065人被保研到北大、清华等校,名单已公布!...
  2. 18个免费替代Photoshop的图像编辑软件
  3. 衡水中学2021年的高考成绩查询,2021衡水市地区高考成绩排名查询,衡水市高考各高中成绩喜报榜单...
  4. R语言绘制bivariate polar plots
  5. 奶源争夺战日趋白热化,纳入港股通的优然牧业还有哪些牌?
  6. 牙齿变色怎么办?如何清洁牙齿?
  7. index和match函数
  8. IBM Platform LSF在IC行业内的使用
  9. robots.txt文件信息泄漏
  10. ThinkPad安装ALPS驱动后任然关闭触摸板失败的解决方法