associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 2e 2006-12-01 01:19:52

Excluir mensagem

Bingo

Código que postei na intenção de aprender a usar o wiki, espero que ele ajude alguem aprender python, fiz esse código na intenção de mostrar para meu primo que está aprendendo algumas coisas básicas da linguagem.

Estou pensando em implementar alguns operadores principalmente na classe Cartela, pois será um bom exemplo do uso de operadores na linguagem python como: str, repr, comparação. Deixaria o codigo bem mais elegante, se niguem fizer em breve devo fazer e postar aqui.

Código

# -*- coding: utf-8 -*-
import random
import sys

class Numeros:
    """
    Gera os numeros para cada letra do bingo.
    
    O bingo inicia em 1 até o numero 75, dividido em 5 colunas 
    B de 1 a 15, I de 16 a 30, N de 31 a 45, G de 46 a 60 e O de 61 a 75
    """
    def __init__(self):
        self.numeros = [[],[],[],[],[]]
        for x in range(0,5):
            for y in range(x*15+1,(x+1)*15+1):
                self.numeros[x].append(y)

class Cartela:
    """
    Gerencia as cartelas do bingo.
    
    Cria uma nova cartela gerada apartir de numeros aletorio preenchendo cada 
    coluna da cartela do bingo de acordo com a quantidade de numeros informadas
    nos parametros de inicialização da classe
    """                
    def __init__(self,num,chave,b=5,i=5,n=5,g=5,o=5):
        self.pedrasmarcadas = 0
        self.cartela = [[],[],[],[],[]]
        self.quantidade = [b,i,n,g,o]
        self.chave = chave
        for x in range(0,5):
            self.cartela[x] = random.sample(num.numeros[x],self.quantidade[x])
            self.cartela[x].sort()
            
    def exibeCartela(self):
        """
        Imprime na saida padrão os numeros da cartela.
        """
        print "=" * 3*5
        print "Cartela n %d" % (self.chave)        
        print "=" * 3*5
        print "%3s%3s%3s%3s%3s" % ("B","I","N","G","O")
        for x in range(0,5):
            print "%3d%3d%3d%3d%3d" % (self.cartela[0][x],self.cartela[1][x], \
            self.cartela[2][x],self.cartela[3][x],self.cartela[4][x])
        print "=" * 3*5
    
    def existePedra(self,pedra):
        """
        Verifica a existencia da pedra na cartela.

        Identifica qual coluna a pedra pertence em seguida verifica se nesta
        coluna à existencia da pedra que é usada como retorno caso exista, e uma
        lista vazia é retornada caso não exista a pedra na cartela
        """
        col = pedra / 15
        if pedra % 15 == 0:
            col = col - 1

#        retorno = []
#        for x in self.cartela[col]:
#            if pedra == x:
#                retorno = [x]
#        return(retorno) 

# O mesmo codigo pode ser escrito como abaixo:
        
        return([x for x in self.cartela[col] if pedra == x])

class Bingo: 
    def __init__(self):
        self.cartelas = []
        self.restantes = range(1,76)
        self.pedras = Numeros()
        
    def removeNumerodosrestantes(self,numero):
        self.restantes = filter(lambda arg:arg != numero,self.restantes)
        
        for cartela in self.cartelas:
            if cartela.existePedra(numero):
#                cartela.pedrasmarcadas = cartela.pedrasmarcadas + 1            
                cartela.pedrasmarcadas +=  1
    
    def adicionaCartela(self,chave):
        """
        Adiciona uma nova cartela a lista de cartelas do bingo.
        """
#        self.cartelas.append(self.confereCartela(Cartela(self.pedras,chave)))
        self.cartelas.append(Cartela(self.pedras,chave))

    def confereCartela(self,comparar):
        """
        Compara se uma carte exite identica na lista de cartelas do bingo.
        
        Retorna a cartela comparada caso não exista uma com os mesmos numeros na
        lista de cartelas do bingo e False caso ela exista na lista
        """
        for x in self.cartelas:
                if x.cartela == comparar.cartela:
                    del comparar
                    print "Cartela FALSA"
                    sys.exit()
                    return(False)                   
                    break                   
        return(comparar)

    def sorteaPedra(self):
        """
        Escolhe uma pedra entre as restantes no bingo.
        """
        return(random.choice(self.restantes))

#iniciando o bingo
b = Bingo()

#Criando Cartelas
for x in range(0,100):
    b.adicionaCartela(x)
    print "Cartela n%s" % (x+1)
#    b.cartelas[x].exibeCartela()

    
# simulando um bingo
while b.restantes:
    pedrasorteada = b.sorteaPedra()
    print pedrasorteada,
    b.removeNumerodosrestantes(pedrasorteada)
    for cartela in b.cartelas:
        if cartela.pedrasmarcadas == 25:
            print
            print "BATEU"
            print "Faltavam %d" % (len(b.restantes)) 
            print b.restantes
            cartela.exibeCartela()
            sys.exit()