c语言发牌器(斗地主)
问题描述:
模拟斗地主开场前的发牌工作。扑克牌: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语言发牌器(斗地主)相关推荐
- 【C语言】写一个斗牛小游戏的发牌器
我可能是个比较乱的目录 斗牛规则 创建牌库 删除牌库 洗牌 扑克的打印 扑克牌相关函数试验 按照斗牛规则发牌 游戏的实现 未来可改进 全部源码 与女朋友喜欢玩斗牛纸牌游戏.一直想用C语言实现发牌,今天 ...
- boost::graph模块实现Graphviz DOT 语言阅读器
boost::graph模块实现Graphviz DOT 语言阅读器 实现功能 C++实现代码 实现功能 boost::graph模块实现Graphviz DOT 语言阅读器 C++实现代码 #def ...
- mysql解释器_atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- 并发问题的解决思路以及Go语言调度器工作原理
上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...
- 上周并发题的解题思路以及介绍Go语言调度器
上周的文章<Go并发编程里的数据竞争以及解决之道>最后留下了一个用并发解决的思考题,期间有几位同学留言说了自己的实现思路,也有两位直接私信发代码让我看的,非常感谢几位的积极参与.今天的文章 ...
- vc6下usb编程_5款免费的C/C++语言编程器
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.目前,C/C++语言十分热门.今天小编准 ...
- java扑克牌随机发牌_Java练习——扑克牌发牌器
Java练习--扑克牌发牌器 声明:学习自其他博主,感谢分享,这里自己也写了一下. 实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试 构建一张扑克牌 /***@author冬冬 * 定义一个 ...
- 扑克牌java发牌_Java练习——扑克牌发牌器
Java练习--扑克牌发牌器 声明:学习自其他博主,感谢分享,这里自己也写了一下. 实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试 构建一张扑克牌 /***@author冬冬 * 定义一个 ...
- java 随机发牌_java实现扑克牌发牌器
Java练习--扑克牌发牌器,供大家参考,具体内容如下 声明:学习自其他博主,感谢分享 实现思路 构建一张扑克牌 构建一套扑克牌 测试 构建一张扑克牌 /** * @author 冬冬 * 定义一个单 ...
最新文章
- mount:在/dev/sr0上找不到媒体
- 数据库-数据库的常用术语
- Raphael学习笔记(2)--绘图(基本图形)
- HOW-TO:在Spring 4和Java 7中使用@PropertySource批注
- Modbus协议栈开发笔记之五:Modbus RTU Slave开发
- 系统架构师学习笔记-论文摘要部分的写法
- 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列...
- DPDK初始化分析(三)
- VS Code\unins000.exe创建报错解决方法
- cad转pdf格式简易步骤
- linux未找到命令rpm,RPM命令执行失败:bash: rpm: 未找到命令...
- Message、Handler、MessageQueue、Looper之间的关系
- ERR_FILE_NOT_FOUND错误
- linux mtd手动烧写固件,路由器固件的几种烧写方式
- 专访李果:初生牛犊不怕虎的移动创业者
- java17的下载与安装
- 苹果内购 订单验证 21002 坑
- zabbix3.0配置服务器流量告警
- 修改Docker容器端口
- VMware Workstation11.0安装Mac OS X 10.10最完整指南(包含所需所有资源下载)
热门文章
- 修改Windows server远程桌面连接端口3389
- 干货 | 万字长文详解携程酒店订单缓存 存储系统升级实践
- 解决在ubuntu的firefox浏览器下不能看b站视频的问题
- 创业基础(第一章第二章) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
- Simulink电机控制代码生成-----关于PI控制器参数整定的一点总结
- 979_MISRA C规范学习笔记3
- Linux切换用户su root 与 su - root 的区别
- 2022年低压电工找解析及低压电工模拟考试题
- MRCP UA的创建及SIP信令处理
- 51单片机——软件延时实现跑马灯仿真