Jogo de Bingo

175 views
Skip to first unread message

Sobrinhos Tia Dani

unread,
Dec 29, 2020, 5:23:49 PM12/29/20
to python...@googlegroups.com
Boa noite,

Sou iniciante e autodidata em python, sou formado em Adm. e especializado em finanças, e já não sou tão jovem quantos muitos do grupo kkkk, sempre gostei de programação e desde novo me atrevo nesta área, iniciei em clipper, onde fiz alguns sistemas pequenos, mas depois foquei na minha formação de deixei de programar e passou a ser mais por hobby, depois do clipper fui para o visual basic, e depois fique muito tempo sem programar e por uma necessidade na empresa busquei o python para solucionar o problema.

Hoje como acho a programação um excelente exercício para o raciocínio contínuo, tenho sobrinhos que adoram bingo e resolvi fazer um sisteminha para o sorteio (segue abaixo), ele está funcionando, mas gostaria da opnião dos caro colegas se como escrevi meu código está a contento ou devo melhorar em algum aspecto da escrita do código ou da lógica.

Agradeço desde já a atenção daqueles que quiserem opinar, um abraço a todos e um 2021 de muita prosperidade.

PS: mandei o código na mensagem, pois não sei como utilizar o "Github" para enviar.

############################################
# Sistema de sorteio de números para Bingo #
# Criado por: Miguel Guarnieri Júnior      #
# Versão 1.0 - 26/12/2020                  #
############################################

# Importando Bibliotecas
import random
from tkinter import *

#Variaveis
i=0
anterior="#-##"

def sortear():
    global i
    global anterior
    global numeros
    global sorteado
    global B
    global I
    global N
    global G
    global O
    B_Reiniciar.config(state="normal")
   
    #Criando Lista de Números
    if i==0:
        numeros = list(range(1,76))
        B = list()
        I = list()
        N = list()
        G = list()
        O = list()
        #Mistura os números
        random.shuffle(numeros)

    #Sorteio dos números
    if i <= 74: #74
        sorteado = numeros[i]
        if sorteado >= 1 and sorteado <= 15:
            letra = "B"
            B.append(sorteado)
            B.sort()
            LabelB.config(text="B -> "+str(B))
        elif sorteado >=16 and sorteado <=30:
            letra = "I"
            I.append(sorteado)
            I.sort()
            LabelI.config(text="I -> "+str(I))
        elif sorteado >=31 and sorteado <=45:
            letra = "N"
            N.append(sorteado)
            N.sort()
            LabelN.config(text="N -> "+str(N))
        elif sorteado >=46 and sorteado <=60:
            letra = "G"
            G.append(sorteado)
            G.sort()
            LabelG.config(text="G -> "+str(G))
        elif sorteado >=61 and sorteado <=75:
            letra = "O"
            O.append(sorteado)
            O.sort()
            LabelO.config(text="O -> "+str(O))
        Label2.config(text=letra+"-"+str(sorteado))
        Label4.config(text=str(i+1)+"/75")
        Label6.config(text=anterior)
        anterior=letra+"-"+str(sorteado)
        i+=1
    else:
        Label2.config(text="FIM")
        B_ProxN.config(state="disabled")
        #B_Iniciar.config(state="normal")
        i=0
   

def iniciar():
    global Label2
    global Label4
    global Label6
    global LabelB
    global LabelI
    global LabelN
    global LabelG
    global LabelO
    global B_ProxN
    global B_Reiniciar
   
    B_Iniciar.config(state="disabled")
    Img_Bingo.destroy()


    Label1 = Label(Win1, text="Numero Sorteado:",
                   font=("Arial","20","bold"),
                   fg="red")
    Label2 = Label(Win1, text="#-##",
                   font=("Arial","100","bold"),
                   fg="red")
    B_ProxN = Button(Win1,text=" Sortear !!! ",
                     font=("Arial","20","bold"),
                     fg="black",
                     bg="light gray",
                     width=10,
                     height=2,
                     command=sortear)
    B_Reiniciar = Button(Win1,text=" Reiniciar ",
                         font=("Arial","20","bold"),
                         fg="black",
                         bg="light gray",
                         width=10,
                         height=2,
                         state="disabled",
                         command=reiniciar)
    LabelB = Label(Win1, text="B ->",
                   font=("Arial","25","bold"))
    LabelI = Label(Win1, text="I  ->",
                   font=("Arial","25","bold"))
    LabelN = Label(Win1, text="N ->",
                   font=("Arial","25","bold"))
    LabelG = Label(Win1, text="G ->",
                   font=("Arial","25","bold"))
    LabelO = Label(Win1, text="O ->",
                   font=("Arial","25","bold"))
    Label3 = Label(Win1, text="Quantidade de Bolas Sorteadas:",
                   font=("Arial","20","bold"))
    Label4 = Label(Win1, text="0",
                   font=("Arial","20","bold"))
    Label5 = Label(Win1, text="Número anterior:",
                   font=("Arial","20","bold"))
    Label6 = Label(Win1, text="",
                   font=("Arial","20","bold"))

    Label1.place(x=50, y=50)
    Label2.place(x=50, y=100)
    B_ProxN.place(x=50, y=400)
    B_Reiniciar.place(x=50, y=500)
    LabelB.place(x=400, y=50)
    LabelI.place(x=400, y=150)
    LabelN.place(x=400, y=250)
    LabelG.place(x=400, y=350)
    LabelO.place(x=400, y=450)
    Label3.place(x=400, y=550)
    Label4.place(x=850, y=550)
    Label5.place(x=50, y=300)
    Label6.place(x=50, y=340)

def reiniciar():
    global i
    global anterior
    i=0
    anterior="#-##"
   
    LabelB.config(text="B ->")
    LabelI.config(text="I ->")
    LabelN.config(text="N ->")
    LabelG.config(text="G ->")
    LabelO.config(text="O ->")
    Label2.config(text="#-##")
    Label4.config(text="0/75")
    Label6.config(text="")
    B_ProxN.config(state="normal")

def sair():
    Win1.destroy()
   
#Parte Gráfica das Telas
#Criando as Janelas
Win1 = Tk()
Win1.title("Sorteio Bringo - Versão 1.0 - 12/2020")
Win1.geometry("1300x690+30+5") #Largura x Altura + posicaoX + posiçãoY
#Win1.iconbitmap("c:/xxx/icon.ico") --> icone da janela

imagem = PhotoImage(file="Sorteio_Bingo_Img1.png")
Img_Bingo = Label(Win1, image=imagem)
Img_Bingo.place(x=150, y=20)

#Botões
B_Iniciar = Button(Win1,text=" Iniciar ",
                        font=("Arial","20","bold"),
                        fg="black",
                        bg="light gray",
                        width=10,
                        height=1,
                        command=iniciar)
B_Sair = Button(Win1,text=" Sair ",
                     font=("Arial","20","bold"),
                     fg="black",
                     bg="light gray",
                     width=10,  #lagura
                     height=1, #Altura
                     command=sair)

B_Iniciar.place(x=400, y=610)
B_Sair.place(x=710, y=610)


#Executar a Janela
Win1.mainloop()



Livre de vírus. www.avast.com.

Eric Chiesse

unread,
Dec 29, 2020, 7:00:22 PM12/29/20
to python...@googlegroups.com
Bravo! O negócio é fazer e botar pra frente mesmo.

Dei uma olhada rápida e posso te dar umas dicas:
1 - Mesmo sem saber usar o github para postar código assim o gist é uma boa opção: https://gist.github.com/
2 - Evite variáveis globais. Provavelmente teu programa não precisa delas.
3 - Eu gosto de colocar a minha lógica de entrada (o entry point) dentro de uma função e no caso de python é com colocar depois de: if __name__ == '__main__':
Meus programas normalmente ficam assim:
if __name == '__main__':
    run(sys.argv[1:])
4 - Crie variáveis para recursos que se repetem. Por exemplo, em alguns lugares vc usa a fonte: ("Arial","20","bold"). Vc pode colocar em uma variável e depois usá-la onde precisar.
Ex:
BUTTON_FONT = ("Arial","20","bold")
B_Iniciar = Button(Win1,text=" Iniciar ",
                        font=BUTTON_FONT,
                        ...

B_Sair = Button(Win1,text=" Sair",
                        font=BUTTON_FONT,
                        ...
---
Eric Chiesse


--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/CAPpSoVq20gJLnbN8pu_J2yWZ%3Du%2BAu3oay71HFg_znua4nBgBVQ%40mail.gmail.com.

Sobrinhos Tia Dani

unread,
Dec 30, 2020, 1:47:01 PM12/30/20
to python...@googlegroups.com
Eric, muito obrigado pelas dicas, mas as variáveis globais precisei usar senão da o erro abaixo:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\migueljr\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:\Users\migueljr\OneDrive.old\Codigos_Python_OK\Sorteio_Bingo.pyw", line 28, in sortear
    if i==0:
UnboundLocalError: local variable 'i' referenced before assignment

Eric Chiesse

unread,
Dec 30, 2020, 4:04:34 PM12/30/20
to python...@googlegroups.com
Você está mantendo o estado do seu jogo nessas variáveis. Por isso, vc está precisando deixá-las globais para que as funções possam usá-las.
Tem duas maneiras simples de evitar isso:
1 - Vc pode colocar toda a tua interface (janela, labels, botões, etc) em um dicionário e passar esse dicionário para as funções que atuam sobre a interface. (Vai funcionar e é bom que vc faça por questão didática mas não é como se resolve esse problema na prática)
2 - Vc pode criar uma classe para manter o estado da sua aplicação e as ações dos botões podem ser expressas em métodos dessa classe (essa sim uma boa solução prática).

Dá uma estudada no git e põe teu projeto no github. Lá dá pra comentar melhor as linhas e é mais fácil sugerir melhorias.
Se vc fizer isso dá pra sugerir várias melhorias no design do código do seu jogo.
---
Eric


Sobrinhos Tia Dani

unread,
Dec 31, 2020, 9:08:18 AM12/31/20
to python...@googlegroups.com
Eric, bom dia

Obrigado mais uma vez pelas dicas, estou começando agora a estudar programação orientada a objetos e ainda estou meio confuso com classes e métodos, mas vou me aprofundar melhor e tentar melhorar o código usando POO, tb vou conhecer como faz pra colocar do Git.

Obrigado e um próspero ano novo.

Livre de vírus. www.avast.com.

Eric Chiesse

unread,
Dec 31, 2020, 4:02:32 PM12/31/20
to python...@googlegroups.com
Querendo trocar ideia se conecta no meu servidor no discord: https://discord.gg/7Ndjjvg
Eu aproveito pra tirar dúvidas lá conforme vou tendo chance. E tem um pessoal esperto já lá (a maioria focada em Lua, mas até certo ponto é bem parecido com python)

Boa sorte, sucesso e feliz ano novo !!
---
Eric


Reply all
Reply to author
Forward
0 new messages