博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言模拟洗发牌
阅读量:2338 次
发布时间:2019-05-10

本文共 3098 字,大约阅读时间需要 10 分钟。

问题描述

通过C语言模拟洗发牌的过程,牌一共有52张,四种花色,13中数字。

构成扑克牌

实现
  • 单张牌的构成:牌面 + 花色
    • 牌面标志:梅花clubs,红心hearts,黑桃spades,方片diamonds
    • 牌面:A,2,3,4,5,6,7,8,9,Jack,Queen,King
    • 组合:通过整除13和对13进行除余进行构成扑克牌
代码实现
typedef struct{
char suit[10]; //花色 char face[10]; //牌面}CARD;void FillCard(CARD card[]);//构成扑克牌void FillCard(CARD card[]){
char *face[] = {
"A","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; char *suit[] = {
"Spades","Hearts","Clubs","Diamonds"}; int i = 0; for(;i < 13;i ++) {
strcpy(card[i].face,face[i % 13]); strcpy(card[i].suit,suit[i / 13]); }}

洗牌

实现
  • 生成一个内容为1到52的随机的数字序列,同时中间没有重复
    • 方法一:生成随机数,范围为0到51,每一次都要检查是否出现了重复
    • 方法二:生成0到51范围内的随机数,然后和当前的i进行交换,即使生成了随机数也没有任何问题
知识补充——生成随机数
  • rand(void)函数
    • 在<stdlib.h>头文件中,生成一个0~RAND_MAX之间的整数
    • 生成的是伪随机数,种子不变生成的随机数的顺序不变
#include 
#include
int main(){
int a = rand(); printf("%d\n",a); return 0;}
  • srand()为随机数播种的函数
    • 改变rand()随机数的种子,确保每次运行产生不同的随机数
    • 常用时间戳作为随机数的根
#include 
#include
#include
int main() {
int a; srand((unsigned)time(NULL)); a = rand(); printf("%d\n", a); return 0;}
代码实现
//生成无规则的乱序的洗牌数组void Wash(int result[]){
int randnum = 0 ,temp = 0; //对所有的数组元素进行初始化 for(int i = 0;i < 52; i++) {
result[i] = i; } //生成随机的是数列 for(int i = 0; i< 52;i ++) {
randnum = rand() % 52; temp = result[randnum]; result[randnum] = result[i]; result[i] = temp; } return ;}//发牌,传入对应的结构体的数组和随机打乱的数组序列void Deal(CARD card[],int result[]){
for(int i = 0;i < 52;i ++) {
printf("%10s %7s \n",card[result[i]].face,card[result[i]].suit); }}
main()函数
int main(){
int result[52]; //模拟洗发牌 CARD card[52]; FillCard(card); Wash(result); Deal(card,result);}
总代码
#include 
#include
#include
#include
typedef struct{
char suit[10]; //花色 char face[10]; //牌面}CARD;void FillCard(CARD card[]); //生成牌void Deal(CARD card[], int result[]); //发牌的应用void Wash(int result[]);int main(){
int result[52]; //模拟洗发牌 CARD card[52]; FillCard(card); Wash(result); Deal(card,result); return 0;}//生成无规则的乱序的洗牌数组void Wash(int result[]){
srand((unsigned)time(NULL)); int randnum = 0 ,temp = 0; //对所有的数组元素进行初始化 for(int i = 0;i < 52; i++) {
result[i] = i; } //生成随机的是数列 for(int i = 0; i< 52;i ++) {
randnum = rand() % 52; temp = result[randnum]; result[randnum] = result[i]; result[i] = temp; } return ;}//发牌,传入对应的结构体的数组和随机打乱的数组序列void Deal(CARD card[],int result[]){
for(int i = 0;i < 52;i ++) {
printf("%10s %7s \n",card[result[i]].face,card[result[i]].suit); }}//构成扑克牌void FillCard(CARD card[]){
char *face[] = {
"A","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; char *suit[] = {
"Spades","Hearts","Clubs","Diamonds"}; int i = 0; for(;i < 52;i ++) {
strcpy(card[i].face,face[i % 13]); strcpy(card[i].suit,suit[i / 13]); }}

转载地址:http://vggpb.baihongyu.com/

你可能感兴趣的文章
malloc (0)详解
查看>>
linux清除cache的方法
查看>>
memmove 和 memcpy的区别以及处理内存重叠问题
查看>>
费雪耶兹(Fisher–Yates) 也被称作高纳德( Knuth)随机置乱算法
查看>>
C/C++中变量的存储位置
查看>>
C++中四种强制类型转换区别详解
查看>>
RTTI
查看>>
linux gdb的详细用法 运行与断点
查看>>
删除vector中重复元素
查看>>
和为s的连续正数序列
查看>>
什么是Redis?什么是nosql?NoSQL数据库的四大分类
查看>>
为什么说Redis是单线程的以及Redis为什么这么快!
查看>>
redis的过期健删除策略以及内存淘汰机制
查看>>
redis 双写一致性问题
查看>>
map 如何使用结构体作为自定义键值
查看>>
Mysql几种索引类型的区别及适用情况
查看>>
Redis缓存穿透、缓存雪崩、redis并发问题分析
查看>>
Redis持久化的两种方式
查看>>
判断一个数组,是否可以分成两个数组之和相等的数组
查看>>
背包问题
查看>>