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

Diferenças para "Bingo"

Diferenças entre as versões de 1 e 3 (2 versões de distância)
Revisão 1e 2006-12-01 01:03:20
Tamanho: 4682
Editor: BrunoGomes
Comentário:
Revisão 3e 2006-12-05 16:42:17
Tamanho: 6443
Editor: BrunoGomes
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 2: Linha 2:

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.
Linha 41: Linha 43:
    def __eq__(self,other):
        """
        Compara duas cartelas.
        """
        return(self.cartela == other.cartela)
    
    def __str__(self):
        """
        Texto com a chave da cartela.
        """
        return("Cartela n %d" % (self.chave))
        
Linha 58: Linha 72:
        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
        Identifica a qual coluna a pedra pertence em seguida verifica se nesta
        coluna existe a pedra,que é usada como retorno, ou uma lista vazia é
        retornada caso nã
o exista a pedra na cartela
Linha 78: Linha 92:
        """
        Iniciando o bingo.
    
        É inicializado o vetor de cartelas, as pedras restantes (no inicio do
        bingo: todas as pedras são as restantes) e as pedras do bingo separadas
        por coluna 5 colunas B I N G O.
        """
Linha 83: Linha 104:
        """
        Remove um numero da lista de numeros restantes no bingo.
    
        Cada numero da lista de restantes é comparado com o numero a ser
        removido, apenas os restantes diferentes do numero a ser removido são
        inseridos na nova lista. Incrementa-se pedras marcadas nas cartelas que
        possuem o numero a ser removido.
        """
Linha 85: Linha 114:
        #Verificando quais cartelas possuem o numero removido para incrementar
        # o numero de pedras marcadas nas cartelas
Linha 92: Linha 123:
        Adiciona uma nova cartela a lista de cartelas do bingo.         Adiciona uma nova cartela a lista de cartelas do Bingo.
Linha 94: Linha 125:
# self.cartelas.append(self.confereCartela(Cartela(self.pedras,chave)))
        self.cartelas.append(Cartela(self.pedras,chave))
        self.cartelas.append(self.confereCartela(Cartela(self.pedras,chave)))
# self.cartelas.append(Cartela(self.pedras,chave))
Linha 99: Linha 130:
        Compara se uma carte exite identica na lista de cartelas do bingo.         Compara se uma cartela exite idêntica na lista de cartelas do bingo.
Linha 105: Linha 136:
         if x.cartela == comparar.cartela: # if x.cartela == comparar.cartela:
# Agora usando a implementação de igualdade __eq__ da classe Cartela
         if x == comparar:
Linha 107: Linha 140:
# codigo feio daqui para baixo (ainda tem q decidir como tratar esse caso)
Linha 119: Linha 153:
#iniciando o bingo
b = Bingo()
def inicio():
    """
    iniciando o bingo.
    
    Simulação de utilização do aplicativo Bingo.
    """
    
    b = Bingo()
Linha 122: Linha 162:
#Criando Cartelas
for x in range(0,100):
    b.adicionaCartela(x)
    print "Cartela n%s" % (x+1)
# b.cartelas[x].exibeCartela()
    #Criando Cartelas
    for x in range(0,100):
        b.adicionaCartela(x+1)
     print b.cartelas[x]
 # b.cartelas[x].exibeCartela()
Linha 129: Linha 169:
# 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()
    # 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()

#Executando o aplicativo se for chamado diretamente
if __name__ == '__main__':
    inicio()

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 __eq__(self,other):
        """
        Compara duas cartelas.
        """
        return(self.cartela == other.cartela)
    
    def __str__(self):
        """
        Texto com a chave da cartela.
        """
        return("Cartela n %d" % (self.chave))
        
    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 a qual coluna a pedra pertence em seguida verifica se nesta
        coluna existe a pedra,que é usada como retorno, ou 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):
        """
        Iniciando o bingo.
    
        É inicializado o vetor de cartelas, as pedras restantes (no inicio do
        bingo: todas as pedras são as restantes) e as pedras do bingo separadas
        por coluna 5 colunas B I N G O.
        """
        self.cartelas = []
        self.restantes = range(1,76)
        self.pedras = Numeros()
        
    def removeNumerodosrestantes(self,numero):
        """
        Remove um numero da lista de numeros restantes no bingo.
    
        Cada numero da lista de restantes é comparado com o numero a ser
        removido, apenas os restantes diferentes do numero a ser removido são
        inseridos na nova lista. Incrementa-se pedras marcadas nas cartelas que
        possuem o numero a ser removido.
        """
        self.restantes = filter(lambda arg:arg != numero,self.restantes)
        
        #Verificando quais cartelas possuem o numero removido para incrementar
        # o numero de pedras marcadas nas cartelas
        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 cartela exite idêntica 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:
# Agora usando a implementação de igualdade __eq__ da classe Cartela
                if x == comparar:
                    del comparar
# codigo feio daqui para baixo (ainda tem q decidir como tratar esse caso)
                    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))

def inicio():
    """
    iniciando o bingo.
    
    Simulação de utilização do aplicativo Bingo.
    """
    
    b = Bingo()

    #Criando Cartelas
    for x in range(0,100):
        b.adicionaCartela(x+1)
        print b.cartelas[x]
    #    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()

#Executando o aplicativo se for chamado diretamente
if __name__ == '__main__':
    inicio()