Игра в кости - PullRequest
       32

Игра в кости

0 голосов
/ 08 декабря 2018

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

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

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

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

Это код, который я получил до сих пор, он просто возвращает число в 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 ]

0 голосов
/ 08 декабря 2018

Вам действительно нужно рассчитывать выигрыши только для игрока 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
0 голосов
/ 08 декабря 2018

Лучший способ получить чистый код - разделить на functions каждую из выполняемых задач, что означает:
1. Запустить игру -> Для каждого броска костей
2. Выполнитьgame -> Чередование игр между 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)
...