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.

Como era de se esperar a brincadeira com python está muito divertida o que acabou resultando em mais códigos, fiz alguns operadores para classe cartela e algumas melhoras no funcionamento do programa. Tenho um amigo que inicio uma interface, daqui a pouco ela aparece por aqui.

Código

   1 #!/usr/bin/python
   2 # -*- coding: utf-8 -*-
   3 import random
   4 import sys
   5 
   6 class Numeros:
   7     """
   8     Gera os numeros para cada letra do bingo.
   9     
  10     O bingo inicia em 1 até o numero 75, dividido em 5 colunas 
  11     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
  12     """
  13     def __init__(self):
  14         self.numeros = [[],[],[],[],[]]
  15         for x in range(0,5):
  16             for y in range(x*15+1,(x+1)*15+1):
  17                 self.numeros[x].append(y)
  18 
  19 class Cartela:
  20     """
  21     Gerencia as cartelas do bingo.
  22     
  23     Cria uma nova cartela gerada apartir de numeros aletorio preenchendo cada 
  24     coluna da cartela do bingo de acordo com a quantidade de numeros informadas
  25     nos parametros de inicialização da classe
  26     """                
  27     def __init__(self,num,chave,b=5,i=5,n=5,g=5,o=5):
  28         self.pedrasmarcadas = 0
  29         self.cartela = [[],[],[],[],[]]
  30         self.quantidade = [b,i,n,g,o]
  31         self.chave = chave
  32         for x in range(0,5):
  33             self.cartela[x] = random.sample(num.numeros[x],self.quantidade[x])
  34             self.cartela[x].sort()
  35             
  36     def __eq__(self,other):
  37         """
  38         Compara duas cartelas.
  39         """
  40         return(self.cartela == other.cartela)
  41     
  42     def __str__(self):
  43         """
  44         Texto com a chave da cartela.
  45         """
  46         return("Cartela %s" % (self.chave))
  47         
  48     def exibeCartela(self):
  49         """
  50         Imprime na saida padrão os numeros da cartela.
  51         """
  52         print "=" * 3*5
  53         print "Cartela %s" % (self.chave)        
  54         print "=" * 3*5
  55         print "%3s%3s%3s%3s%3s" % ("B","I","N","G","O")
  56         for x in range(0,5):
  57             print "%3d%3d%3d%3d%3d" % (self.cartela[0][x],self.cartela[1][x], \
  58             self.cartela[2][x],self.cartela[3][x],self.cartela[4][x])
  59         print "=" * 3*5
  60     
  61     def existePedra(self,pedra):
  62         """
  63         Verifica a existencia da pedra na cartela.
  64 
  65         Identifica a qual coluna a pedra pertence em seguida verifica se nesta
  66         coluna existe a pedra,que é usada como retorno, ou uma lista vazia é
  67         retornada caso não exista a pedra na cartela
  68         """
  69         col = pedra / 15
  70         if pedra % 15 == 0:
  71             col = col - 1
  72 
  73 #        retorno = []
  74 #        for x in self.cartela[col]:
  75 #            if pedra == x:
  76 #                retorno = [x]
  77 #        return(retorno) 
  78 
  79 # O mesmo codigo pode ser escrito como abaixo:
  80         
  81         return([x for x in self.cartela[col] if pedra == x])
  82 
  83 class Bingo: 
  84     def __init__(self):
  85         """
  86         Iniciando o bingo.
  87     
  88         É inicializado o vetor de cartelas, as pedras restantes (no inicio do
  89         bingo: todas as pedras são as restantes) e as pedras do bingo separadas
  90         por coluna 5 colunas B I N G O.
  91         """
  92         self.cartelas = []
  93         self.restantes = range(1,76)
  94         self.pedras = Numeros()
  95         
  96     def removeNumerodosrestantes(self,numero):
  97         """
  98         Remove um numero da lista de numeros restantes no bingo.
  99     
 100         Cada numero da lista de restantes é comparado com o numero a ser
 101         removido, apenas os restantes diferentes do numero a ser removido são
 102         inseridos na nova lista. Incrementa-se pedras marcadas nas cartelas que
 103         possuem o numero a ser removido.
 104         """
 105         self.restantes = filter(lambda arg:arg != numero,self.restantes)
 106         
 107         #Verificando quais cartelas possuem o numero removido para incrementar
 108         # o numero de pedras marcadas nas cartelas
 109         for cartela in self.cartelas:
 110             if cartela.existePedra(numero):
 111 #                cartela.pedrasmarcadas = cartela.pedrasmarcadas + 1            
 112                 cartela.pedrasmarcadas +=  1
 113     
 114     def adicionaCartela(self,cartela):
 115         """
 116         Adiciona uma nova cartela a lista de cartelas do Bingo.
 117         """
 118         self.cartelas.append(self.confereCartela(cartela))
 119 #        self.cartelas.append(Cartela(self.pedras,chave))
 120 
 121     def confereCartela(self,comparar):
 122         """
 123         Compara se uma cartela exite idêntica na lista de cartelas do bingo.
 124         
 125         Retorna a cartela comparada caso não exista uma com os mesmos numeros na
 126         lista de cartelas do bingo e False caso ela exista na lista
 127         """
 128         for x in self.cartelas:
 129 #               if x.cartela == comparar.cartela:
 130 # Agora usando a implementação de igualdade __eq__ da classe Cartela
 131                 if x == comparar:
 132                     comparar = self.confereCartela(Cartela(self.pedras,comparar.chave))
 133                     break                   
 134         return(comparar)
 135 
 136     def sorteaPedra(self):
 137         """
 138         Escolhe uma pedra entre as restantes no bingo.
 139         """
 140         return(random.choice(self.restantes))
 141 
 142 def inicio():
 143     """
 144     iniciando o bingo.
 145     
 146     Simulação de utilização do aplicativo Bingo.
 147     """
 148     
 149     b = Bingo()
 150 
 151     #Criando Cartelas
 152     for x in range(0,100):
 153         b.adicionaCartela(Cartela(b.pedras,x+1))
 154         print b.cartelas[x]
 155     #    b.cartelas[x].exibeCartela()
 156 
 157     #Demostração que cartelas repetidas não entram na lista de cartelas
 158     print b.cartelas[0]
 159     #eu gostaria de ter tirado uma copia do objeto aqui mas nao sei como fazer
 160     #desta forma apenas uma copia do endereço do conteudo do objeto foi feita
 161     #ou seja a fala é exatamente a mesma primeira cartela
 162     falsa = b.cartelas[0]
 163     #quando altero a chave da falsa estou alterando a chave da primera tb
 164     falsa.chave = "Falsa"
 165     falsa.exibeCartela()
 166     b.adicionaCartela(falsa)
 167     #e isso a prova q uma mesma cartela (levando em cosideração os numeros) não
 168     #é adicionada duas vezes na lista de cartela do bingo
 169     b.cartelas[x+1].exibeCartela()
 170     #isso é a prova de que nao foi feito uma copia
 171     b.cartelas[0].exibeCartela()
 172 
 173     
 174     # simulando um bingo
 175     while b.restantes:
 176         pedrasorteada = b.sorteaPedra()
 177         print pedrasorteada,
 178         b.removeNumerodosrestantes(pedrasorteada)
 179         for cartela in b.cartelas:
 180             if cartela.pedrasmarcadas == 25:
 181                 print
 182                 print "BATEU"
 183                 print "Faltavam %d" % (len(b.restantes)) 
 184                 print b.restantes
 185                 cartela.exibeCartela()
 186                 sys.exit()
 187 
 188 #Executando o aplicativo se for chamado diretamente
 189 if __name__ == '__main__':
 190     inicio()

Bingo (editada pela última vez em 2008-09-26 14:05:41 por localhost)