华师一附中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
#include <iostream>
//#include <string>
#include<stdlib.h>
#include<time.h>
using namespace std;
int n,r,i,j,k;
int a[100];
string MZ=" A 2 3 4 5 6 7 8 910 J Q K";
char HS[4]= {6,3,5,4};
int main()
{
for (i=0; i<=51; i++) a[i]=i;
srand((int)time(NULL));
for (i=0; i<=50; i++)
{
j=rand()%52;
swap(a[i],a[j]);
}
for (i=0; i<=51; i++)
{
cout<<HS[a[i]/13];
cout<<MZ[2*(a[i]%13)];
cout<<MZ[2*(a[i]%13)+1];
cout<<' ';
if (i%13==12) cout<<endl;
}
return 0;
}
复制代码
作者:
diggersun
时间:
2015-10-31 20:34
本帖最后由 diggersun 于 2015-10-31 20:38 编辑
注 rand函数的用法
rand函数单用的话几乎是没有意义的,每次会产生一个相同的随机数,要配合srand 使用才能产生不同的随机数,标准用法如下
#include<stdlib.h>
#include<time.h>
srand((int)time(NULL));
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