Игра блэкджек казино


Блэкджек (двадцать одно) - это игра казино, играл в карты. Цель игры рисовать карты, которые всего как можно ближе к 21 очков, как это возможно без перебора. Все картинки считаются за 10 очков, тузы считать как 1 или 11, а все остальные карты рассчитывать их числовое значение.

Игра ведется против дилера. Игрок пытается приблизиться к 21 (не более), чем у дилера. Если у дилера "перебор" (идет более 21), игрок автоматически побеждает (при условии, что игрок не уже лопнул). Дилер всегда должен брать карты в соответствии с фиксированного набора правил. Дилер берет карты, пока он или она достигает общей сложности не менее 17. Если в руке дилера есть туз, он будет равен 11, когда, в результате всего между 17 и 21 включительно; в противном случае туз считается как 1.

Написать программу, которая имитирует несколько игр блэкджек и оценивает вероятность, что у крупье будет перебор. Советы: лечить колода карт как бесконечное. Вам не нужно отслеживать карты в руке, только общее до сих пор (лечение туз как 1) и типа bool переменная hasace, что говорит, является ли рука содержит туз. А рука, содержащая туз, нужно было добавить 10 баллов к общей сумме именно при этом будет производить остановки всего(что-то между 17 и 21 включительно).

Он работает, но я просто хочу улучшить его, если это возможно.

def printIntro():
    print("This program simulates a bunch of blackjack games.")

def getInputs():
    while True:
        n = eval(input("How many games should be simulated? "))
        if n <= 0:
            print("You must enter a number greater than zero!")
        else:
            break

    return n

def simOneGame():
    score = 0
    blacklist = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
    while not gameOver(score):
        blackscore = blacklist[randrange(len(blacklist))]
        score = score + blackscore

        if score >= 17: 
             break
        if blackscore == 11 and (score >= 6 and score <= 10): 
            score = score + 11
        else:
            score = score + 1

    return score

def simNGames(n):
    holds = 0
    busts = 0
    for i in range(n):
        score = simOneGame()
        if score >= 22:
            busts = busts + 1
        else:
            holds = holds + 1

    return holds, busts

def gameOver(score):
    return score >= 22 or score >= 17

def printSummary(holds, busts):
    n = holds + busts
    print("Number of holds and busts: Holds: {0:0} Busts: {1:0}".format(holds, busts))
    print("Percentage of holds and busts: Holds: {0:0.1%}".format(holds / n), end = " ")
    print("Busts: {0:0.1%}".format(busts / n))

def main():
    printIntro()
    n = getInputs()
    score = simOneGame()
    holds, busts = simNGames(n)
    printSummary(holds, busts)

if __name__ == "__main__":
    main()


10463
2
задан 10 декабря 2011 в 04:12 Источник Поделиться
Комментарии
1 ответ

def printIntro():
print("This program simulates a bunch of blackjack games.")

Руководство по стилю Python рекомендуем lowercase_with_underscores для имен функций

def getInputs():
while True:
n = eval(input("How many games should be simulated? "))

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

        if n <= 0:
print("You must enter a number greater than zero!")
else:
break

return n

def simOneGame():
score = 0
blacklist = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11]
while not gameOver(score):
blackscore = blacklist[randrange(len(blacklist))]

В Python есть функция, случайный.выбор (), которая возвращает случайный элемент из списка.

        score = score + blackscore

if score >= 17:
break

Почему? Цикл завершится в любом случае. Там, кажется, не быть причиной, чтобы сломать здесь

        if blackscore == 11 and (score >= 6 and score <= 10): 
score = score + 11
else:
score = score + 1

Я предполагаю, что это связано с обработкой тузов, но я не понимаю логики. Вы уже добавили blackscore забить, так что я не думаю, что это было бы правильно. Кроме того, не нужно менять значение туза до 1, от одиннадцати из-за карты?

    return score

Вас только волнует бюсты/держит так, может быть, вы должны возвращать true или false?

def simNGames(n):
holds = 0
busts = 0
for i in range(n):
score = simOneGame()
if score >= 22:
busts = busts + 1
else:
holds = holds + 1

return holds, busts

def gameOver(score):
return score >= 22 or score >= 17

Так же, как и результат >= 17, нет оснований для включения первой части условие

def printSummary(holds, busts):
n = holds + busts
print("Number of holds and busts: Holds: {0:0} Busts: {1:0}".format(holds, busts))
print("Percentage of holds and busts: Holds: {0:0.1%}".format(holds / n), end = " ")
print("Busts: {0:0.1%}".format(busts / n))

def main():
printIntro()
n = getInputs()
score = simOneGame()
holds, busts = simNGames(n)
printSummary(holds, busts)

if __name__ == "__main__":
main()

5
ответ дан 10 декабря 2011 в 05:12 Источник Поделиться