问题描述:

模拟斗地主开场前的发牌工作。扑克牌:54张,抽出3张底牌,剩余51张随机轮流发给三位玩家

问题分析:

  • 初始化扑克牌

按顺序将54张扑克牌初始化

牌号:A,2,3,4,5,6,7,8,9,10,J,Q,K(大王:B,小王:S)

图形:ASCII码的3 4 5 6                                                                                                                    花色:省略

定义结构体

  • 洗牌

用随机函数将54张牌的顺序打乱

  • 发牌并显示

按打乱后的顺序依次给三位玩家发牌,最后三张留下

  • 显示底牌

显示最后三张牌

开发环境

Windows10

dev c++


功能实现:

  • 存储结构

c语言字符不易处理,本来想着用指针做,但是不方便洗牌

struct
{char num;int pic;
}list[54];
char num_list[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
  • 初始化牌
void Inite()//初始化牌
{char num_list[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'};int n=0;//牌数 int rand_num[54];//按牌号顺序对每个牌号分配4种花色for(int j=0;j<13;j++){for(int k=3;k<7;k++){list[n].num=num_list[j];list[n].pic=k;n++;}}//大小王 list[n].num='B';list[n].pic=1;list[n+1].num='S';list[n+1].pic=1;
}
  • 洗牌

洗牌就是把顺序打乱,这里我有两种打乱方法

1.为原数据生成54个不重复索引数,直接按新顺序进行发牌

void shuffl()//洗牌
{srand(time(NULL));for(int i=0;i<54;i++){a[i]=rand()%54;for(int j=0;j<i;j++){while(a[i]==a[j]) {i--; }}}
}

2.两两交换方法。可以随机生成一个或两个数(54以内),使生成的两个数作为索引时所代表的数据进行交换,以保证乱序的同时数据的完整性。

void shuffle()
{srand(time(NULL));for(int i=0;i<54;i++) a[i]=i;for(int i=0;i<54;i++){int c=rand()%54;int b[1];b[0]=a[i];a[i]=a[c];a[c]=b[0];}
}
  • 发牌
void print()//发牌
{int n=0;printf("玩家一:");for(int i=0;i<51;i++) if(i%3==0) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n玩家二:");for(int i=0;i<51;i++) if(i%3==1) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n玩家三:");for(int i=0;i<51;i++) if(i%3==2) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n底牌:");for(int i=53;i>50;i--) printf("%c%c ",list[a[i]].num,list[a[i]].pic);}

测试实例及运行结果:

源程序清单:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct
{char num;int pic;
}list[54];
int a[54]={0};void Inite()//初始化牌
{char num_list[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'};int n=0;//牌数 int rand_num[54];for(int j=0;j<13;j++){for(int k=3;k<7;k++){list[n].num=num_list[j];list[n].pic=k;n++;}}//大小王 list[n].num='B';list[n].pic=1;list[n+1].num='S';list[n+1].pic=1;
}void shuffl()//洗牌
{srand(time(NULL));for(int i=0;i<54;i++){a[i]=rand()%54;for(int j=0;j<i;j++){while(a[i]==a[j]) {i--; }}}
}
/*
void shuffle()
{srand(time(NULL));for(int i=0;i<54;i++) a[i]=i;for(int i=0;i<54;i++){int c=rand()%54;int b[1];b[0]=a[i];a[i]=a[c];a[c]=b[0];}
}
*/
void print()//发牌
{int n=0;printf("玩家一:");for(int i=0;i<51;i++) if(i%3==0) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n玩家二:");for(int i=0;i<51;i++) if(i%3==1) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n玩家三:");for(int i=0;i<51;i++) if(i%3==2) printf("%c%c  ",list[a[i]].num,list[a[i]].pic);printf("\n底牌:");for(int i=53;i>50;i--) printf("%c%c ",list[a[i]].num,list[a[i]].pic);}
int main()
{Inite();shuffl(); //shuffl();print();return 0;
}

问题总结

1. ASCII码的前几位在shell上显示不出来

解决:

右击窗口白条——属性——将字体改为“点阵字体”

2.  [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode

原因:在 for 循环里声明变量只允许在 C99 或 C11 模式

解决:工具——编译选项——代码生成——语言标准选择C99

c语言发牌器(斗地主)相关推荐

  1. 【C语言】写一个斗牛小游戏的发牌器

    我可能是个比较乱的目录 斗牛规则 创建牌库 删除牌库 洗牌 扑克的打印 扑克牌相关函数试验 按照斗牛规则发牌 游戏的实现 未来可改进 全部源码 与女朋友喜欢玩斗牛纸牌游戏.一直想用C语言实现发牌,今天 ...

  2. boost::graph模块实现Graphviz DOT 语言阅读器

    boost::graph模块实现Graphviz DOT 语言阅读器 实现功能 C++实现代码 实现功能 boost::graph模块实现Graphviz DOT 语言阅读器 C++实现代码 #def ...

  3. mysql解释器_atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  4. 并发问题的解决思路以及Go语言调度器工作原理

    上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...

  5. 上周并发题的解题思路以及介绍Go语言调度器

    上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...

  6. vc6下usb编程_5款免费的C/C++语言编程器

    C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.目前,C/C++语言十分热门.今天小编准 ...

  7. java扑克牌随机发牌_Java练习——扑克牌发牌器

    Java练习--扑克牌发牌器 声明:学习自其他博主,感谢分享,这里自己也写了一下. 实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试 构建一张扑克牌 /***@author冬冬 * 定义一个 ...

  8. 扑克牌java发牌_Java练习——扑克牌发牌器

    Java练习--扑克牌发牌器 声明:学习自其他博主,感谢分享,这里自己也写了一下. 实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试 构建一张扑克牌 /***@author冬冬 * 定义一个 ...

  9. java 随机发牌_java实现扑克牌发牌器

    Java练习--扑克牌发牌器,供大家参考,具体内容如下 声明:学习自其他博主,感谢分享 实现思路 构建一张扑克牌 构建一套扑克牌 测试 构建一张扑克牌 /** * @author 冬冬 * 定义一个单 ...

最新文章

  1. mount:在/dev/sr0上找不到媒体
  2. 数据库-数据库的常用术语
  3. Raphael学习笔记(2)--绘图(基本图形)
  4. HOW-TO:在Spring 4和Java 7中使用@PropertySource批注
  5. Modbus协议栈开发笔记之五:Modbus RTU Slave开发
  6. 系统架构师学习笔记-论文摘要部分的写法
  7. 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列...
  8. DPDK初始化分析(三)
  9. VS Code\unins000.exe创建报错解决方法
  10. cad转pdf格式简易步骤
  11. linux未找到命令rpm,RPM命令执行失败:bash: rpm: 未找到命令...
  12. Message、Handler、MessageQueue、Looper之间的关系
  13. ERR_FILE_NOT_FOUND错误
  14. linux mtd手动烧写固件,路由器固件的几种烧写方式
  15. 专访李果:初生牛犊不怕虎的移动创业者
  16. java17的下载与安装
  17. 苹果内购 订单验证 21002 坑
  18. zabbix3.0配置服务器流量告警
  19. 修改Docker容器端口
  20. VMware Workstation11.0安装Mac OS X 10.10最完整指南(包含所需所有资源下载)

热门文章

  1. 修改Windows server远程桌面连接端口3389
  2. 干货 | 万字长文详解携程酒店订单缓存 存储系统升级实践
  3. 解决在ubuntu的firefox浏览器下不能看b站视频的问题
  4. 创业基础(第一章第二章) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  5. Simulink电机控制代码生成-----关于PI控制器参数整定的一点总结
  6. 979_MISRA C规范学习笔记3
  7. Linux切换用户su root 与 su - root 的区别
  8. 2022年低压电工找解析及低压电工模拟考试题
  9. MRCP UA的创建及SIP信令处理
  10. 51单片机——软件延时实现跑马灯仿真