大家好,我去世了,我是Liang Tang。这篇文章在公共帐户中开始:
让我们继续谈论伯克利的CS61A。这次我在本课程中分享了第一个项目。尽管它是项目,但代码不大。难度不高,您需要了解Python的基本语法和基本的功能编程思想。如果您不熟悉功能编程,您可以回到历史记录中的上一篇文章。
整个项目的代码并不大,但是代码质量非常高,根据标准非常严格。它非常适合新手学习,这不仅可以加深理解,还可以提高代码质量和设计规格。
因为原始文档是英语的,所以对于某些朋友来说可能更困难。因此,我将其翻译成,有些地方添加了一些说明。想要查看完整代码+实施的学生可以单击以访问我的Github仓库。
项目原始文档
github
我们需要实现Mini -game Hog的核心代码。猪是两名球员轮流掷骰子的比赛。玩家可以选择每次掷出0到10个骰子。不同的策略可以获得不同的观点。赢得100分的球员。
计算以下规则:
已经设置了整个项目的框架,我们只需要根据需要实施一些特定的功能。
最后,当我们实施所有功能和策略时,我们可以与指定的策略竞争以计算获胜率。整个项目中有11个问题的三个阶段,可以理解,总共需要实施11个功能。
每个阶段完成后,将会有一个分阶段的结果。这并不困难,但是非常有趣。建议练习刚开始的学生。
第1阶段主要实现游戏功能的主体。完成后,我们可以通过该项目提供的GUI进行双重比赛。
实现函数,该函数具有两个参数,第一个参数是整数,指示抛出的数量。第二个参数是指示骰子类型的函数。返回第二个函数后,获得了点。当猪排出1分时,它将是骰子点的总和。
即使猪出现在中间,也必须滚动以获取骰子点的呼叫功能。
我们只需要使用该周期重复次级次级,然后判断其中是否有1个。
实现功能并返回升高0骰子时获得的积分。输入是对手玩家的分数,可以假定分数必须小于100。如果分数小于10为0。
计算分数的十个和个人,在有所作为后,找到绝对值,加2。
在本轮比赛中实现功能,给出并返回球员的得分。
您需要首先实现该功能,并且必须调用您实现的功能并函数。
根据判断是滚动还是执行。只要您理解问题的含义,也没有困难。
实现功能,当前玩家的分数是否会触发交换
考虑0到0的情况,分数为0时不应触发。
确定两个人的得分是否是倍数:
实施功能,它会模拟整个游戏。玩家轮流使用他们的指定策略,每次执行他们的行动。订单,播放器0是第一个,播放器1稍后。
暗示:
它可以根据标题的含义来实现,这基本上很困难。
第2阶段主要实现某些评论功能,这些功能可以在某些关键节点上向玩家打印出日志。
与此相似,球员1打破了纪录并获得22分。
老师举了一个评论功能的示例:
请注意,此函数最终返回自身,每轮呼叫都是相同的功能。
这是使用功能编程返回领先参与者的一个示例:
在开发之前,您需要了解以下功能:
它接收两个评论函数并返回一个新的评论函数。此返回功能中的两个参数是通话和之后的结果。
该涉及功能编程巢穴的段落将有点围绕,最好按照此示例理解:
功能的更新使评论功能调用每个回合的结束。调用注释功能后,将返回下一轮的新评论功能。
例如,当调用第一轮时,它将返回另一个评论功能,并且需要在第二轮中调用此功能。也就是说,在上一轮中返回了调用每个回合的注释函数。
了解该功能后,我们只需要将方法添加到要调用的函数中。
由于该函数是高级别函数,因此它将在运行后返回功能。请注意,实现并不难。
实现功能,它是一个高级函数,返回注释函数。此注释功能将在指定播放器中获得新的最大分数打印日志。要实现此目标,它必须计算当前分数并将其与最高分数进行比较该功能的第一个参数指定需要跟踪记录的玩家,并且可以忽略其他玩家的得分。
应该注意的是,当打印得分时,您需要注意单个复杂性。当分数大于1时,只使用1分,并使用它。
这个问题有点困难,并在评论中更加关注测试样本。
主要想法是在其中实现一个函数。我的功能名称在此处称为。然后使用这两个函数的互连来实现函数。
如果您不想理解公共课程的视频,那么老师专门研究这个问题。
在第三阶段,您需要实现一些游戏策略并设计一些简单的AI。
实现功能,它是一个高阶函数。接收参数是一个函数。该函数返回接收相同参数的函数。此返回的参数和差异,它返回调用该函数后结果的平均值。
说到一些口,请稍加解释,也就是说,我们要实现一个高级别的函数,它返回函数,我们调用返回的函数。函数接收到的参数与相同值相同调用函数调用后。
这里最大的问题是我们不知道将收到哪些参数,我们如何确定接收参数格式?
在这里,我们需要使用一个小技巧。在Python通过过程中,当我们不知道引入的参数数量时,我们可以编写几个连续的强制性参数。此处是显示列表的列表。实际上,任何名称在符号后面可用,这意味着一个列表名称。
作业中提供了一个示例:
在此示例中,该函数接收到的参数是它可以接收几个参数。在该函数中,我们调用了该函数并将其再次传递给它。这样,实际上,该函数的接收器参数实际上传递给了。
在这个问题中,我们还需要使用类似的方法来实施:
实施功能,该功能接收两个参数,指示骰子的类型,表明实验数量。返回实验后,收入最大的骰子数量为。
您需要调用您刚刚完成的功能。返回结果在1到10之间(包括1和10)。当两个情况的分数相同时,骰子数量很小。例如,得分3个骰子和6个骰子是相同的,然后返回3。
只要开发,基本上就没有困难。获得所有骰子的可能性,并选择最大的收入(收入预期)。
实施功能,该策略将在投掷最佳收入时尽可能多地掷出0个骰子。
特定逻辑是:当滚动0骰子的收入大于等价参数时,滚动0骰子,否则固定。
为了实现策略,该策略将尽可能多地使用猪互换规则。投掷0时,将触发猪交换和抛出0时,在获得很多好处时,收入等于参数余量,并且不会当不会触发猪交换时,要抛出0。否则,投掷。
添加问题,让您的个人才能结合上述策略以实现最终策略,并在始终提供的AI竞赛中获得更高的获胜率。
这个问题没有标准的答案,每个人都可以自由播放。根据提示提供了实施的版本:
即使开发了整个项目,我们也可以称呼教师提供的工具,并计算出4种骰子策略的策略的获胜率。
目前,我只能根据规则获得大约60%的获胜率。后来我使用了增强学习培训模型,但是在最好的情况下,我只获得了61%的获胜率,这略高于策略 - 基于策略。您可能希望尝试看看您是否有更好的策略。
我们还可以称呼Ready -MADE GUI界面来反对我们的发展策略:
尽管这个游戏看起来很简单,但在老师的思考中仍然非常满意,可以稍微实现代码,并且梯度的难度也做得很好。尽管项目本身并不小,但并不难。
此外,游戏本身也值得我们深度。由于养猪规则的存在,收入有巨大的波动。有更多的掷骰子,很容易影响收入。投资较少,收益较少。在这种情况下,很难设计一个强大的AI.非常非常非常建议您亲自尝试每个人。