Reddit用户建议我在此站点上审查我的代码。

完整代码在GitHub上。

# Monopoly Simulator
# http://img.thesun.co.uk/aidemitlum/archive/01771/Monopoly2_1771742a.jpg

from random import randint

piece = 0
jail = 0
iteration = 0

brown1 = 0
brown2 = 0

light_blue1 = 0
light_blue2 = 0
light_blue3 = 0

pink1 = 0
pink2 = 0
pink3 = 0

orange1 = 0
orange2 = 0
orange3 = 0

red1 = 0
red2 = 0
red3 = 0

yellow1 = 0
yellow2 = 0
yellow3 = 0

green1 = 0
green2 = 0
green3 = 0

dark_blue1 = 0
dark_blue2 = 0

num = input("How many rolls do you want to simulate? ")

for h in range(0, num):
    piece += randint(2, 12)

    if piece > 40:
        piece -= 40
        iteration += 1
        #print("Around the board %d times so far" %(iteration)) ### Optional

    #print(piece) ### Optional

    #Jail
    if piece == 30:
        piece = 10
        jail += 1
        #print("JAIL") ### Optional

    #Brown
    if piece == 1:
        brown1 += 1
    if piece == 3:
        brown2 += 1

    #Light Blue
    if piece == 6:
        light_blue1 += 1
    if piece == 8:
        light_blue2 += 1
    if piece == 9:
        light_blue3 += 1

    #Pink
    if piece == 11:
        pink1 += 1
    if piece == 13:
        pink2 += 1
    if piece == 14:
        pink3 += 1

    #Orange
    if piece == 16:
        orange1 += 1
    if piece == 18:
        orange2 += 1
    if piece == 19:
        orange3 += 1

    #Red
    if piece == 21:
        red1 += 1
    if piece == 23:
        red2 += 1
    if piece == 24:
        red3 += 1

    #Yellow
    if piece == 26:
        yellow1 += 1
    if piece == 27:
        yellow2 += 1
    if piece == 29:
        yellow3 += 1

    #Green
    if piece == 31:
        green1 += 1
    if piece == 32:
        green2 += 1
    if piece == 34:
        green3 += 1

    #Dark Blue
    if piece == 37:
        dark_blue1 += 1
    if piece == 39:
        dark_blue2 += 1

brown = brown1 + brown2
light_blue = light_blue1 + light_blue2 + light_blue3
pink = pink1 + pink2 + pink3
orange = orange1 + orange2 + orange3
red = red1 + red2 + red3
yellow = yellow1 + yellow2 + yellow3
green = green1 + green2 + green3
dark_blue = dark_blue1 + dark_blue2

#Prints all the Statistics

print("\n\n")
print("Brown = %d" %(brown))
print("Light Blue = %d" %(light_blue))
print("Pink = %d" %(pink))
print("Orange = %d" %(orange))
print("Red = %d" %(red))
print("Yellow = %d" %(yellow))
print("Green = %d" %(green))
print("Dark Blue = %d" %(dark_blue))
print("\n")

print("Brown 1 = %d" %(brown1))
print("Brown 2 = %d" %(brown2))
print("\n")
print("Light Blue 1 = %d" %(light_blue1))
print("Light Blue 2 = %d" %(light_blue2))
print("Light Blue 3 = %d" %(light_blue3))
print("\n")
print("Pink 1 = %d" %(pink1))
print("Pink 2 = %d" %(pink2))
print("Pink 3 = %d" %(pink3))
print("\n")
print("Orange 1 = %d" %(orange1))
print("Orange 2 = %d" %(orange2))
print("Orange 3 = %d" %(orange3))
print("\n")
print("Red 1 = %d" %(red1))
print("Red 2 = %d" %(red2))
print("Red 3 = %d" %(red3))
print("\n")
print("Yellow 1 = %d" %(yellow1))
print("Yellow 2 = %d" %(yellow2))
print("Yellow 3 = %d" %(yellow3))
print("\n")
print("Green 1 = %d" %(green1))
print("Green 2 = %d" %(green2))
print("Green 3 = %d" %(green3))
print("\n")
print("Dark Blue 1 = %d" %(dark_blue1))
print("Dark Blue 2 = %d" %(dark_blue2))
print("\n")
print("You've been jailed %d times" %(jail))



#The Board

#Calculating highest number of digits (for board formatting)

places = [brown1, brown2, light_blue1, light_blue2, light_blue3, pink1, pink2, pink3,
        orange1, orange2, orange3, red1, red2, red3, yellow1, yellow2, yellow3,
        green1, green2, green3, dark_blue1, dark_blue2]

digit = 0
temp = 0

for place in places:
    while place / 10 >= 1:
        place /= 10
        temp += 1
    temp += 1
    if temp > digit:
        digit = temp
    temp = 0

#Creating Blanks & Spaces

blank = "-"
space = " "

for i in range(0, digit - 1):
    blank += "-"
    space += " "

#Formatting all the places, so that they have "temp" digits

formatted = []

placelen = 0

for place in places:
    holder = place
    form = 0

    while holder / 10 >= 1:
        holder /= 10
        placelen += 1
    placelen += 1

    if placelen != digit:
        form = format(place, "0%d" %(digit))
    else:
        form = str(place)

    placelen = 0

    formatted.append(form)


brown1 = formatted[0]
brown2 = formatted[1]

light_blue1 = formatted[2]
light_blue2 = formatted[3]
light_blue3 = formatted[4]

pink1 = formatted[5]
pink2 = formatted[6]
pink3 = formatted[7]

orange1 = formatted[8]
orange2 = formatted[9]
orange3 = formatted[10]

red1 = formatted[11]
red2 = formatted[12]
red3 = formatted[13]

yellow1 = formatted[14]
yellow2 = formatted[15]
yellow3 = formatted[16]

green1 = formatted[17]
green2 = formatted[18]
green3 = formatted[19]

dark_blue1 = formatted[20]
dark_blue2 = formatted[21]

#Making the Board

board = [
    [blank, red1, blank, red2, red3, blank, yellow1, yellow2, blank, yellow3, blank],
    [orange1, space, space, space, space, space, space, space, space, space, green1],
    [orange2, space, space, space, space, space, space, space, space, space, green2],
    [blank, space, space, space, space, space, space, space, space, space, blank],
    [orange3, space, space, space, space, space, space, space, space, space, green3],
    [blank, space, space, space, space, space, space, space, space, space, blank],
    [pink3, space, space, space, space, space, space, space, space, space, blank],
    [pink2, space, space, space, space, space, space, space, space, space, dark_blue1],
    [blank, space, space, space, space, space, space, space, space, space, blank],
    [pink1, space, space, space, space, space, space, space, space, space, dark_blue2],
    [blank, light_blue1, light_blue2, blank, light_blue3, blank, blank, brown2, blank, brown1, "GO"]
    ]

#Drawing the Board

print("\n")

print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[0][0], 
                                                                                board[0][1],
                                                                                board[0][2],
                                                                                board[0][3],
                                                                                board[0][4],
                                                                                board[0][5],
                                                                                board[0][6],
                                                                                board[0][7],
                                                                                board[0][8],
                                                                                board[0][9],
                                                                                board[0][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[1][0], 
                                                                                board[1][1],
                                                                                board[1][2],
                                                                                board[1][3],
                                                                                board[1][4],
                                                                                board[1][5],
                                                                                board[1][6],
                                                                                board[1][7],
                                                                                board[1][8],
                                                                                board[1][9],
                                                                                board[1][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[2][0], 
                                                                                board[2][1],
                                                                                board[2][2],
                                                                                board[2][3],
                                                                                board[2][4],
                                                                                board[2][5],
                                                                                board[2][6],
                                                                                board[2][7],
                                                                                board[2][8],
                                                                                board[2][9],
                                                                                board[2][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[3][0], 
                                                                                board[3][1],
                                                                                board[3][2],
                                                                                board[3][3],
                                                                                board[3][4],
                                                                                board[3][5],
                                                                                board[3][6],
                                                                                board[3][7],
                                                                                board[3][8],
                                                                                board[3][9],
                                                                                board[3][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[4][0], 
                                                                                board[4][1],
                                                                                board[4][2],
                                                                                board[4][3],
                                                                                board[4][4],
                                                                                board[4][5],
                                                                                board[4][6],
                                                                                board[4][7],
                                                                                board[4][8],
                                                                                board[4][9],
                                                                                board[4][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[5][0], 
                                                                                board[5][1],
                                                                                board[5][2],
                                                                                board[5][3],
                                                                                board[5][4],
                                                                                board[5][5],
                                                                                board[5][6],
                                                                                board[5][7],
                                                                                board[5][8],
                                                                                board[5][9],
                                                                                board[5][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[6][0], 
                                                                                board[6][1],
                                                                                board[6][2],
                                                                                board[6][3],
                                                                                board[6][4],
                                                                                board[6][5],
                                                                                board[6][6],
                                                                                board[6][7],
                                                                                board[6][8],
                                                                                board[6][9],
                                                                                board[6][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[7][0], 
                                                                                board[7][1],
                                                                                board[7][2],
                                                                                board[7][3],
                                                                                board[7][4],
                                                                                board[7][5],
                                                                                board[7][6],
                                                                                board[7][7],
                                                                                board[7][8],
                                                                                board[7][9],
                                                                                board[7][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[8][0], 
                                                                                board[8][1],
                                                                                board[8][2],
                                                                                board[8][3],
                                                                                board[8][4],
                                                                                board[8][5],
                                                                                board[8][6],
                                                                                board[8][7],
                                                                                board[8][8],
                                                                                board[8][9],
                                                                                board[8][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[9][0], 
                                                                                board[9][1],
                                                                                board[9][2],
                                                                                board[9][3],
                                                                                board[9][4],
                                                                                board[9][5],
                                                                                board[9][6],
                                                                                board[9][7],
                                                                                board[9][8],
                                                                                board[9][9],
                                                                                board[9][10]
                                                                                ))
print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(board[10][0], 
                                                                                board[10][1],
                                                                                board[10][2],
                                                                                board[10][3],
                                                                                board[10][4],
                                                                                board[10][5],
                                                                                board[10][6],
                                                                                board[10][7],
                                                                                board[10][8],
                                                                                board[10][9],
                                                                                board[10][10]
                                                                                ))


我到目前为止,我仅进行了大约一个月的编程,所以我知道有很多方法可以改进和优化我的代码。只是浏览一下,我似乎正在重复一些代码,因此使用函数将它们抽象化是可能的。在我的Github页面上,我对其进行了更改,以便我进行两次randint(2, 12)并将它们添加在一起。这很重要,因为它会改变概率。

非常感谢您能提供的任何帮助和建议!

评论

请注意,提交Monopoly Simulator v2.py违反了版本控制系统的目的,即跟踪对每个文件所做更改的历史记录。

还有@ 200_success,您能解释一下Github上的版本控制系统吗?我是整个编程领域的新手,所以我不完全了解Github的工作原理。感谢您的帮助!

Git快速入门教程:(1)编辑文件。 (2)git add file1.py file2.py(3)git commit(4)git push(5)GOTO 1.然后,Git将为您跟踪每个文件中的修改,并且您可以在浏览GitHub时看到这些更改。不幸的是,完整的Git教程太大了,无法放入评论中,因为本书的材料足够多。

Python 2是否允许您将字符串强制转换为int?第42行(范围内的h)给我一个错误,因为它期望2个整数,并且得到一个整数和一个字符串。

@Carcigenicate在那个for循环中,“ num”不是字符串-它是一个包含int的变量。因此,无论您正在运行哪个Python,都应该没有错误。另外,我认为Python 2确实可以强制执行。如果将字符串强制为int,则执行int(“ string”)。

#1 楼

您确实需要删除一些全局变量。
作为示例,我将所有棕色更改为使用列表。

brown = [0, 0]


对棕色,青色,粉红色等进行很多逻辑处理,我会制作字典。
字典就像列表一样,它们具有一些我要使用的功能,基本上是列表,但是可以有“键。

所以我要使用:

places = {
    'Brown': [0, 0],
    'Cyan': [0, 0, 0],
    'Pink': [0, 0, 0],
    'Orange': [0, 0, 0],
    'Red': [0, 0, 0],
    'Yellow': [0, 0, 0],
    'Green': [0, 0, 0],
    'Blue': [0, 0, 0]
}


您的许多逻辑都基于这些位置。
/>为了减少重复的信息,我会制作另一本字典,告诉我们那是哪一部分。
所以我用:

board = {
    1: ('Brown', 0),
    3: ('Brown', 1),
    6: ('Cyan', 0),
    8: ('Cyan', 1),
    9: ('Cyan', 2),
    11: ('Pink', 0),
    13: ('Pink', 1),
    14: ('Pink', 2),
    16: ('Orange', 0),
    18: ('Orange', 1),
    19: ('Orange', 2),
    21: ('Red', 0),
    23: ('Red', 1),
    24: ('Red', 2),
    26: ('Yellow', 0),
    27: ('Yellow', 1),
    29: ('Yellow', 2),
    31: ('Green', 0),
    32: ('Green', 1),
    34: ('Green', 2),
    37: ('Blue', 0),
    39: ('Blue', 1),
}


应该看到它比列表更易于使用,因为我们不必提供0。
然后我将继续更改几乎所有使用这些逻辑的逻辑。
它将大大减少数量代码中的行数,使您的代码更易于阅读和理解。我不会更改iterationjail,因为它们不适合我们上面创建的对象。将它们简化为:

house_set, place = board.get(piece, (None, None))
if house_set is not None:
    places[house_set][place] += 1


然后我将继续更改计算和显示总计的方式。
使用字典理解和dictionary.get
您需要“ house_set”的总和并知道“ place”。
要同时获得两者,您需要经过sum

totals = {place: sum(house_set) for place, house_set in places.items()}


要显示此内容,可以在dict.items()上使用for循环。
显示位置和金额的地方。

for place, amount in totals.items():
    print('{} = {}'.format(place, amount))


此后显示所有内容数字,从棕色1到蓝色2。
我使用与上面相同的方法,但是使用totals.items()而不是places。 >我将像上面一样循环浏览并显示它们,但是您需要知道它是“棕色1”而不是“ b” rown'。
因此,我将使用带有可选参数的totals来简化获取这些数字的逻辑。
然后我使用:

for place, house_set in places.items():
    for i, amount in enumerate(house_set, 1):
        print('{} {} = {}'.format(place, i, amount))


最后打印在打印漂亮的面板之前您被监禁的次数。
与以前大致相同,但是由于我使用enumerate而不是str.format,所以我将其更改为保持一致。

print("You've been jailed {} times".format(jail))



我将彻底改变板子的显示方式,并不是说这是最好的方法。
比键入%space很多。
这也将显示木板实际上只是一行。
这很好,但是还不如将其更改为字符串并找到其长度。
您也找到了最大的数字来获取该长度。
这是通过手动编写blank来实现的。我会使用列表理解。
我们继续再次通过(我的)places,但是我们不需要名称,就可以使用places来获取值。
这样将导致:之后,您可以手动设置dict.values()blank这个尺寸。而是可以使用space
这将使您重复多次字符串。这样简化了代码:

digit = len(str(max(amount for house_set in places.values() for amount in house_set)))


之后,您将创建一个格式化列表。我会改为设置" " * digit的格式。
但是为了保留原始格式,我将使用字典理解和列表理解。
就像我们之前用于显示数字的for循环一样。
在此迷你语言中,我还将使用places所使用的格式很简单。
您希望数字以零开头,因此您将使用类似str.format的方法。 >但是您想传递数字。为了简化逻辑,可以使用{:0>digit}
数据是我们将要格式化的数据,就像以前一样。
因此,我将使用:

blank = "-" * digit
space = " " * digit


最后我将在使用两个的地方再使用三个步骤。
这是为了减少重复的逻辑,但是增加了一些代码更难读。
在我们早些时候在{{:0>{}}}.format(digit).format(data)中构建板子的位置时,我们知道在板子线中放置东西的地方。 ,然后您选择从右下角开始原点。

在此变得太复杂之前,我将解释如何制作木板的线条。
您知道上面有40个地方
您已经说出了这40所房子/街道中的所有地方。
这使您可以再次使用我们以前用board建造的词典。
如果其中没有片段该字典比我们知道的应该是空白。
无论如何,最后板上的第一个项目是'go'。
这允许您执行以下操作:



之后,我们可以将该列表转换为董事会。
T他的方法是从40个索引中获得木板的x和y位置。
因为这主要是数学运算,所以我只是转储代码。
但是我将整个木板初始化为board.get并覆盖外部将此代码圈到上面的行上。
这是这样的:

place_format = '{{:0>{}}}'.format(digit)

formatted = {
    place: [place_format.format(amount) for amount in house_set]
    for place, house_set in places.items()
}


最后,我简化了打印。
您应该循环穿过木板的每一行并打印出来。
当您在木板的任一侧添加一些空间时,我将再次使用space包裹str.format的结果。
并且您想加入每个正方形带有str.join的主板,应该使用|
这可能导致: />
board_line = []
for index in range(40):
    place = board.get(index, None)
    if place is None:
        value = blank
    else:
        value = places[place[0]][place[1]]
    board_line.append(value)
board_line[0] = 'Go'


评论


\ $ \ begingroup \ $
哇,我非常感谢您为帮助我付出的时间和精力!即使我还没有完全了解所有内容,这实际上还是很有帮助的(但是我可以去查找一下)。显然,我在编程领域还有很长的路要走,但是我很期待这段旅程!
\ $ \ endgroup \ $
– ohjuny
16年5月31日在17:36

\ $ \ begingroup \ $
@ohjuny完全没有问题!很高兴它有所帮助!如果您学习了我提到的主要内容,列表,字典(字典)和理解能力,那么您将拥有更加愉快的旅程,:)
\ $ \ endgroup \ $
– Peilonrayz
16年5月31日在17:50

\ $ \ begingroup \ $
板上实际上有41个空格。 “在监狱里”和“只是来访”是不同的实体。像您一样计算,Go为0,我会将“ Just Visiting”视为10,并将“ In Jail”作为一个单独的实体,而不是完全不在0..39轨道上。当玩家离开监狱时,只需将其移至10:JV并从此处应用掷出掷骰即可。
\ $ \ endgroup \ $
– Monty Harder
16年6月1日在16:55

\ $ \ begingroup \ $
@MontyHarder这是一个公平的观点。我实际上将Jail视为一个具有两个子空间的单一空间。以及我将如何实施它。但对于每个人,:)但是我同意我不会在0..39中添加新的空格。
\ $ \ endgroup \ $
– Peilonrayz
16年6月1日在17:33

\ $ \ begingroup \ $
@JoeWallis听起来您的“子空间”是我的“空间”。在上面的代码中,您将Jail显示为10,但有一个单独的Jail标志。我将Jail变量实现为“剩余的免费推出尝试次数”,第一次入狱时最初设置为3,并在每次滚动时递减。如果玩家滚动翻倍,则将Jail设置回0并移出。如果Jail在尝试推出时达到0,则从玩家的钱中减去$ 50;他们现在又凭借Jail = 0进入了Just Visiting。
\ $ \ endgroup \ $
– Monty Harder
16年6月1日在18:40

#2 楼

您有很多冗长的重复,您应该学习使用循环和函数简化操作。

首先,您要在木板上打印每一行,并获得一条打印语句,但是您可以仅使用for循环:

for line in board:
    print("  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  |  %s  " %(line[0], 
                                                                                           line[1],
                                                                                           line[2],


但是,比这更好的是,您可以使用str.join一次性打印列表。使用它的方法是在要用作分隔符的字符串上调用.join。您可以使用' | '。因此,您要使用字符串joinline的每个board进行编码。加上它看起来会更整洁。

for line in board:
    print("  |  ".join(line))


评论


\ $ \ begingroup \ $
@ohjuny循环所有可以循环的内容。如果几乎相同地复制行,请尝试将其更改为循环。那一堂课将为您节省大量不必要的工作。
\ $ \ endgroup \ $
–致癌物质
16年6月2日在17:34

\ $ \ begingroup \ $
@Carcigenicate是的,那是我将从这种经历中获得的一件事。实际上,我已经尝试制作另一个具有更多功能的Monopoly板,并且尝试合并字典和更多循环。您可以在这里查看并告诉我您的想法! :D
\ $ \ endgroup \ $
– ohjuny
16年3月3日在12:04

\ $ \ begingroup \ $
@ohjuny我个人现在没有时间查看,但是如果完成更改,您可以使用更新的代码在网站上发布新问题,然后返回此处,以说明这是一个问题。您的代码的版本2。
\ $ \ endgroup \ $
–SuperBiasedMan
16年3月3日在15:18

#3 楼

在我玩过的每张大富翁游戏板上,前两个属性都有一个紫色的标头,而不是棕色的标头,所以我很困惑地看到Brown1和Brown2。

颜色到底是什么并不重要,但是在编写代码来模拟某些东西时,重要的是您的变量和值必须与熟悉模拟对象的人们的期望相匹配。

如果存在具有不同属性颜色的不同板,则最好不要将颜色用作变量或值,而应使用其他一些准确的标识符方案。

评论


\ $ \ begingroup \ $
那时您只在较旧的板上玩。 monopoly.wikia.com/wiki/Brown_Color_Group_Properties
\ $ \ endgroup \ $
–duckbrain
16年1月1日在17:39

\ $ \ begingroup \ $
不愿分享我的年龄:)似乎有无数个定制的Monopoly版本,颜色一定会发生变化。
\ $ \ endgroup \ $
– cdkMoose
16年6月1日在18:01

\ $ \ begingroup \ $
@ Duckbrain,Colors于2008年进行了更改,并且该游戏自1930年代就已经存在,许多开发人员都处于其童年版本的游戏早于更改的年龄。
\ $ \ endgroup \ $
– cdkMoose
16年1月1日在18:40



\ $ \ begingroup \ $
@cdkMoose您确定他们在2008年将其更改为棕色吗?显然,英国的一种自1935年以来就一直是棕色的,我也从未在英国看到它们是紫色的。
\ $ \ endgroup \ $
– Peilonrayz
16年6月1日在19:21

\ $ \ begingroup \ $
IMO极有理由将“颜色”抽象视为不良,并改用带编号的“组”抽象,其中颜色只是属性,而不是在代码中引用名称。
\ $ \ endgroup \ $
–马修·金登(Mathieu Guindon)♦
16年2月2日在14:55