[Python] Duvida em codigo

core2duo

Power Member
Boas,

Estou a criar uma versão da serie de TV e jogo "Quem quer ser milionario".
Comecei a aprender python à cerca de 1 semana e estou a ver se comeco a fazer coisas basicas mas não entendo porque é que no jogo acontecem certas coisas (ver screenshot)..

Código:
print "Quem quer ser milionario"

def outrax():
    outravez = raw_input ("Errado! Jogar outra vez ? (s/n)?")
    if (outravez=='s'):
        pregunta1()
    else:
        print "Obrigado por jogares"
        
def pregunta1():
    print "Qual o apelido de Napoleao?"
    print "a) Bone"
    print "b) Moniz"
    print "c) Bonaparte"
    print "d) Gomes"
    a = raw_input ("Resposta:")

    if (a=='c'):
        print "Correcto!"
        print ""
        pregunta2()
        
    else:
        outrax()

def pregunta2():
    print "Quem ganhou o Euro 2008?"
    print "a) Portugal"
    print "b) Grecia"
    print "c) Turquia"
    print "d) Espanha"
    a = raw_input ("Resposta:")

    if (a=='d'):
        print "Correcto!"
        print ""
        pregunta3()
        
    else:
        outrax()
        
def pregunta3():
    print "Quem e Gregory House na vida real?"
    print "a) John Marker"
    print "b) Hugh Laurie"
    print "c) Jack Hugh"
    print "d) Laurie Hugh"
    a = raw_input ("Resposta:")

    if (a=='b'):
        print "Correcto!"
        print ""
        pregunta4()
        
    else:
        outrax()

def pregunta4():
    print "A que editora pertence o jogo GTA ?"
    print "a) Electronic Arts"
    print "b) Konami"
    print "c) Rockstar"
    print "d) Interactive Games"
    a = raw_input ("Resposta:")

    if (a=='c'):
        print "Correcto!"
        
    else:
        outrax()
            
pregunta1()
pregunta2()
pregunta3()
pregunta4()


cumps,
core2duo
 
Última edição:
Boas, tu no código de cada pergunta, estás a invocar a função da próxima pergunta (de acordo com a resposta do jogador) logo, a única função que tens de invocar ao início é a primeira e não todas como estás a fazer no final do código do programa. Já agora, penso que deverias guardar as perguntas e respostas num ficheiro à parte ao invés de colocá-las hardcoded no programa.
 
Muito estranho sim, está a fazer um ciclo infinito, em python não há nenhuma função tipo return em C e C++?? Se hovesse na tua função outrax():, no final podias metela.
 
Hmm, não é um ciclo infinito. O problema consiste em ele estar a invocar quatro funções ao invés de invocar apenas uma. No final do código ele tem o seguinte:

Código:
pergunta1()
pergunta2()
pergunta3()
pergunta4()

Ao executar pergunta1(), se o jogador responder correctamente, ele vai executar a pergunta2(), que por sua vez pode executar a pergunta3() que finalmente pode executar a última pergunta. Ou seja, a lógica que faz com que se passe para a próxima pergunta, está no código de cada pergunta, sendo que a única função que deveria estar a ser invocada para o programa arrancar é a pergunta1().

Em seguida, a função pergunta2() vai ser invocada, pois está a seguir à pergunta1() no código que coloquei acima. Embora pareça um ciclo infinito, não é.

Tal como disse acima, penso que devias criar um ficheiro à parte para as perguntas (e respectivas respostas), pois quando tiveres 20, 30, 40, 50 ou mais perguntas, o teu código vai-se tornar difícil de manter.
 
Última edição:
Já precebi ... Que estupidez :p

Outra coisa,

se eu faço F5 ele executa o programa no "phython Shell" mas como faço para criar uma GUI simples para este programa ? Já tive a ver o easygui mas nao entendo muito bem como funciona....
 
Última edição:
Hmm, não é um ciclo infinito. O problema consiste em ele estar a invocar quatro funções ao invés de invocar apenas uma. No final do código ele tem o seguinte:

Código:
pergunta1()
pergunta2()
pergunta3()
pergunta4()
Ao executar pergunta1(), se o jogador responder correctamente, ele vai executar a pergunta2(), que por sua vez pode executar a pergunta3() que finalmente pode executar a última pergunta. Ou seja, a lógica que faz com que se passe para a próxima pergunta, está no código de cada pergunta, sendo que a única função que deveria estar a ser invocada para o programa arrancar é a pergunta1().

Em seguida, a função pergunta2() vai ser invocada, pois está a seguir à pergunta1() no código que coloquei acima. Embora pareça um ciclo infinito, não é.

Tal como disse acima, penso que devias criar um ficheiro à parte para as perguntas (e respectivas respostas), pois quando tiveres 20, 30, 40, 50 ou mais perguntas, o teu código vai-se tornar difícil de manter.

Ya pois é, é mesmo preciso o comando tipo o return em C e C++, ou então fazer as perguntas e o testo do quer jogar outra vez e assim de outra maneira.
 
hmm, deixo aqui a minha abordagem à questão proposta que permite randomizar quer a ordem das perguntas, quer a ordem das opções de resposta, o que é util neste género de programas :), além de não estar tão "hard-coded" como a tua

disclaimer: podia ter colocado as perguntas/respostas num ficheiro à parte, mas não o fiz. ainda assim, não é nada por aí além de complicado (podias tão somente fazer um ficheiro com a lista e fazer import ou então um método de leitura de ficheiro linha a linha e posterior construção duma lista...)

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys,random

class milionario():
    
    def __init__(self):
       
       print '########################\nQuem Quer ser Milionario\n########################\n'
       
       self.config() 
    
    def config(self):
        
        ## perguntas = [ [pergunta,op1,op2,op3,opcorrecta],(...)]
        self.perguntas =[ ['Qual o apelido de Napoleao?','Bone','Moniz','Gomes','Bonaparte'],['Quem e Gregory House na vida real?','John Marker','Jack Hugh','Laurie Hugh','Hugh Laurie'],['Quem ganhou o Euro 2008?','Portugal','Alemanha','Turquia','Espanha'],['A que editora pertence o jogo GTA?','Electronic Arts','Konami','Interactive Games','Rockstar'] ]
        
        self.tscore = len(self.perguntas) ## score total = nº de perguntas
        self.score = 0 # score inicial é 0
        
        self.jogo()
    
    def jogo(self):
        
        self.nperguntas = len(self.perguntas) ## quantas perguntas há por responder
        
        if self.nperguntas == 0: ## activo quando não há perguntas por responder == fim do jogo
            
            print 'Fim do Jogo. Fizeste %s em %s pontos possiveis.\n' %(self.score,self.tscore)
            self.exit()
            
        else: ## activo quando existem perguntas por responder, i.e, self.nperguntas != 0
            
            tmp = random.randint(0,self.nperguntas-1) ## escolha duma pergunta ao acaso
            
            ## definir a pergunta e a resposta
            pergunta = self.perguntas[tmp][0]
            resposta = self.perguntas[tmp][4]
            
            ## remover a pergunta da lista, para não interferir com as opções de resposta
            self.perguntas[tmp].pop(0)
            
            ## alterar a ordem das perguntas
            random.shuffle(self.perguntas[tmp])
            
            print '\n' + pergunta ## output da pergunta
            
            ## output das opções, às quais foi "colada" a letra respectiva
            print 'A) ' + self.perguntas[tmp][0] 
            print 'B) ' + self.perguntas[tmp][1]
            print 'C) ' + self.perguntas[tmp][2]
            print 'D) ' + self.perguntas[tmp][3]
            print ''
            
            r = raw_input('Resposta: ').lower() ## o lower() permite que se possa responder A ou a
            
            ## atribuir valores numéricos à resposta, para que sirva de índice na lista para comparação com a resposta correcta
            if r == 'a':
                k = 0
            elif r == 'b':
                k = 1
            elif r == 'c':
                k = 2
            elif r == 'd':
                k = 3
            else: ## caso a resposta não seja a,b,c,d ou seja, não prevista pelo programa
                
                print '\nErro de sintaxe!\n'
                
                self.perguntas[tmp].insert(0,pergunta) ## para repor a pergunta retirada, para que possa voltar a ser utilizada
                self.jogo() ## recomeçar o jogo
            
            if self.perguntas[tmp][k] == resposta: ## comparação da resposta dada com a correcta
                
                self.score = self.score + 1 ## ao score pré-existente, acrescentar 1 ponto
                print '\nCorrecto! :>\n'
            else:
                
                print '\nIncorrecto! :<\n'
        
            self.perguntas.pop(tmp) ## remover a pergunta já feita, para que não volte a aparecer
            self.jogo() ## loop and repeat...
    
    def exit(self):
        
        z = raw_input('Deseja jogar outra vez? (s/n): ').lower()
        
        if z == 's':
            self.config() ## reconfigurar as perguntas para jogar outra vez
        elif z == 'n':
            sys.exit(0) ## sair do jogo
        else: ## error handling
            print '\nErro de Sintaxe!\n'
            self.exit() ## repetir pedido ao utilizador

app = milionario() ## correr o jogo
Em grande medida, grande parte deste código pode ser reutilizado numa GUI. Basicamente precisas de trocar tudo o que diz "print" e "raw_input()" por alguma maneira de output/input de dados por uma interface gráfica. isto é, se estás a aprender, não é assim tão _relevante_ para o raciocínio relativo ao programa pp dito. Além disso, quem não gosta duma boa cli :>
 
Última edição:
vou dar-te um exemplo (sem qualquer rigor de linguagem, só para teres uma ideia)

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys ## estou a importar o modulo sys para poder usar o sys.exit(0) para poder sair do programa

class pessoa(): ## uma classe com um conjunto de funções que definem uma pessoa generica
    
    def __init__(self,nome,sexo): ## esta função é executada quando inicias a classe, é uma função iniciadora
        self.id = nome ## estás a definir uma variável com o nome da pessoa, ao qual podes aceder em toda a classe, isto é, em outras funções da mesma classe, porque puseste self.variavel
        self.genero = sexo
    
    def falar(self,palavra):
        print 'Chamo-me ' + self.id + '.'  ## usas a variavel self.id definida na função iniciadora; se em cima tivesses escrito só id, sem self., daria erro porque não estaria definida a variável
        print 'Gosto de ' + palavra + '.'
    
    def adeus(self):
        print 'Adeus!'
        sys.exit(0)

## vou agora criar uma pessoa específica, uma instância duma pessoa genérica

pedro = pessoa('Pedro Ferreira','masculino')

## podes agora aceder a várias propriedades da pessoa criada

print 'Sou do sexo ' + pedro.genero + '.' ## diz-te o genero do pedro; estás a recorrer à variável género dentro da instância da classe pessoa

pedro.falar('bananas') ## estás a chamar a função falar associada à palavra bananas, que é um argumento da função

pedro.adeus() ## estás a chamar a função adeus, que vai terminar o programa
se analisares o output e brincares com as funções, acho que se percebe muito bem :)
 
Back
Topo