Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #58 da revista programar. Faz já o download aqui!

Mica

Sorteio

Mensagens Recomendadas

Mica    0
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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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... :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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 ^^

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
hmiguel    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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 :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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[:]

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mica    0
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


Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AlexPnt    5
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"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade