我是愚谷ノ園みら,简称愚園みら,本账号的使用者之一的负责分享学习笔记的oc,呃话说oc真的应该干涉现实事务吗?总之,みら最近开始学习CS61A。打算记一点笔记激励自己学下去。
啊,忘了说的CS61A是一门……课?总之是UC Berkeley的CS入门课。嘛反正点开这篇文章的人应该不需要我来介绍CS61A是什么了(大概……)
以下部分都是基于已经装完环境,下载了相关课件,并且会使用ok进行评分的假设。
我也是初学者,请多包涵~如有错误,敬请斧正!
CS61A的第一个project是要制作一个叫hog的小游戏。以下是一些关于这个project的一些碎碎念,希望能帮到有需要的同学们。
详情请参考:https://cs61a.org/proj/hog/
这是Hog项目的主要网站(作业要求),本文之后的内容将会围绕这里的题目。
以及课程课本的翻译件:https://composingprograms.netlify.app/
非常好课本,使我的理解加深十倍甚至九倍。
两名玩家开局都是0分。
最早在回合结束时得到目标分(100分)的玩家胜利。
在每回合,每个玩家选择投掷0~10个骰子,若该回合所有骰子的点数均不为1,则玩家的得分为该回合所有骰子的点数之和。
Sow Sad规则:若该玩家任意一个骰子掷到1点,则该回合只能增加一点得分。
以上是一般情况下Hog的规则。
追加规则:
Boar Brawl:如果玩家选择投掷0个骰子,则获得对手分数的十位数与自己分数的个位数之差的绝对值的三倍。若这个数为0,则获得1分。
举例:对手为46分,己方为21分时,获得3*abs(4-1)=9分;对手为52分,己方为45分时,3*abs(5-5)=0,获得1分。
Sus Fuss:如果结算时,玩家的分数有3或4个因数(包括自身与1),则分数自动增长到下一个质数。
举例:结算时玩家有21分,因为21有1,3,7,21四个因数,分数自动变为23。
或许每一年的作业要求和追加规则都会有所不同?至少今年的是这样的。
根据课程要求的说法,我们只需要修改hog.py的内容即可。
第0题考查的是我们对老师给的代码的理解。
实际上官网上的作业要求并没有给出这么多的代码,但总之先贴上去了,以免读者们忘记/懒得下载课件。
使用OK之后会跳出来两道问答题。
OK的使用方式:
进入hog目录下后,在Terminal中输入:
首先运行这段代码初始化一个骰子。
然后连续运行四次test_dice()会出现什么返回值呢?
答案是4,1,2,4。
不需要理解make_test_dice(...)这个函数到底写的是什么,只需要看懂注释(使用例)即可。
重读之后,我个人对这段代码的理解如下:
输入:一个列表,代表的是骰子的点数值,第几次就会投出列表的第几位。投掷次数超过列表长度时重复。
输出:骰子点数。
因而首先要保证:列表长度大于0,且列表的所有元素必须都是正整数。
接下来,我们需要一个变量来控制这次投掷选择列表中的第几个整数,也就是这里的index。
在这里,作者将index设定为len(outcomes) - 1。这和后面的代码是呼应的。
def dice():部分则是定义了一个新的函数dice()。它是一个非纯函数,改变index这个变量的数值。
具体来说,每次执行dice()会使index变为(index + 1) % len(outcomes)。算是某种意义上的增加,但当它大于等于输入列表的长度时,又会归零。非常巧妙的是,配上最初的len(outcomes) - 1,第一次执行dice()的时候正好是从0开始。
最后的返回值是outcome[index]。
做这道题的时候,根据教材,实际上我们还没有学到列表!其实没必要现在就搞懂这些代码的含义。
Q: Which of the following is the correct way to "roll" a fair, six-sided die?
Choose the number of the correct choice:
0) six_sided(1)
1) make_test_dice(6)
2) six_sided
3) six_sided()
4) six_sided(6)
5) make_fair_dice(6)
为了应付这道题,我们需要看看代码注释以及代码本身!
首先是,理解题目的要求:
执行哪一句命令,等同于掷骰子(即,生成1~6的随机数)?
然后需要理清这些选项的类型。
six_sided是个函数。具体来说,它是执行了make_test_dice(6)的结果。后者的输出是return dice。
这里的dice是make_test_dice(...)的内部函数。因此,调用six_sided就相当于调用这个make_test_dice(...)里面的dice。
所以说,不能直接在python里输入`six_sided`。它是个函数,而不是变量,需要调用!
直接输入会产生结果:
就是说这是个函数,它是在dice这个文件下的make_fair_dice这个函数下的本地子函数dice()
选项2错误!
但是这里的`six_sided()`的括号里是否应该有东西呢?答案是否定的。dice.py的代码中,dice是没有参数的。
选项0,选项4错误!
运行six_sided(1)会产生错误:
这也可以看出,six_sided()本质是套皮dice()。
由此,我们可以看出,选项3 six_sided() 已经是正确答案了。
选项3正确!
但是本着学习的精神,还是看看其他几个的问题出在哪里罢。
仔细阅读make_test_dice(6)和make_fair_dice(6),可知,它们的输出值都是函数。
或者根据定义,其实make_fair_dice(6) == six_sided
所以正确使用它的方式是:make_fair_dice(6)()
至于make_test_dice(6),使用它的方式是make_test_dice(6)(),但由上一题可知,这家伙只会一直输出6,不符合我们的要求。
综上所述,只有第三个是对的。
如果您使用的Hog课件和我年份不同,那么这里的题目可能有所不同,仅供参考~
话说B站怎么不能把代码inline显示呢。