华师一附中OI组

标题: 模拟扑克牌发牌程序 [打印本页]

作者: diggersun    时间: 2015-10-31 20:23
标题: 模拟扑克牌发牌程序
本帖最后由 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


作者: diggersun    时间: 2015-10-31 20:29
  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. }
复制代码

作者: diggersun    时间: 2015-10-31 20:34
本帖最后由 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两个库。





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2