首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >钓鱼模拟器

钓鱼模拟器
EN

Code Review用户
提问于 2019-04-12 23:30:33
回答 4查看 6.1K关注 0票数 28

我是Python新手,为了一个学校的项目,我创建了一个“钓鱼模拟器”。基本上,这是一种随机的使用。我知道我的代码最终是重复的,但我不知道如何简化它。

代码语言:javascript
复制
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
    fishing == False
while fishing == True:    
    time.sleep(1)
    answer = input("Throw out your line, or go home?")
    if answer == "go home":
        fishing = False
        er = float(e / (a + b + c + d))
        print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print("Thanks for playing " + name + "!")
        print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")
    else:
        t = random.randrange(1, 7)
        if t == 1:
            a += 1
            print("You caught a cod!")
        elif t == 2:
            b += 1
            print("You caught a salmon!")
        elif t == 3:
            c += 1
            print("You caught a shark!")
        elif t == 4:
            d += 1
            print("You caught a wildfish!")
        elif t >= 5:
            e += 1
            print("You caught nothing!")
EN

回答 4

Code Review用户

回答已采纳

发布于 2019-04-13 01:01:17

欢迎来到CodeReview。养成良好的编码习惯永远不会太早,而回顾您的代码是最好的方法。

首先,祝贺您编写了一个干净、直观的程序。虽然您确实有一些问题(下面),但它们不是主要问题,您的程序似乎适合它的级别。

现在,就问题而言;)

使用空格

Python要求您使用水平空格。但是,您还应该使用垂直空格(也称为“空白行”)将代码的不同部分组织成段落。

这个巨大的街区:

代码语言:javascript
复制
import time
import random
fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)
name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")
if answer.lower() == "no":
    fishing == False
while fishing == True:  

如果它像这样被拆开的话,会读得更好:

代码语言:javascript
复制
import time
import random

fishing = True
a = b = c = d = e = 0 #define multiple variables as same thing

print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to Lake Tocowaga")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
time.sleep(1)

name = input("What is your name fisherman?")
answer = input("Would you like to go fishing, " + name + "?")

if answer.lower() == "no":
    fishing == False

while fishing == True:    

我所做的只是添加了几行空白行,但我试图表明,“这些事情一起进行”和“这些事情是顺序的,但没有关系”。

使用有意义的名称:

这其中哪一个是鲨鱼?

代码语言:javascript
复制
a = b = c = d = e = 0

我没有头绪。但如果你给它们取了合适的名字:

代码语言:javascript
复制
cod = shark = wildfish = salmon = nothing = 0

我肯定会知道!

使用命名常量

这一行出现了三次:

代码语言:javascript
复制
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

除非您正在复制/粘贴,否则很可能很难得到正确数量的倾斜字符。如果你这么做,可能会很痛苦。相反,为倾斜体创建一个名称。按照惯例,常量用大写拼写。(它实际上不是一个常量,但是由于常量是用大写拼写的,所以如果用大写命名它,就会知道不要修改它。)

代码语言:javascript
复制
H_LINE = "~" * 32

print(H_LINE)
print("Welcome to Lake Tocowaga")
print(H_LINE)

把最后的东西放在最后,

所有的东西都有个地方。一切都应该在它的位置上。打印摘要的地方将在底部。

您对while fishing:循环有一个很好的想法。但是,不要在响应用户输入时立即打印摘要,只需更改变量并让循环失败,然后将摘要打印在底部。它更“自然”(它使你的循环更容易阅读!)

代码语言:javascript
复制
while fishing == True:    
    time.sleep(1)
    answer = input("Throw out your line, or go home?")
    if answer == "go home":
        fishing = False
        er = float(e / (a + b + c + d))
        print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        print("Thanks for playing " + name + "!")
        print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")
    else:
        ...

变成:

代码语言:javascript
复制
while fishing == True:    
    time.sleep(1)
    answer = input("Throw out your line, or go home?")
    if answer == "go home":
        fishing = False
    else:
        ...

er = float(e / (a + b + c + d))
print(H_LINE)
print("Thanks for playing " + name + "!")
print("You caught:", str(a), "cod, ", str(b), "salmon, ", str(c), "shark, ", str(d), "wildfish. \nEfficiency Rate: ", str(er), ".")

让内置函数完成他们的工作,

您正在调用不需要调用的函数。整数之间“真”除法的结果是浮点数。你不需要打电话给float(e / (a + b + c + d))。如果你真的需要这么做的话,那就太迟了!

同样,print知道如何处理整数和浮点数。当你可以做的时候,你不需要print(..., str(a), ...)print(..., a, ...)

票数 36
EN

Code Review用户

发布于 2019-04-13 00:47:48

一些简单的事情。

代码语言:javascript
复制
a = b = c = d = e = 0

这有几个原因是不好的:

  • 这些都是无法描述的,过于简单的名字。仅仅通过观察它们就无法知道它们代表了什么。
  • 你把他们的声明/定义都推到了一行上。这通常被认为是糟糕的做法。假设我在寻找定义c的位置。当我能够确定我正在寻找确切的c = ...时,找到它要容易得多。但是,当它被宣布为一条线的一半时,很难找到它。

在这两种情况下,您都是为了简洁而牺牲可读性。除非你是在打高尔夫球,否则不要这么做。可读性几乎优先于其他一切。

fishing = True是您文件中的第三行,但是您要到以后才会使用它。除非它是常量,否则最好在第一次使用变量的地方声明变量。当有人正在阅读您的代码并希望看到fishing的定义时,如果他们只需要查找一两行而不需要滚动到文件的顶部,它就会更高效。

while fishing == True:可以简单地编写为while fishing:

你真的有个窃听器。fishing == False应该是fishing = False

只需检查第一个字母,if answer.lower() == "no":就可以写得更“宽容”(但不太准确):

代码语言:javascript
复制
if answer.lower().startswith("n"):

现在,像"nope“这样的输入也会起作用。不过,不管你是否想要这种行为,都是另一回事。如果你有其他的答案,要求"n“作为第一个字母,显然这会破坏事物。

票数 25
EN

Code Review用户

发布于 2019-04-13 08:48:40

这是使用字典的另一种改进。目前,您的所有数据都是硬编码的,并且分布在代码中的某个地方。如果您想要添加另一个fish,您必须添加一个变量f,扩展random.randint (这样就不会减少什么机会),最后将它添加到if条件和打印中。

多加一条鱼,这是一项很大的工作。相反,我建议使用一本字典,列出可能的捕鱼结果及其被捕获的机会。然后,您可以将它与random.choices一起使用,它接受一个详细说明概率的weights参数。

代码语言:javascript
复制
pond = {'cod': 1, 'salmon': 1, 'shark': 1, 'wildfish': 1, 'nothing': 2}

概率在这里是相对的,random.choices为你规范了它们。所有的鱼都有相同的概率,而得到任何东西的概率都是任何一条鱼的两倍。

您的循环也根本不需要fishing变量,只需要在用户钓鱼时使用break变量。

每当您需要计算某件事时,使用collections.Counter可能是个好主意。它基本上像字典一样工作,并且有一个很好的特性,它假设所有元素都有一个计数为零。

在Python3.6中,引入了一种格式化字符串的新方法,即f-string

代码语言:javascript
复制
from collections import Counter
from random import choices
from time import sleep

POND = {'cod': 1, 'salmon': 1, 'shark': 1, 'wildfish': 1, 'nothing': 2}

name = input("What is your name fisherman? ")

caught = Counter()
while True:
    keep_fishing = input("Throw out your line, or go home? ")
    if keep_fishing == "go home":
        break
    sleep(1)
    result = choices(list(POND), weights=POND.values(), k=1)[0]
    print(f"You caught: {result}")
    caught[result] += 1

print(f"\nThanks for playing, {name}!")
print("You caught:")
for fish, n in caught.most_common():
    if fish != "nothing":
        print(n, fish)
票数 11
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/217357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档