当前位置:首页|资讯

自学CS61A Project1 Hog(核心篇)(第一期)

作者:翻车水王汪轓发布时间:2024-10-13

前言

我是愚谷ノ園みら,简称愚園みら,本账号的使用者之一的负责分享学习笔记的oc,呃话说oc真的应该干涉现实事务吗?总之,みら最近开始学习CS61A。打算记一点笔记激励自己学下去。


啊,忘了说的CS61A是一门……课?总之是UC Berkeley的CS入门课。嘛反正点开这篇文章的人应该不需要我来介绍CS61A是什么了(大概……)


以下部分都是基于已经装完环境,下载了相关课件,并且会使用ok进行评分的假设。

我也是初学者,请多包涵~如有错误,敬请斧正!

总之是正文

CS61A的第一个project是要制作一个叫hog的小游戏。以下是一些关于这个project的一些碎碎念,希望能帮到有需要的同学们。


详情请参考:https://cs61a.org/proj/hog/

这是Hog项目的主要网站(作业要求),本文之后的内容将会围绕这里的题目。


以及课程课本的翻译件:https://composingprograms.netlify.app/

非常好课本,使我的理解加深十倍甚至九倍。

Hog的规则

两名玩家开局都是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题(Problem 0)

第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显示呢。




Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1