完整代码在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)
并将它们添加在一起。这很重要,因为它会改变概率。非常感谢您能提供的任何帮助和建议!
#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。
然后我将继续更改几乎所有使用这些逻辑的逻辑。
它将大大减少数量代码中的行数,使您的代码更易于阅读和理解。我不会更改
iteration
和jail
,因为它们不适合我们上面创建的对象。将它们简化为: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
。您可以使用' | '
。因此,您要使用字符串join
对line
的每个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
评论
请注意,提交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”)。