Jump to content
Mica

Sorteio

Recommended Posts

Mica

Cá estamos, projecto de python, e algumas dúvidas acerca :$

é o seguinte quero fazer a simulação do totobola tenho aqui o código já feito que passo a mostrar

elif oppcao ==2: 
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        
        for x in range(13):
            print"Jogo %d: %s"%(x+1,random.choice(l))

Resumindo o que tenho aqui é o sorteio

Jogo 1: 1

Jogo 2: x

Jogo 3: x

Jogo 4: x

Jogo 5: 2

...

Ou seja isto me dirá que no jogo 1 a primeira equipa irá ganhar no jogo 2 será empate etc etc

O que pretendo agora é abrir o meu ficheiro txt e dos jogos que lá tenho ele iria fazer alguma coisa como

Jogo 1: 1 Benfica x Porto

Jogo 2: x Setúbal x Braga

...

Mas quando ele for buscar os jogos pretendo que os vá buscar aleatoriamente...  ou seja nunca repetindo os jogos nos 13 sorteios...

O código para abrir o ficheiro já aqui tenho

f=open("teste.txt")
try:
        for line in f:
                print line
finally:
        f.close()

Só queria mesmo compreender agora a associação que tenho de fazer para ele abrir o meu documento, e aleatoriamente mostrar o jogo...

Share this post


Link to post
Share on other sites
AlexPnt

Uma boa maneira é,primeiro deves ler o ficheiro normalmente e guardar todos os jogos por exemplo numa lista, e depois ir retirando aleatoriamente da lista os jogos sem os repetir.

A questão da aleatoriedade sem repetir podes ,consegui-lo por exemplo, cada vez q retiras um jogo da lista aleatoriamente , retiras-o da lista para teres a certeza que esse nao volta a sair,


# supondo que ja tens os jogos lidos e armazenados numa lista 
elif oppcao ==2: 
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        a=13        
        for x in range(13):
            print"Jogo %d: %s %s"%(x+1,random.choice(l),a_tal_lista.pop(random.randint(0,a-1))
            a+=-1

Boa sorte... :)


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
Mica

Deixa me ver se percebi, vou ler os meus ficheiros que tenho no meu teste.txt, e vou armazena-los numa lista, onde depois o programa irá buscar a essa lista, e irá removendo da lista os que ele utilizará certo?

Share this post


Link to post
Share on other sites
Mica

Mas agora tenho aqui um problema para mim uma coisa básica para vocês ^^

ficheiro = open('teste.txt','r')
lista=ficheiro.readlines()
ficheiro.close()

Não sei se preciso de correr isto dentro de algum código já implementado :S penso que não preciso de mais nada, para ele ir ao meu txt buscar os dados que lá tenho e apresentar em lista :S

Share this post


Link to post
Share on other sites
Mica

Estive eu aqui a bater com a cabeça nisto, quando me apercebo, que não chamo a variável lista em lado nenhum OMG XD

O que o raio de uma linha de código faz xD

print "esta é a seguinte lista", lista

Ora entao já dá, agora a minha questão passa a ser, quero os valores a aparecerem

Benfica x porto

Setubal x braga

Agora ainda aparece Benfica x Porto  Setubal x Braga

Share this post


Link to post
Share on other sites
AlexPnt

Quando les os elementos da lista no ficheiro nao te podes esquecer de retirar o característico caracter de controlo '\n', que aparece sempre nos ficheiros cada vez que se muda de linha,logo

for elem in range(len(lista)):
    lista[elem]=lista[elem][:-1]

Para imprimires a lista, bom simples como

for jogo in lista:
     print jogo


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
Mica

Exactamente ^^ Não me lembrei do for...

Bem agora ando aqui a tentar compor isto para a forma que pretendo...

Jogo 1: 2

Jogo 2: X

...

Isto já faz, agora quero implementar a lista aleatoriamente ficando algo como:

Jogo 1: 2 Benfica x Braga

Jogo 2: x Porto x Rio Ave

...

Creio que deve ser usando as duas partes de código que já foram explicitas aqui tais como:

ficheiro = open('teste.txt','r') #esta parte de código toda creio que ficaria fora do IF estou certo?
lista=ficheiro.readlines()
ficheiro.close()
for elem in range(len(lista)):
    lista[elem]=lista[elem][:-1]

elif oppcao ==2:
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        a=13        
        for x in range(13):
            print"Jogo %d: %s %s"%(x+1,random.choice(l),lista.pop(random.randint(0,a-1))
                a+=-1 #erro nesta linha, creio que deve ser dos Tab's mas já tentei todos e não dá na mesma ^
        for jogo in lista: #esta parte para mostrar os dados certo? Ficaria aqui certo?
            print jogo

Onde esta a dar um problema é aqui a+=-1 :S

Share this post


Link to post
Share on other sites
AlexPnt

Quanto ao primeiro erro, como dizes é na tabulação , o  a+=-1  deve estar  imediatamente debaixo do print.

Já agora quando queres imprimir os dados, se pensares um pouco nao vai dar nada isto porque anteriormente a lista ficou vazia uma vez que retiramos os valores todos(q também me enganei). A solução está em criar uma cópia da lista antes de se começar a retirar os seus elementos, dessa maneira quando se quiser voltar a imprimir os dados iniciais eles ainda lá estão, mas na cópia(espero ter sido claro :D ).

Então,


ficheiro = open('teste.txt','r') #esta parte de código toda creio que ficaria fora do IF estou certo? R:Sim
lista=ficheiro.readlines()
ficheiro.close()
for elem in range(len(lista)):
    lista[elem]=lista[elem][:-1]
copia=lista[:]

elif oppcao ==2:
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        a=13        
        for x in range(13):
            print"Jogo %d: %s %s"%(x+1,random.choice(l),lista.pop(random.randint(0,a-1))
            a+=-1 
        for jogo in copia: 
            print jogo








Espero ter ajudado :)


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
Mica

Curioso dava erro ai e continua a dar.:) Eu pensava que ele retirava da lista, mas só como maneira de dizer, não que retirava mesmo xD Mas já compreendi!

elif oppcao == 2:
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        a=13
        for x in range(13):
            print"Jogo %d: %s %s"%(x+1,random.choice(l),lista.pop(random.randint(0,a-1))
            a+=-1  #Continua a dar erro aqui :S 
        for jogo in copia:
            print jogo

E tenho igual ao que colocaste ai..

A outra parte coloquei no inicio fora do meu IF... com as devidas correcções ...  Mas já agora passo parte do que tenho, visto que se não esta a dar é porque algo que tenho para trás não esta correctamente tabulado..

import random
ficheiro = open('teste.txt','r') 
lista=ficheiro.readlines()
ficheiro.close()
for elem in range(len(lista)):
    lista[elem]=lista[elem][:-1]
copia=lista[:]

while True:
    oppcao = input ("Que Chave pretende ver 1-EuroMilhoes, 2-TotoBola, 3-Sair ")
    if oppcao == 1:
        print "-------EuroMilhões------"        
        numeros = range(1, 51)
        estrelas = range(1, 10)
        while len(numeros) > 5:
            numeros.pop(numeros.index(random.choice(numeros)))
            numeros.sort()
        while len(estrelas) > 2:
            estrelas.pop(estrelas.index(random.choice(estrelas)))
            estrelas.sort()
        print 'Chave:', numeros, 'Estrelas:', estrelas
    elif oppcao == 2:
        l=["1","x","2"]
        random.shuffle(l)
        print "-------TOTOBOLA-------"
        a=13
        for x in range(13):
            print"Jogo %d: %s %s"%(x+1,random.choice(l),lista.pop(random.randint(0,a-1))
            a+=-1
        for jogo in copia:
            print jogo
   else:
        oppcao = raw_input("Deseja Visualizar mais chaves (s/n) ? ")
        if oppcao == "n" or oppcao == "N":
            break;
print "Fim do Progrma"

Share this post


Link to post
Share on other sites
AlexPnt

ok ,penso que é desta.

O erro é que falta um parênteses na linha anterior para acabar :wallbash:(lol)

print"Jogo %d: %s %s"%(x+1,random.choice(l),lista.pop(random.randint(0,a-1)))#Coloquei aqui mais um parenteses

olha experimenta agora e diz qualquer coisa :)


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
Mica

Pois eu tive a contar isso e tudo ^^ Mas enfim.. Basicamente contei mas esquecia me de fechar sempre o primeiro.. ^^

Obrigado pela ajuda ; )

ahhhh agora percebo XD Ainda á pouco andava um parêntesis perdido por ali e eu apaguei XD Pensei que tivesse clicado sem querer na tecla, mas afinal ele fazia falta :)

Share this post


Link to post
Share on other sites
Mica

Ora agora estou a implementar o seguinte código, para invés de ele dar me os números aleatórios, eu vou escreve-los

    elif oppcao ==4: #Opção 4 da minha estrutura
        lista_num = [] # iniciação da lista vazia para numeros e estrelas.
        lista_estre = []

        jogar = input ("Que sorteio pretende jogar? 1-EuroMilhoes, 2-Totobola")
        if jogar ==1:
                        
            lista_num.append(input("digite o 1º valor ")) #Pedir as 5 chaves
            lista_num.append(input("digite o 2º valor "))
            lista_num.append(input("digite o 3º valor "))
            lista_num.append(input("digite o 4º valor "))
            lista_num.append(input("digite o 5º valor "))
            lista_num.sort() #ordenar as chaves
            print "As suas 5 chaves são:", lista_num #mostrar
            lista_estre.append(input("Digite a sua 1º estrela "))
            lista_estre.append(input("Digite a sua 2º estrela "))
            lista_estre.sort()
            print "Chave:", lista_num, "Estrelas", lista_estre
   

pronto até aqui tudo bem, eu agora queria era que me explicassem que condição devo fazer para por exemplo eu no euro milhoes não posso introduzir numeros >50, queria uma condição para que quando o utilizador introduzisse algum numero >50 ele mostra "Introduza um numero dentro da escala " qualquer coisa assim, e voltasse a pedir para introduzir um novo numero, creio que terei de fazer isso dentro de um while true certo?

Share this post


Link to post
Share on other sites
AlexPnt

Podes fazer isso de uma maneira mais consistente

Em vez de andares a percorrer todos os casos, crias um ciclo que faça tudo o que tu queres de uma só vez  e depois crias uma decisão pelo meio só para verificar os limites dos valores, por exemplo:

lista_num = [] # iniciação da lista vazia para numeros e estrelas.
lista_estre = []

jogar = input ("Que sorteio pretende jogar? 1-EuroMilhoes, 2-Totobola")

if jogar ==1:
            x=0
            for i in range(5):
                        pergunta=input("Digite o "+str(x+1)+"º valor=")
                        if pergunta<0 or pergunta>50:
                                    print "Os valores tem que estar entre 0 e 50"
                                    lista_num.append(pergunta)
                        else:
                                    x+=1
                                    lista_num.append(pergunta) #Pedir as 5 chaves
            lista_num.sort() #ordenar as chaves
            print "As suas 5 chaves são:", lista_num #mostrar
            x=0
            for i in range(2):
                        pergunta=input("Digite a sua"+str(x+1)+"º estrela=")
                        if pergunta<0 or pergunta>9:
                                    print "Os valores tem que estar entre 0 e 9"
                                    lista_estre.append(pergunta)
                        else:
                                    x+=1
                                    lista_estre.append(pergunta) #Pedir as 2 estrelas
            
            lista_estre.sort()
            print "Chave:", lista_num, "Estrelas", lista_estre

Boa sorte :)


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
Mica

Esta muito melhor estruturado e fácil de compreender

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

As suas 5 chaves são: [51, 51, 51, 51, 51]

Digite a sua1º estrela=

Mas tem esta ambiguidade... 

Ele aqui continua a armazenar o número..

A menos que eu depois diga no fim "A sua chave é inválida.." Pode sempre ser uma solução ^^

Share this post


Link to post
Share on other sites
hmiguel

Esta muito melhor estruturado e fácil de compreender

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

Digite o 1º valor=51

Os valores tem que estar entre 1 e 50

As suas 5 chaves são: [51, 51, 51, 51, 51]

Digite a sua1º estrela=

Mas tem esta ambiguidade... 

Ele aqui continua a armazenar o número..

A menos que eu depois diga no fim "A sua chave é inválida.." Pode sempre ser uma solução ^^

Substitui o ciclo "for" por um "while" (enquanto o numero de elementos da lista for menor 5) e deves retirar o append do numero à lista quando este é menor que 0 e maior que 50.

E colocar uma condição para verificar se o numero já existe na lista.


"Homem que é Homem não usa Java!"

Share this post


Link to post
Share on other sites
Mica

if jogar ==1:
            x=0
            while x < 5:
                        pergunta=input("Digite o "+str(x+1)+"º valor=")
                        if pergunta<1 or pergunta>50:
                                    print "Os valores tem que estar entre 1 e 50"
                                   # lista_num.append(pergunta) Tabulei, mas é para apagar ^^ 
                        else:
                                    x+=1
                                    lista_num.append(pergunta) 
                                    lista_num.sort() #ordenar as chaves
            print "As suas 5 chaves são:", lista_num #mostrar chaves
            x=0

Pronto assim já dá ^^ Obrigado :)

Share this post


Link to post
Share on other sites
Mica

Esta estrutura mostra me da seguinte forma:

        elif jogar ==2:
            a=0
            while a < 13:
                        pergunta=raw_input("Digite a sua oposta " +str(a+1)+ "º 1 x 2 ")
    
                        while (pergunta!="1" and pergunta!="2" and pergunta!="x"):
                            print "A aposta não é válida"
                            pergunta=raw_input("Digite a sua oposta " +str(a+1)+ "º 1 x 2 ")

                        a+=1
                        lista_num.append(pergunta)
                       
                                 
            print "A sua aposta para o totobola é :", lista_num #mostrar chaves
            a=0

Digite a sua oposta 1º 1 x 2 12

A aposta não é válida

Digite a sua oposta 1º 1 x 2 1

Digite a sua oposta 2º 1 x 2 x

Digite a sua oposta 3º 1 x 2 3

A aposta não é válida

Digite a sua oposta 3º 1 x 2 2

Digite a sua oposta 4º 1 x 2

O que pretendo exactamente é que ele vá buscar á minha base de dados os jogos que coloque desta seguinte forma

Digite a sua aposta para o 1º jogo Benfica x Porto 1 x 2

Digite a sua aposta para o 2º jogo Aves x Braga 1 x 2

O código que tenho da bd é

while True:
    ficheiro = open('teste.txt','r') #Abrir Ficheiro
    lista=ficheiro.readlines()#Ler as linhas do meu ficheiro
    ficheiro.close()#fechar o Ficheiro
    for elem in range(len(lista)):   #Para retirar o /n'
        lista[elem]=lista[elem][:-1] #Para retirar o /n
    copia=lista[:]

Share this post


Link to post
Share on other sites
Mica

Ora agora o que pretendo implementar neste excerto de código seguinte é que ele bloqueie quando os números são repetidos... ou seja se eu introduzir um número 12 na primeira aposta, na segunda se voltar a introduzir ele terá de enviar uma mensagem ao utilizador e voltar a pedir...

x=0
            

            while x < 5:
                        pergunta=input("Digite o "+str(x+1)+"º valor=")
                        if pergunta<1 or pergunta>50: #creio que talvez tenha de ser algo como if pergunta<1 and pergunta >50 and pergunta!=.... aqui é que reside a minha duvida
                                    print "Os valores tem que estar entre 1 e 50"
                                   # if lista.count(x)==0:
                                    #pergunta=input("Digite o "+str(x+1)+"º valor=")    
                                    


                        else:
                                    x+=1
                                    lista_num.append(pergunta) 
                                    lista_num.sort() #ordenar as chaves
            print "As suas 5 chaves são:", lista_num #mostrar chaves
            x=0


Share this post


Link to post
Share on other sites
AlexPnt

Basta acrescentares mais uma verificaçao ( tavas no caminho certo)


if pergunta<1 or pergunta>50 or pergunta in lista_num : # acrescentas a "questão": "o numero que foi dado já esta na lista?"
                                                print "Erro: Os valores tem que estar entre 1 e 50 ou o numero inserido e repetido"


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.