华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1294|回复: 2
打印 上一主题 下一主题

模拟扑克牌发牌程序

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2015-10-31 20:23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 diggersun 于 2015-10-31 20:28 编辑

首先考虑扑克牌的表示法,这是计算机程序和人的思维很不同的地方
一副扑克牌除掉大小王的话有52张,原始的顺序是黑桃A 黑桃2黑桃3****黑桃K红桃A红桃2****方块K,每张牌都有两个参数,位置和数值,可以用数组表示,将他们编号成0,1,2**51,那么每个牌就有了一个唯一数值和位置标记。初始是位置和数值相等,洗牌后就不一样了。
黑桃红桃梅花方块用什么表示呢?A 2 3 4 5 6 7 8 910 J Q K 呢。一般情况下像这样的表示都仿照以前讲过的星期几的表示法。
0表示黑桃,1红桃2梅花3方块,那么扑克牌的数字除以13的余数就是花色值,输出的时候考虑到直观还是用字符串倒一下。char HS[4]= {6,3,5,4}; 这样就形成了一个直观的对应关系。
同样,面值的话用string MZ=" A 2 3 4 5 6 7 8 910 J Q K"来转换表示,因为10比较特殊,两位数,其他的都是一位数,没有办法,只能都定义为两位,某些数字前面加个空格。
洗牌的时候用比较笨的方法,每次将第i张牌和52张中任意一张交换,如此重复52次,也算是洗乱了。为了保证每次洗的不一样,用了随机函数random

回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2015-10-31 20:29:23 | 只看该作者
  1. #include <iostream>
  2. //#include <string>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. using namespace std;
  6. int n,r,i,j,k;
  7. int a[100];
  8. string MZ=" A 2 3 4 5 6 7 8 910 J Q K";
  9. char HS[4]= {6,3,5,4};
  10. int main()
  11. {

  12.     for (i=0; i<=51; i++) a[i]=i;
  13.     srand((int)time(NULL));

  14.     for (i=0; i<=50; i++)
  15.     {
  16.         j=rand()%52;
  17.         swap(a[i],a[j]);
  18.     }

  19.     for (i=0; i<=51; i++)
  20.     {
  21.         cout<<HS[a[i]/13];
  22.         cout<<MZ[2*(a[i]%13)];
  23.         cout<<MZ[2*(a[i]%13)+1];
  24.         cout<<' ';
  25.         if (i%13==12) cout<<endl;

  26.     }
  27.     return 0;
  28. }
复制代码
回复 支持 反对

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
板凳
 楼主| 发表于 2015-10-31 20:34:10 | 只看该作者
本帖最后由 diggersun 于 2015-10-31 20:38 编辑

注 rand函数的用法
rand函数单用的话几乎是没有意义的,每次会产生一个相同的随机数,要配合srand 使用才能产生不同的随机数,标准用法如下
  1. #include<stdlib.h>
  2. #include<time.h>

  3.     srand((int)time(NULL));
  4.      x=rand();
复制代码

一般用time.h中的time函数来作为随机种子,time函数是返回开机要现在的时间片值,肯定是每次运行都不相同的。这样每次的随机种子就不相同,每次rand的结果就不会同。rand()产生一个随机数,我们把它%52 就会得到0..51之间的数字。srand和rand函数都在stdlib库中,所以程序要包含stdlib和time两个库。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-7 20:43 , Processed in 0.102885 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表