首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在4×4板中部署宝藏并在Python中找到它们

在4×4板中部署宝藏并在Python中找到它们
EN

Code Review用户
提问于 2016-03-28 14:22:58
回答 1查看 617关注 0票数 3

在开始之前,我想说我是在第一次学习python 5个小时之后才编写这个程序的,所以我对这种编程语言完全陌生。

这个程序试图创建4X4板表示它与0无处不在。现在,为了部署宝藏,它随机选择了9个位置,并在板上用“@”表示。然后试图发现附近的宝藏在空旷的土地和计数,然后显示在这些空旷的土地上。就像扫雷游戏。

由于我对这个python语言很陌生,所以我想知道我需要做哪些更改,以便使它看起来像Python程序,以及我还能做些什么来使它更好地工作。

代码语言:javascript
复制
from random import randint

print "Welcome to Treasure Hunt \n"

q="@"     #For checking the treasure
board = []  #Board

for x in range(0,4):
    board.append(["0"] * 4)   # It creates 4x4 Board with 0 everywhere

treasure = 9
while treasure:                # Randomly spread treasure
 r = randint(0, len(board)-1)
 c = randint(0, len(board[0])-1)
 if board[r][c] != "@":
        board[r][c]="@"
        treasure -= 1

print "-------------------------------"
print "\n Treasures are here "
print "\n-------------------------------\n"
for row in board:
    print "     ".join(row)                  # Give output of board
    print "\n"


def hunt(a,b):              #Hunt function searches for treasure around the given land
    first = a-1
    second = b-1
    third = a+1
    fourth = b+1
    if(first < 0):
        first = first + 1;
    if(second < 0):
        second = second + 1;
    if(third == 4):
        third = third - 1;
    if(fourth == 4):
        fourth = fourth -1;

    h=0
    for i in range(first,third + 1):
        for j in range(second,fourth + 1):
            if(q==board[i][j]):
                h=h+1;
                board[a][b] = h

for k in range(len(board)):
    for l in range(len(row)):
        if(q!=board[k][l]):
            hunt(k,l)

for row in board:
    print "   ".join(map(str,row))
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-03-28 18:20:40

造型

Python指南PEP 8有一些好的地方要说。我发现其中很少有我不赞成的东西。当然,有一些我不同意,但在大多数情况下,如果您遵循它的指导原则,代码就会更容易理解。

这两条规则来自PEP 8,您没有遵循:

始终将这些二进制运算符包围在任意一方:赋值(=)、增广赋值(+=-=等)、比较(==<>!=<><=>=innot inisis not、Booleans (andornot)。

每个缩进级别使用4个空格。

while treasure:循环中,您只在一个地方中断了最后一个位置。这可能只是一个错误,但即使是打字有时会破坏你的程序。

使用first = a-1并不是针对PEP 8,但我认为使用first = a - 1更好。

命名

您有许多名称几乎或完全没有意义的变量。例如,r = randint(0, len(board)-1)。如果我向下看几行,我就会发现rrow的意思;但是把它命名为row有什么问题呢?每一行代码都应该是半可读的,没有任何其他行作为上下文。您只使用字母表中大约一半的字母作为变量名,但只有大约五个名称实际上是描述性的。您使用firstsecondthirdfourth;但它们到底是什么?他们可能是row_startrow_endcolumn_startcolumn_end吗?

逻辑

我不确定;也许这应该放在Styling下面,但我认为您应该在print语句中使用括号。Python3将print作为函数,因此它们是必需的。它们在Python2中是允许的,所以我通常使用它们。比如说,如果您使用print("Your score was", 45),它有时会把您绊倒,因为它会打印('Your score was', 45)而不是Your score was 45。由于您在print调用中没有使用逗号分隔的值,所以一切都应该完全相同。您可能希望将from __future__ import print_function放在顶部,以便以后添加使用逗号分隔的值时,它仍然可以打印出来。

Q= "@“

你为什么要使用"@"?我猜您使用它是因为"@"是默认的空格填充。您在许多地方都使用"@",那么如果您决定使用"%"来代替呢?这需要很多修改。你现在拥有的东西叫做hard-coded values。相反,在文件开头定义一个常量来定义它是哪个字符,并使用该常量而不是显式地表示"@"

对于x的范围(0,4):board.append(“0” * 4)

默认情况下,range()0开始,因此您可以使用for x in range(4):。因为您没有使用x,所以标准名称是_。定义board的简单方法是使用列表理解

代码语言:javascript
复制
board = [["0"] * 4 for _ in range(4)]

R= randint(0,len(板)-1)

random模块中还有一个更接近您所需的函数:randrange()。当然,您需要将from random import randint更改为from random import randrange,但代码如下:

代码语言:javascript
复制
row = randrange(len(board))
column = randrange(len(board[row]))

第一=a-1秒= b-1第三= a+1第四= b+1 if(第一< 0):第一=第一+ 1;如果(第二< 0):第二=第二+ 1;如果(第三== 4):第三=第三-1;如果(第四== 4):第四=第四- 1;

首先,这些分号是多余的。还可以使用max()min()缩短代码:

代码语言:javascript
复制
first = max([a - 1, 0])
second = max([b - 1, 0])
third = min([a + 1, 4])
fourth = min([b + 1, 4])

但是为什么要使用4呢?它有什么特别之处?这是另一个硬编码值吗?

总之,你们只学习了五个小时就做得很好。我还没在StackOverflow上见过你,所以你似乎很擅长研究你需要的东西。我相信你的主要问题是你太专注于手头的项目。您没有使更改有关程序的小细节变得容易,也没有使其他人容易理解您的代码。PEP 8提到,代码的读取频率比编写的要高得多。如果你五年后回来,你能向别人解释这个计划吗?

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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