Как мне сыграть в бинго 1000 раз и отслеживать выигрыши с карты? - PullRequest
0 голосов
/ 29 октября 2019

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

Для этой задачи вы создадите приложение, которое играет в бинго с 25 картами. Выигрышными образцами бинго являются четыре угла и комбинезон. Эта симуляция должна выполняться для 1000 игр и отображать количество бинго, которые выиграла каждая карта, в виде списка в конце. Например, для одной игры в бинго есть два выигрышных паттерна: четыре угла и комбинезон. Сыграйте в бинго, набрав номер и проверив, есть ли на любой из 25 карт бинго. Если у карты есть хит, проверьте, есть ли у этой карты бинго. Если так, увеличьте его количество лото. Несколько карт бинго могут выиграть бинго на одном шаре. Как только все карты были оценены для этого числа, этот образец бинго больше не может быть выигран. Игра заканчивается, когда оба образца бинго были награждены.


У меня есть класс BingoCard, и я создал статический метод с именем draw_multiple_cards(), который должен играть в бинго со списком карт, но он не работает, и я также не былвозможность реализовать рабочий способ отображения / хранения количества побед. Любая помощь приветствуется;однако, пожалуйста, не проверяйте кодекс меня (если вам не нужно, чтобы ваш ответ работал)! Я буду публиковать свой код для проверки кода, как только он будет работать как задумано. Спасибо:)

Вот то, что у меня мало основного метода:

from BingoCard import BingoCard
import random


def main():

    cards = []
    for i in range(1, 26):
        cards.append(BingoCard())

    for i in range(1, 1001):
        BingoCard.draw_multiple_cards(cards, random.sample(range(1, 76), 75))

    for i in range(1, len(cards)+1):
        print("Card:", i, "\tWins:", cards[i-1].get_wins())


main()

Вот мой класс BingoCard:

# Author: Helana Brock
# CPS 280: Homework 3, problem 1

import random


class BingoCard:

    random_draw_list = random.sample(range(1, 76), 75)

    def __init__(self, min_ = 1, max_ = 15):
        """
        Generates a bingo card and stores the numbers in a dictionary.

        Arguments:
            min_ (int): The minimum number that can be on the card in the first row
            max_ (int): The maximum number that can be on the card in the first row
        """
        self.wins = 0
        self.card = {}
        for letter in "BINGO":
            self.card[letter] = random.sample(range(min_, max_+1), 5)
            min_ += 15
            max_ += 15
        self.card["N"][2] = "X" # free space!


    def get_wins(self):
        return self.wins


    def __str__(self):
        """
        Returns the bingo card.
        """
        return '\n'.join('\t'.join((letter, *map(str, values))) for letter, values in self.card.items())


    def draw(self, ball = random_draw_list.pop()):
        """
        Pops a number off a list of random numbers. Using the pop method ensures no duplicate
        numbers will be drawn.
        """
        number_drawn = ball
        for letter in self.card:
            i = 0
            for number in self.card[letter]:
                if number == number_drawn:
                    self.card[letter][i] = "X"
                i += 1
        return number_drawn


    def check_win(self):
        """
        First checks for diagonal wins, then four-corner, then horizontal, and, finally, vertical.
        """
        win = False
        if self.card["B"][0] == "X" and self.card["I"][1] == "X" and self.card["N"][2] == "X" and self.card["G"][3] == "X" and self.card["O"][4] == "X":
            win = True
            self.wins += 1
        elif self.card["O"][0] == "X" and self.card["G"][1] == "X" and self.card["N"][2] == "X" and self.card["I"][3] == "X" and self.card["B"][4] == "X":
            win = True
            self.wins += 1
        elif self.card["B"][0] == "X" and self.card["O"][4] == "X" and self.card["B"][4] == "X" and self.card["O"][0] == "X":
            win = True
            self.wins += 1
        for letter in self.card:
            if(len(set(self.card[letter]))==1):
                win = True
                self.wins += 1
        for i in range(5):
            cnt = 0
            for letter in self.card:
                if self.card[letter][i] == "X":
                    cnt += 1
            if cnt == 5:
                win = True
                self.wins += 1
                break
        return win


    @staticmethod
    def draw_multiple_cards(card_list, number_list):
        number_drawn = number_list.pop()
        for i in range(0, len(card_list)):
            card_list[i].draw(number_drawn)
            win = card_list[i].check_win()

            if win == True:
                return True


def main():
    """
    ***PLEASE READ***
    Main method for the program. Generates a card, prints it, and loops through drawing
    and printing until the check_win method returns True or the user enters "quit".

    This is just so you can see how it works with one player. Obviously, as I just said, this method works and runs just fine.
    """
    print("Let's play bingo!")
    card = BingoCard()

    print("\nHere is your card:\n")
    print(card)

    print("\nKeep pressing enter to continue or type quit to exit.\n")
    user_input = input()
    win = card.check_win()
    balls_till_win = 0

    while win == False and user_input != "quit":
        number_drawn = card.draw()
        balls_till_win += 1

        print(f"\nNumber drawn: {number_drawn}.")
        print(f"Total balls drawn: {balls_till_win}.\n")
        print(card)

        win = card.check_win()

        user_input = input()
    if win:
        print(f"\nBingo! Total balls to win: {balls_till_win}.")
    else:
        print("Goodbye! Thanks for playing!")


if __name__ == "__main__":
    main()

...