在R语言构建自动洗牌,发牌
要求:自动洗牌、发牌
任务一:创建一副牌。学会如何使用R的数据类型和数据结构。
任务二:编写发牌和洗牌的函数。学习从一个数据集中抽取想要的数值。
首先需要创建一副牌(不包括大小王),从R语言的数据对象来看,数据框最合适。
因为花色是字符串,而点数是数字,所以能够承担数据类型不同的二维数据对象——数据框最合适。下面是创建pkp数据对象的代码

pkp<-data.frame(face=rep(c(2:10,"J","Q","K","A"),4),hs=rep(c("黑桃","方块","红桃","梅花"),each=13))

然后我们需要构造发牌,洗牌函数
在构造发牌,洗牌函数的过程中,最重要的理解逻辑,怎么才能发牌呢?
不妨思考模拟下日常生活中是怎么发牌的呢?首先我们都是从牌堆里面抽取一张扑克牌,然后牌堆就少了一张牌,继续按照顺序抽取,直到牌堆没有牌。
如果用代码思考的话,就是在pkp这个牌堆里面抽取第一张,然后有pkp[-1,]丢掉这张牌,继续抽取后丢掉,这就是发牌的过程。

#licensing pkp
licensing<-function(){assign("copypkp",copypkp[-1,],envir = globalenv())copypkp[1,]
}

在这里需要介绍下assign函数,assign函数是一个赋值语句,与”=”和”<-“不同的是,assign能在不同的环境下赋值。
下面需要介绍环境,环境在R中是比较重要的概念,什么是环境呢?
可以说环境和我们电脑里面的文件夹很类似
环境:用来具体存储对象的地方。
规则1:每一个对象都存储在一个环境当中。
规则2:每一个环境都与一个父环境相连接。构成一个分层的环境系统。
规则3:子环境与父环境的连接是单向的。
parenvs{pryr}:查看R的环境系统,parenvs(all=TRUE)会返回当前会话包含的环境列表。
as.environment():指向环境树中的任意一个环境。
globalenv();base();emptyenv();parent.env()
assign():赋值函数
下面通过parenvs查看当前R语言下的环境

默认环境是globalenv(全局变量),也就是说我们创建对象,一般都是在globalenv环境里,
如果创建函数的话,R会自动给函数分配环境,且函数环境是globalenv的子环境
说环境的话可能不好理解,我们把环境比作文件夹。globalenv环境相当于默认文件夹,我们在globalenv环境创建的对象都储存在默认文件夹里面,函数相当于在默认文件夹里面再创建一个文件夹,函数文件夹创建的对象储存在函数文件夹中。

关于环境有一点很重要。就是如何应用环境里面的对象。下面是环境作用域规则
活动环境:当前R执行活动的地方。
规则1:任何时候,R的活动环境都只有一个。
规则2:所有的新对象都会被存储在该环境中。
environment():查看当前的活动环境。
作用域规则:R搜索对象时会遵循的一系列规则。
规则1:R首先在当前的活动环境中搜索对象。
规则2:在命令行工作中,活动环境就是全局环境。
规则3:当R在某个环境中没有搜索到对象时,R会进入到该环境的父环境。
下面是洗牌函数的构造
我理解的洗牌就是要把pkp这个数据对象里面的顺序打乱,如何打乱顺序呢?
我的思路是,构造一个随机向量,里面有52个值,然后构造一个循环52次的结构,将随机向量一个个的赋值给pkp这个数据对象.下面是洗牌函数代码

#shuffle pkp
shuffle<-function(){copypkp<-pkprandom<-sample(c(1:52),size=52)for (i in 1:52){assign("copypkp",copypkp[random,],envir = globalenv())}print("your pkp has been shuffled")
}

完整代码如下

#create pkp data
pkp<-data.frame(face=rep(c(2:10,"J","Q","K","A"),4),hs=rep(c("黑桃","方块","红桃","梅花"),each=13))
#copy pkp
copypkp<-pkp
#licensing pkp
licensing<-function(){assign("copypkp",copypkp[-1,],envir = globalenv())copypkp[1,]
}
#shuffle pkp
shuffle<-function(){copypkp<-pkprandom<-sample(c(1:52),size=52)for (i in 1:52){assign("copypkp",copypkp[random,],envir = globalenv())}print("your pkp has been shuffled")
}

有一个点需要特别注意,就是对象的更改。两个函数我都是对copypkp这个数据对象进行更改,pkp这个数据对象是没有变化的。这样有利于shuffle(洗牌)后的重置化。
但是这个自动洗牌,发牌还有一个重大的缺陷:如果pkp这个数据对象不小心被删除的化,整个洗牌,发牌过程都实现不了。
要解决这个问题,我们就必须用到闭包函数的概念和深入理解环境
在下一篇我会详细介绍闭包的实现和环境的深入理解

R语言构造扑克牌自动发牌,洗牌相关推荐

  1. [C语言] 发牌洗牌

    C语言发牌洗牌 1.模拟发牌程序 通过写两个函数模块来编写洗牌程序和打印的发牌程序 2.编写洗牌程序 void shuffle(char cards[][10],int n){int i=54;cha ...

  2. Java实验-02 模拟扑克牌游戏的洗牌

    结合面向对象设计原则,分析和设计模拟扑克牌游戏的洗牌过程. 编程定义一个表示扑克牌的类 Poke,用 suit 来表示扑克牌的花色,用 face 来表示扑克牌的 牌面值,每副牌为 52 张,不考虑包含 ...

  3. JAVA控制台扑克牌游戏,洗牌,发牌,比较大小

    此游戏是一个简单的并且很基础的java控制台程序.这个扑克牌游戏主要的游戏过程是:首先创建一副扑克牌,创建好了后要进行洗牌,牌洗好了,需要玩家来玩,接下来就创建玩家.有洗好的牌,也有玩家了,那么就开始 ...

  4. 模拟扑克牌游戏的洗牌

    大家都很喜欢玩扑克牌,那么如果面试官让你用计算机模拟一个扑克游戏的发牌或者洗牌,你会怎么做呢? 代码如下: #include<stdio.h> #include<stdlib.h&g ...

  5. 洗牌算法java 剑指_扑克牌的完美洗牌算法

    思路: 递归思想.我们有n张牌,不妨先假设有一个洗牌函数shuffle(....),能完美的洗出n-1张牌 .拿第n张牌来打乱前面n-1的洗牌顺序,从而得到n张牌的最终结果. 代码如下: #inclu ...

  6. 扑克牌八次洗牌等于没洗牌

    这是一个没有课的下午,按照惯例,刷着逼乎. 突然间看到这么一个文章:打牌必须洗八次. 大意就是:使用交错式洗牌,八次后恢复到最早的牌序. 于是乎,打开电脑,随便打几行代码验证一下: public cl ...

  7. Java实现扑克牌自动发牌系统

    利用Java的ArrayList实现随机给三个人发扑克牌 import java.util.ArrayList; import java.util.List; import java.util.Ran ...

  8. 洗牌、发牌算法 (打乱扑克牌顺序)

      #include <stdio.h> #include <stdlib.h> #include <time.h> int  d[6]; int  i,n,a,b ...

  9. 扑克牌洗牌发牌,并排序输出(c++)

    52张扑克牌,随机洗牌,然后发牌,并把每个玩家的牌按从大到小的顺序显示 大小规则:AKQJ1098765432 输出效果: 完整代码: #include <iostream> #inclu ...

最新文章

  1. GDAL库简介以及在Windows下编译过程
  2. 响应式网页的布局设计
  3. 宏基因组数据提交GSA指南
  4. 可怕!如果张东升是个程序员......
  5. iis7配置php mysql_IIS7配置支持PHP方法
  6. [js]jquery里的jsonp实现ajax异源请求
  7. React - S1
  8. mysql保存一个文件怎么打开_悄悄告诉你,MySQL 通过SQL语句导出到Excel的方法-sql文件怎么打开...
  9. 2021-2025年中国船用辅机行业市场供需与战略研究报告
  10. python多线程编程_python之多线程编程
  11. MTK 10A 消息机制
  12. Spark Runtime概述
  13. 计算机音乐与制谱,电脑音乐编辑、制谱与视唱练耳一本通
  14. 什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试?
  15. delphi计算机语言排名,2020年3月TIOBE编程语言排行榜 Java继续蝉联榜首
  16. 月薪过万的前端工程师的自我修养
  17. linux安装mysql deb_Ubuntu下通过deb的bundle文件安装MySQL
  18. uniapp js 金额与星星**符号互转
  19. 基于STM32F4的CANOpen移植教程(超级详细)
  20. 我就喜欢那种认认真真和我吵架的

热门文章

  1. 个人永久性免费-Excel催化剂功能第86波-人工智能之图像OCR文本识别全覆盖
  2. 女生到底还做java还是前端_女孩子想转行的话学前端好还是java,哪个更有发展?...
  3. HTML和CSS (前端)
  4. RMAN Encrypted Backups
  5. 压力测试和系统优化tips
  6. java 系统 类_Java常用实体类--System类
  7. 淘宝直播接口分析!!! 测试!
  8. [强网杯 2019]随便注 1
  9. 【矩阵论】矩阵的相似标准型(3)
  10. 24c512 c语言程序,24C32~24C512的51单片机读写程序