1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Python] Duvida em codigo

Discussão em 'Programação' iniciada por core2duo, 5 de Julho de 2008. (Respostas: 9; Visualizações: 1679)

  1. core2duo

    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()
    
    [​IMG]

    cumps,
    core2duo
     
    Última edição: 6 de Julho de 2008
  2. AliFromCairo

    AliFromCairo Power Member

    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.
     
  3. Peter V5

    Peter V5 Folding Member

    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.
     
  4. AliFromCairo

    AliFromCairo Power Member

    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: 5 de Julho de 2008
  5. core2duo

    core2duo Power Member

    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: 5 de Julho de 2008
  6. Peter V5

    Peter V5 Folding Member

    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.
     
  7. firedrops

    firedrops Power Member

    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: 5 de Julho de 2008
  8. core2duo

    core2duo Power Member

    Pois mas esse código que usas nao precebo muito bem :s

    a parte dos "self" e do sys ...
     
  9. firedrops

    firedrops Power Member

    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 :)
     
  10. lolikapuxa

    lolikapuxa Power Member

    diz-se perceber e nao preceber.
    tal como pergunta e não pregunta.
     

Partilhar esta Página