第一步,模拟动作。可以用sample函数随机生成三个符号,就像你在项目1中随机“掷”骰子一样。下面的函数能够从老虎机的常用符号中随机选择三个符号。这些常用符号包括:钻
第一步,模拟动作。可以用sample函数随机生成三个符号,就像你在项目1中随机“掷”骰子一样。下面的函数能够从老虎机的常用符号中随机选择三个符号。这些常用符号包括:钻石(DD)、七(7)、三条杠(BBB)、两条杠(BB)、一条杠(B)、樱桃©和零(0)。符号的选择完全是随机的,但是每个符号出现的概率各不相同。
get_symbols<-function()wheel<-c("DD",“7","BBB","BB",“B",“C","0")sample(wheel,size&#61;3,replace&#61;TRUE, prob&#61;c(0.03,.03,0.06,0.1,0.25,0.01,0.52))
可以使用get_symbols随机生成老虎机中的三个符号。
每玩一次老虎机游戏需要花费一美元.转出的符号组合决定了玩家所能获得的中奖金额。钻石符号(DD)是可以百搭的,并且能够将最终的金额加倍。*表示任意符号
如果不能满足以下三种情形中的任意一种,玩家将一无所获。
(1)三个符号完全相同(但不能是符号零)。
(2)三个带杠的符号(任意组合)。
(3)一个或多个樱桃。
PS:(百搭牌(DD)的使用有一个例外:除非组合中已经有了一个樱桃,否则钻石不能被当作樱桃。
只要中奖组合中出现了钻石,奖金都会翻倍。
策略
1.有序步骤
生成符号组合→显示符号组合→根据符号组合计算中奖金额
play<-function(){symbols<-get_symbols()print(symbols)score(symbols)}
2.同类情况
if语句
同其他高级语言的语法规则
(1) 下面的函数会返回什么结果?
x <-1if(3&#61;3){x<-2}x
答案:这段代码的返回值是2。
(2)
x <-1if(TRUE){x<-2}x}
练习 &#xff1a;
x<-1if(x&#61;&#61;1){x<-2
if(x&#61;&#61;1){x<-3}}x
答案:这段代码的返回值是2。
else语句
同其他高级语言的语法规则
比如&#xff1a; a <- 3.14
然后用trunc函数将小数部分提取出来。
dec<-a-trunc(a)dec
##0.14trunc函数接受一个数值作为它的输入,并返回该数值小数点左边的部分(也就是该数值的整数部分)。
if(prize<-查找对应的中奖金额}else if(prize<-} else{prize<-}
已经有了完成第一个子任务的代码,可以把它放进老虎机程序的代码中
same<-symbols[1]&#61;&#61;symbols[2]&&symbols[2]&#61;&#61;symbols[3]
bars<-symbols %in% c("B","BB","BBB"))
if(same){prize<-
} else if(prize<-
}else{prize<-
}
if(same){symbol<-symbols[1]if(symbol&#61;"DD"){ prize<-800}else if(symbol&#61;"7"){prize<-80}else if(symbol&#61;&#61;"BBB"){prize<-40}else if(symbol&#61;"BB"){prize<-25}
else if(symbol&#61;&#61;"B"){prize<-10}else if(symbol&#61;&#61;“C"){prize<-10else if(symbol&#61;&#61;"0"){prize<-0 } }
查找表
创建一个向量&#xff0c;将符号存储为名称,将中奖金额存储为元素值,并且将名称和相应的元素值一一对应起来。
payouts<-("DD"&#61;100,"7"&#61;80,"BBB"&#61;40,"BB"&#61;25,"B"&#61;10, "C"&#61;10, "0"&#61;0)payouts["DD"]
unname函数返回一个对象的副本,但是会将其名称属性移除。
cherries<-sum(symbols&#61;&#61;"C")prize<-c(0,2,5)[cherries&#43;1]
}diamonds<-sum(symbols&#61;"DD")prize*2^diamonds
查找表与树
要将if树转换为查找表,首先明确要赋的值,并将这些值存储在一个向量中;然后,提取出if树中的各个条件语句作为选值的依据。如果条件中使用了字符串,就给向量的各元素赋予名称,然后用基于名称的取子集方法得到对应的元素;如果条件中使用了整数数值,就使用基于整数的取子集方法。
代码注释&#xff08;整体代码&#xff09;
代码中用#加些注释。通过注释对某些代码段的功能进行解释,这样可以增加代码的可读性。
score <- function(symbols){same <- symbols[1] &#61;&#61; symbols[2] && symbols[2] &#61;&#61; symbols[3]bars <- symbols %in% c("B","BB","BBB")if (same){payouts <- c("DD" &#61; 100,"7" &#61; 80,"BBB" &#61; 40,"BB" &#61; 25,"B" &#61; 10, "C"&#61;10,"0" &#61; 0)prize <- unname(payouts[symbols[1]])}else if(all(bars)){prize <- 5}else{cherries <- sum(symbols &#61;&#61; "C")prize <- c(0,2,5)[cherries &#43; 1]}diamonds <- sum(symbols &#61;&#61; "DD")prize * 2^ diamonds
}
get_symbols <- function(){wheel <- c("DD","7","BBB","BB","B","C","0")sample(wheel, size &#61; 3,replace &#61;TRUE,prob &#61; c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))
}
play <- function(){symbols <- get_symbols()print(symbols)score(symbols)
}
play()
运行play()就可以实现”老虎机“.
小结
将任务分解为一些更简单的任务,如果有必要的话,把简单的任务再分解为更为简单的任务。如果可视化有用的话,可以用一个流程图将任务之间的关系表示出来。
然后对子任务实施各个击破。对每个子任务的解决方案都尝试用通俗的语言描述出来,然后再转换成R代码的形式。对于每一个子任务的代码,都要用实例进行测试。当每一个子任务都运行无误时,将所有子任务的代码整合成一个函数,以便分享和重复使用。
为了帮助完成这些工作,R提供了一些有用的工具。你可以用if和else语句处理不同的情形,也可以用R对象和取子集的方法创建一个查找表;可以用给代码添加注释,还可以用function函数将所写的程序包装成函数。