Монопольный симулятор

Мне был рекомендован пользователь 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]
                                                                                ))

Я программировал только около месяца, поэтому я знаю, что есть много способов улучшить и оптимизировать мой код. Просто просматривая это, я, кажется, повторяю некоторый код, поэтому абстрагирование их с помощью функций может быть возможно.

Я должен упомянуть, что я знаю ошибку, просто выполняя randint(2, 12). На моей странице Github я изменил ее, чтобы дважды выполнить randint(1, 6) и добавить их вместе. Это важно, потому что изменяет вероятность .

Я ценю любую помощь и предложения, которые вы можете предложить!

61 голос | спросил ohjuny 31 Maypm16 2016, 16:27:11

3 ответа


68

Вам действительно нужно удалить некоторые из ваших глобальных переменных. В качестве примера я бы изменил все ваши коричневые цвета, чтобы использовать список.

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, поскольку они не вписываются в объекты, которые мы создали выше. Однако я бы изменил все ваши другие ifs, чтобы использовать dictionary.get. С небольшим количеством распаковки кортежей вы можете упростить их все:

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

Затем я перейду к изменению способа расчета и отображения итогов. Использование понимания словаря и sum. Вы хотите получить сумму «house_set» и знать «место». И для получения обоих вам необходимо пройти через dict.items().

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

Чтобы отобразить это, вы можете использовать цикл for через totals.items(). Где вы показываете место и сумму.

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

После этого вы отобразите все цифры, от коричневого 1 до синего 2. Я бы использовал то же, что и выше, но использовал places, а не totals. Однако это возвращает список, который нам нужно выполнить. Я бы прошел через это и отобразил их, как мы делали выше, но вам нужно знать, что это «коричневый 1», а не «коричневый». И поэтому я бы использовал enumerate с дополнительным аргументом, чтобы упростить логику для получения этих чисел. Затем я использовал:

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

Наконец, вы печатаете количество раз, когда вы были заключены в тюрьму, прежде чем печатать красивую панель. Это примерно то же самое, что и раньше, но поскольку я использую str.format, а не %, я бы изменил его, чтобы он был последовательным.

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

Я бы решительно изменил, как вы показываете доску, я не говорю, что это лучший способ. Это проще, чем печатать space и blank много. Он также покажет, что плата фактически представляет собой линию.

В настоящее время вы используете цикл while и делитесь на десять, чтобы найти количество цифр, которое имеет число. Это хорошо, но не так ясно, как изменить его на строку и найти ее длину. Вы также найдете наибольшее число, чтобы получить эту длину. Это путем ручного ввода places вместо этого я бы использовал понимание списка. По мере того, как мы снова пройдем (мой) places, но нам не нужно имя, которое вы можете использовать dict.values(), чтобы получить значения. И это приведет к:

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

После этого вы создадите blank и space этот размер вручную. Вместо этого вы можете использовать " " * digit. Это позволит вам дублировать строку много раз. И поэтому упрощает код:

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

После этого вы создадите форматированный список. Вместо этого я бы выделил places. Однако, чтобы иметь возможность сохранить оригинал, я бы использовал понимание словаря и понимание списка. Это будет похоже на циклы for, которые мы использовали ранее для отображения чисел. Я также использовал бы str.formatформат, который вы используете, прост в этом мини-языке. Вы хотите, чтобы число выполнялось нулями, и поэтому вы использовали бы что-то вроде {:0>digit}. Однако вы хотите передать цифру. Для упрощения логики вы можете использовать {{:0>{}}}.format(digit).format(data). Где данные - это данные, которые мы будем форматировать, как и раньше. И поэтому я бы использовал:

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

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

Наконец, я буду использовать еще три шага, в которых вы использовали два. Это должно уменьшить дублируемую логику, но добавляет некоторый код, который сложнее читать. Когда мы строили позиции платы раньше в board, мы знаем, где разместить вещи на линии доски. Мы также знаем, что эта линия находится вокруг внешней стороны квадратной доски, и вы решили начать происхождение в правом нижнем углу.

Прежде чем это получить слишком сложно, я объясню, как я сделал бы линию платы. Вы знаете, что на доске 40 мест. Из этих 40 вы сказали все места, где находятся дома /улицы. Это позволяет использовать словарь, который мы создали ранее, с помощью board.get снова. Если в этом словаре нет части, мы знаем, что она должна быть пустой. Наконец, несмотря ни на что, первый элемент на доске «идет». Это позволяет:

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'

После этого мы можем перевести этот список на плату. Это достигается путем получения позиции x и y платы из индекса 40. Поскольку это в основном математика, я просто сброшу код. Но я инициализирую всю доску как space и перезаписываю внешний круг с этим кодом в строку выше. Это с помощью:

board = [[space] * 11 for _ in range(11)]
for index in range(40):
    x, y = 0, 0
    if index < 11:
        x = 10 - index
        y = 10
    elif index < 21:
        x = 0
        y = 10 - (index - 10)
    elif index < 31:
        x = index - 20
    else:
        x = 10
        y = index - 30
    board[y][x] = board_line[index]

Наконец, я упростил бы отпечатки. Вы должны прокручивать каждую строку доски и печатать ее. По мере того как вы добавляете какое-то пространство с обеих сторон платы, я снова использую str.format, чтобы обернуть результат str.join. И поскольку вы хотите присоединиться к каждому квадрату доски с помощью |, вы должны использовать ' | '.join(line). Это может привести к:

for line in board:
    print('  {}  '.format('  |  '.join(str(p) for p in line)))

Вот весь код:

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

from random import randint

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),
}

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]
}

piece = 0
jail = 0
iteration = 0

num = input("How many rolls do you want to simulate? ")
for h in range(num):
    piece += randint(1, 6) + randint(1, 6)

    if piece > 40:
        piece -= 40
        iteration += 1

    if piece == 30:
        piece = 10
        jail += 1

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

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

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

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

print("You've been jailed %d times" %(jail))

digit = len(str(max(amount for house_set in places.values() for amount in house_set)))
blank = "-" * digit
space = " " * digit
place_format = '{{:0>{}}}'.format(digit)

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

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'

board = [[space] * 11 for _ in range(11)]
for index in range(40):
    x, y = 0, 0
    if index < 11:
        x = 10 - index
        y = 10
    elif index < 21:
        x = 0
        y = 10 - (index - 10)
    elif index < 31:
        x = index - 20
    else:
        x = 10
        y = index - 30
    board[y][x] = board_line[index]

for line in board:
    print('  {}  '.format('  |  '.join(str(p) for p in line)))
ответил Peilonrayz 31 Maypm16 2016, 18:39:04
26

У вас много многословного повторения, вы должны научиться упрощать вещи с помощью циклов и функций.

Сначала вы печатаете доску с каждой строкой, получающей инструкцию печати, но вы можете просто использовать цикл 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))

Наконец, я бы поставил это в функцию, поэтому ее легче вызвать и вызвать. Плюс это будет выглядеть более аккуратно.

def draw(board):
    """Print out the whole board"""

    print("\n")
    for line in board:
        print("  |  ".join(line))
ответил SuperBiasedMan 31 Maypm16 2016, 17:19:44
4

На всех досках Монополии, которые я когда-либо играл, первые два свойства имеют фиолетовый заголовок, а не коричневый, поэтому я смутился, увидев Brown1 и Brown2.

Неважно, что такое цвета, но когда вы пишете код для имитации чего-то, важно, чтобы ваши переменные и значения соответствовали ожиданиям людей, знакомых с имитируемым объектом.

Если существуют разные платы с разными цветами свойств, тогда было бы лучше не использовать цвета в качестве переменных или значений, а вместо этого использовать другую точную схему идентификатора.

ответил cdkMoose 1 J0000006Europe/Moscow 2016, 19:33:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132