Игра в кости

У меня есть этот вопрос для назначения:

Ваш друг разработал игру с двумя игроками. Два игрока, называемые A и B, по очереди бросают обычный шестигранный кубик, причем первым бросает A.

Первый игрок, который бросает шестерку, выигрывает игру. Вы и ваш друг не согласны с тем, какова вероятность победы А в игре, и поэтому вы решаете смоделировать игру с помощью компьютера.

Таким образом: напишите программу на Python, которая выполняет 10 испытаний, каждое из которых состоит из 10000 игр, и для каждого испытания печатает долю игр, выигранных игроком A.

Это код, который я получил до сих пор, он просто возвращает число около 1667 и каждый раз. Мне в основном интересно, как отличить А или Б от победы в игре.

Любая помощь будет оценена!

Отредактированный код

import random

def rollDie():
    return random.choice([1,2,3,4,5,6])

def roll_first():
    if random.choice([0,1]) == 0:
        return 'A'
    else:
        return 'B'   

def rollSim():
    while True:
        turn = roll_first()
        numTrials = 10
        numThrows = 10000
        totalThrows = numTrials*numThrows
        game_on = True
        winsA = 0
        winsB = 0
        while game_on:
            for n in range(numTrials):
                games = 0
                for i in range(numThrows):
                    throw = rollDie()
                    if turn == 'A':
                        if throw == 6:
                            winsA += 1
                            games += 1
                            break
                        else:
                            turn = 'B'
                    else:
                        if throw == 6:
                            winsB += 1
                            games += 1
                            break
                        else:
                            turn = 'A'
            return winsA/totalThrows

2 ответа

Решение

Лучший способ добиться чистого кода - разделить functions каждая из задач в руках, что означает:
1. Запустите игру -> Для каждого броска костей
2. Запустите игру -> Чередование игр между A и B, пока первый не получит 6 на кости (здесь, учитывая, что если A получает 6, B даже не нужно играть, поскольку A выиграл)
3. Запустите пробную версию -> Состоит из определенного количества игр
4. Запустите основную программу -> Состоит из воспроизведения всего необходимого количества проб

Итак, ниже, является одним из возможных решений (здесь вы видите, что мой play функция уже возвращает результат, то есть выиграл игрок или нет):

import random

def play():
    won = True
    keepPlaying = False
    rollDice = random.choice([1,2,3,4,5,6])
    if rollDice == 6: 
        return won
    return keepPlaying

def run_game(winsA, winsB):
    while True:
        playA = play()
        playB = play()
        if playA:
            winsA += 1
            return winsA, winsB
        elif playB:
            winsB += 1
            return winsA, winsB

def run_trial(numGames):
    winsA = 0
    winsB = 0
    for i in range(numGames):
        wins = run_game(winsA, winsB)
        winsA = wins[0]
        winsB = wins[1]
    print("winsA:", winsA, "| winsB:", winsB, "| Fraction of A wins:",  "{} %".format(winsA / ( winsA + winsB ) * 100))

numTrials = 10
numGames = 10000

for i in range(numTrials):
    run_trial(numGames)

Вам действительно нужно только подсчитать выигрыши для игрока A. Поскольку вы играете 10000 игр за пробу, если вы знаете количество игр, которые выиграл A, вы знаете, что другие игры должны быть выиграны B, и A+B=10000.

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

Вы можете использовать логическое значение isPlayerA знать, чья это очередь. Начать с isPlayerA = True а затем переключить его с isPlayerA = not isPlayerA,

Вот как вы могли бы написать это:

import random

def rollDie():
    return random.choice([1,2,3,4,5,6])

def winFraction(): # Perform one trial of 10000 games and return fraction of wins for A
    winsA = 0 # only count wins for A
    for numTrow in range(10000):
        isPlayerA = True # Player A always takes the first turn
        throw = rollDie()
        while throw != 6: # While the game is not over yet:
            isPlayerA = not isPlayerA # Switch to the other player
            throw = rollDie()
        if isPlayerA:
            winsA += 1 # Only count the wins for player A
    return winsA/10000.0 # This is the fraction: we know the number of played games

def sim():
    for trial in range(10): # Perform 10 trials
        print(winFraction()) # Print the result of the trial

sim() # Start the simulation
Другие вопросы по тегам