在开始之前,我想说我是在第一次学习python 5个小时之后才编写这个程序的,所以我对这种编程语言完全陌生。
这个程序试图创建4X4板表示它与0无处不在。现在,为了部署宝藏,它随机选择了9个位置,并在板上用“@”表示。然后试图发现附近的宝藏在空旷的土地和计数,然后显示在这些空旷的土地上。就像扫雷游戏。
由于我对这个python语言很陌生,所以我想知道我需要做哪些更改,以便使它看起来像Python程序,以及我还能做些什么来使它更好地工作。
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))发布于 2016-03-28 18:20:40
Python指南PEP 8有一些好的地方要说。我发现其中很少有我不赞成的东西。当然,有一些我不同意,但在大多数情况下,如果您遵循它的指导原则,代码就会更容易理解。
这两条规则来自PEP 8,您没有遵循:
始终将这些二进制运算符包围在任意一方:赋值(
=)、增广赋值(+=、-=等)、比较(==、<、>、!=、<>、<=、>=、in、not in、is、is not、Booleans (and、or、not)。
和
每个缩进级别使用4个空格。
在while treasure:循环中,您只在一个地方中断了最后一个位置。这可能只是一个错误,但即使是打字有时会破坏你的程序。
使用first = a-1并不是针对PEP 8,但我认为使用first = a - 1更好。
您有许多名称几乎或完全没有意义的变量。例如,r = randint(0, len(board)-1)。如果我向下看几行,我就会发现r是row的意思;但是把它命名为row有什么问题呢?每一行代码都应该是半可读的,没有任何其他行作为上下文。您只使用字母表中大约一半的字母作为变量名,但只有大约五个名称实际上是描述性的。您使用first、second、third和fourth;但它们到底是什么?他们可能是row_start,row_end,column_start和column_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的简单方法是使用列表理解:
board = [["0"] * 4 for _ in range(4)]R= randint(0,len(板)-1)
random模块中还有一个更接近您所需的函数:randrange()。当然,您需要将from random import randint更改为from random import randrange,但代码如下:
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()缩短代码:
first = max([a - 1, 0])
second = max([b - 1, 0])
third = min([a + 1, 4])
fourth = min([b + 1, 4])但是为什么要使用4呢?它有什么特别之处?这是另一个硬编码值吗?
总之,你们只学习了五个小时就做得很好。我还没在StackOverflow上见过你,所以你似乎很擅长研究你需要的东西。我相信你的主要问题是你太专注于手头的项目。您没有使更改有关程序的小细节变得容易,也没有使其他人容易理解您的代码。PEP 8提到,代码的读取频率比编写的要高得多。如果你五年后回来,你能向别人解释这个计划吗?
https://codereview.stackexchange.com/questions/124091
复制相似问题