Jogo de perguntas e respostas (Python)

8,217 views
Skip to first unread message

dam.jonny

unread,
Jan 14, 2014, 5:59:40 PM1/14/14
to python...@googlegroups.com
Boa noite,

    Sou iniciante no Python estudo poucas horas diárias a uns 5 meses e hoje me encontro com uma duvida que vem me tirando do serio a uma semana. Iniciei o programa com o código básico onde ele imprimia as perguntas e passava para a próxima até chegar ao final e finalizar a execução e com o tempo eu fui melhorando e vi o modulo random e achei bem interessante, então tentei criar um .txt com as perguntas e criar marcadores porem tive problemas na horas das respostas pois não achei uma forma de indicar a resposta correta visto que eu não sabia qual questão seria a primeira escolhida e após umas pesquisas vi que eu poderia utilizar o JSON com ele consegui criar corretamente o programa, porem o código foi feito por um amigo logo não obtive aprendizado algum visto que o código seria uma copia e resolvi não  da um passo muito grande e voltei ao principio. O código está assim:

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



def pergunta1():
    print (''' A pontuação numa prova de 25 questões é a seguinte: +4 por questão respondida corretamente e –1 por questão respondida de forma errada.
    Para que um aluno receba nota correspondente a um número positivo, deverá acertar no míni
    a) 3 questões
    b) 4 questões
    c) 5 questões
    d) 6 questões
    e) 7 questões
    '''
)
    resp = raw_input ("Escola a alternativa correta: ")
    if resp == ("d"):
        print ("Você acertou")

    else:
        print (" você errou")
       
def pergunta2():
    print ('''02) João vendeu dois terrenos por R$ 12.000,00 cada um. Um deles deu 20% de lucro em relação ao custo.
    O outro, 20 % de prejuízo em relação ao custo. Na venda de ambos, João:
    a) ganhou R$ 1.000,00
    b) perdeu R$ 1.000,00
    c) não perdeu nem ganhou
    d) perdeu R$ 400,00
    e) ganhou R$ 400,00'''
)
    resp = raw_input ("Escolha a alternativa correta: ")
    if resp == ("b"):
        print ("Você acertou")
       
    else:
        print (" você errou")
       
def pergunta3():
    print ('''03) O número de litros de água necessários para se reduzir 9 litros de loção de barba contendo 50% de álcool
    para uma loção contendo 30% de álcool é:
    a) 3
    b) 4
    c) 5
    d) 6
    e) 7'''
)
    resp = raw_input ("Escolha a alternativa correta: ")
    if resp == ("d"):
        print ("Você acertou")
       
    else:
        print (" você errou")

def pergunta4():
    print ('''4)A coleta seletiva porta a porta está implantada nos 150 bairros de Porto Alegre.
    Sessenta toneladas de lixo seco são distribuídas diariamente entre 8 unidades de reciclagem,
    criadas a partir da organização de determinados segmentos da população excluídos da economia formal.
    São hoje 456 famílias envolvidas no processo. Se todas as unidades de reciclagem recebessem a mesma massa de lixo seco e tivessem o mesmo número de famílias de trabalhadores,
    a soma do número de quilogramas de lixo seco com o número de famílias recicladoras em cada unidade seria decomposto em fatores primos da seguinte maneira:
    a) 23 x 53
    b) 2 x 7 x 11
    c) 22 x 3 x 54
    d) 2 x 3 x 119
    e) 3 x 11 x 229'''
)
    resp = raw_input ("Escolha a alternativa correta: ")
    if resp == ("e"):
        print ("Você acertou")
       
    else:
        print (" você errou")
       
def pergunta5():
    print ('''05) Quando se aumentam de 30% dois lados opostos de um quadrado e se diminuem em 30 % os outros dois lados,
    a área do quadrado:
    a) aumenta 9%
    b) aumenta 15%
    c) não se altera
    d) diminui 15%
    e) diminui 9%'''
)
    resp = raw_input ("Escolha a alternativa correta: ")
    if resp == ("e"):
        print ("Você acertou")
       
    else:
        print (" você errou")

    pergunta1()
    pergunta2()
    pergunta3()
    pergunta4()
    pergunta5()

Gostaria de um empurrão para transferir as perguntas para um .txt, criar marcadores e imprimir as perguntas de forma aleatória para que eu possa dar continuidade em meus estudos sem deixar furo algum.

OBS: Toda critica e toda ajuda é bem-vinda e se alguém tiver comentários a fazer sobre o código acima de como eu poderia simplifica-lo ou melhorar (apenas formas para iniciantes não pretendo utilizar banco de dados SQL por enquanto) estou aberto a todo tipo de ajuda.

Filipe Cifali

unread,
Jan 16, 2014, 3:14:25 PM1/16/14
to python...@googlegroups.com
Um modo de fazer bem simples que acho que resolve seu problema:

Bote todas as perguntas em txts com numeracao (seu def pergunta1() vira 1.txt)

Faça uma lista com o número de perguntas, um for para iterar sobre a lista removendo um valor aleatorio da lista (usando o random com range do tamanho da lista atual) e leia o arquivo para exibir na tela.

Basicamente você vai precisar de for, choice(vem do random), pop, print e file para fazer.


2014/1/14 dam.jonny <dam....@hotmail.com>
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/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ê está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
[ ]'s

Filipe Cifali Stangler

dam.jonny

unread,
Jan 16, 2014, 8:08:04 PM1/16/14
to python...@googlegroups.com
EU at[e tentei colocar tudo em um txt e gerar as perguntas usando random e usei marcador para isso porem eu não consegui achar uma forma de saber qual resposta certa para cada questão ai voltei a colocar tudo novamente no arquivo python so que o codigo ficaria grande demais e seria difícil de edita-lo se ultrapassasse mais de 50 perguntas.

Filipe Cifali

unread,
Jan 17, 2014, 6:20:09 AM1/17/14
to python...@googlegroups.com
Separe as perguntas e respostas por arquivo-: p1.txt = pergunta 1 txt, r1.txt = resposta 1 txt, ou de outro modo que você quiser separar / nomear.

A questão é não por as perguntas no código e sim ler um diretório com as perguntas. 


2014/1/16 dam.jonny <dam....@hotmail.com>

dam.jonny

unread,
Jan 17, 2014, 8:03:36 AM1/17/14
to python...@googlegroups.com
Entendi meu condigo estava assim:

import random


file = open('/home/jonny/perg.txt', 'r')
texto = file.read()
separador = '*'
perguntas = texto.split(separador)
print random.choice(perguntas)


criei um laço e as perguntas estavam imprimindo normal porem não encontrei uma forma de definir a resposta para a pergunta correta.

Alexandre Souza

unread,
Jan 17, 2014, 8:06:50 AM1/17/14
to python...@googlegroups.com
Dam,

Você já pensou em tentar usar sqlite? Não é muito complicado e talvez (IMHO) fique mais simples... você cadastra a pergunta, relaciona o ID dela com uma resposta e pronto... não precisa instalar, já que o Python tem suas maravilhosas baterias... =]

[ ]'s

dam.jonny

unread,
Jan 17, 2014, 9:32:31 AM1/17/14
to python...@googlegroups.com
    Eu até estou ciente mas não seria melhor, para um iniciante, utilizar primeiro de todas as funções básicas e quando dominar seguir em frente para o banco de dados? Pois eu cheguei a utilizar SQL e Tkinter para criar alguns programas básicos mais não evolui muito quando estamos falando de Python. Eu queria dominar bem uma boa parte das funções para depois entra na parte do Django. Fiz um curso de python basico do treina web e tenho o livro Use a Cabeça e aprendi bastante coisas com os dois só que o Python nos da muitas possibilidades e antes de avançar para banco de dados eu queria está em um nível intermediário
.

Alexandre Souza

unread,
Jan 17, 2014, 10:30:24 AM1/17/14
to python...@googlegroups.com
Dam,

Eu também sou iniciante na linguagem, mas para os meus estudos eu costumo adotar o seguinte: 1 maneira para alcançar o resultado e 1 maneira para alcançar um bom resultado. IMHO, se eu fosse usar o jogo como prova de conceito e/ou estudos, aproveitaria para aprender algo que ficasse , novamente IMHO, melhor para um jogo.

Mas o importante é o seu progresso; se dessa forma você consegue estudar e prefere, isso é o que vale.

Obs.: Como iniciante, as minhas ideias e opiniões não são necessariamente as melhores/apropriadas. =]
Bons estudos!

[ ]'s

dam.jonny

unread,
Jan 17, 2014, 10:43:13 AM1/17/14
to python...@googlegroups.com
Sim eu também sigo praticamente a mesma ideia porem se eu procurar a solução mais facil que seria o sql eu estaria perdendo um bom aprendizado da utilização de toda sintaxe do python mesmo que não seja a melhor solução. Já que também é iniciante conhece algum material (pode ser em inglês) que não seja o Learn Python, Use a cabeça, Python para desenvolvedores (conhece algum que seja bem completo e que não finalize usando o TKinter ou Django?)?

Alexandre Souza

unread,
Jan 17, 2014, 10:47:20 AM1/17/14
to python...@googlegroups.com
Você conhece o Python p/ Zumbis[1]?
Tem uma linha boa e te dá uma boa visão, IMHO.

[1] - http://pingmind.com/python-para-zumbis/

[ ]'s

dam.jonny

unread,
Jan 17, 2014, 10:52:56 AM1/17/14
to python...@googlegroups.com
Ok, eu até conhecia mais nunca parei para ver o que tinha lá. Mais obrigado pela ajuda. E em relação ao código consegue propor algo que não sejá um banco de dados ou txt ?

Vinicius Assef

unread,
Jan 17, 2014, 10:55:02 AM1/17/14
to python...@googlegroups.com
2014/1/17 dam.jonny <dam....@hotmail.com>:
> E em relação ao código consegue propor algo que não sejá um
> banco de dados ou txt ?

Tenta o coopy: https://github.com/felipecruz/coopy

Silvio Giunge Silva

unread,
Jan 17, 2014, 11:01:08 AM1/17/14
to python...@googlegroups.com
Velho, esse negocio de aprender funções principais antes de usar um banco de dados é a mesma coisa de falar que não vai usar um framwork pra web porque quer aprender fazer na mão.

IMHO total perda de tempo.

Usar sqlite não vai atrapalhar sua linha de aprendizado e sim aumentar o leque de opções.

Se você não usar um arquivo de texto ou uma db você vai ter que criar inumeras variaveis na mão para executar o que você que, e ao fazer isso, ao invéz de aumentar seu aprendizado, vai estagna-lo.

Com o tempo, o basico das funções não serão suficiente para atender suas necessidades e você vai começar a estudar como elas funcionam e desenvolver suas próprias, isso acontece naturalmente.


Date: Fri, 17 Jan 2014 07:52:56 -0800
From: dam....@hotmail.com
To: python...@googlegroups.com
Subject: Re: [python-brasil] Jogo de perguntas e respostas (Python)

dam.jonny

unread,
Jan 17, 2014, 12:02:29 PM1/17/14
to python...@googlegroups.com
Até faz sentido mais um profissional ruim é aquele que só faz por outros exemplos pois não domina bem o básico o que adianta eu partir para programas pulando etapas e aprendendo apenas aquilo que preciso usar (até por que não saberia as possibilidades sem ter um conhecimento intermediário da linguagem). Isso seria o mesmo que comprar um livro e pular as partes do que você acha que sabe sem nem mesmo ler. Mais respeito sua opinião e obrigado.

Rafael Oda

unread,
Jan 17, 2014, 3:56:35 PM1/17/14
to python...@googlegroups.com
Cara, não sei se concordo com essa sua comparação, mas enfim, vamos lá.

Primeiramente, eu refatoraria esse código criando uma class Question com os atributos que você precisa (e.g. enunciado, correct_answer, answers).
Depois, eu criaria uma fixture que carrega os dados (que podem vir de um conjunto de txt's, algo em um banco ou whatever) que você colocou diretamente em funções para instâncias da classe recém-criada.
Então, crie um script que carrega a fixture e depois imprime um prompt que imprime a pergunta e diz se a pessoa acertou ou errou.

O seu código está estruturado, independentemente de onde você coloca os dados em si e isso faz com que ele seja difícil de ler, debugar, melhorar, etc. Minha sugestão visa deixá-lo um pouco mais desacoplado.
Desse modo, você nem precisa saber quantos objetos tem.

Abs,




2014/1/17 dam.jonny <dam....@hotmail.com>

dam.jonny

unread,
Jan 17, 2014, 6:40:44 PM1/17/14
to python...@googlegroups.com
Obrigado pela ajuda. Vou analisar sua proposta e ve se consigo desenvolver algo melhor.

Danilo J. S. Bellini

unread,
Jan 18, 2014, 7:32:24 AM1/18/14
to python-brasil
@dam.jonny
Antes de mais nada, coloque um
from __future__ import unicode_literals
no início do código. Isso evitará constrangimentos. A segunda linha do código que você forneceu inicialmente era "# -*- coding: utf-8 -*-", a qual indica (para o Python 2) que o fonte está em UTF-8 (encoding padrão no Python 3), e esse import faz uma coisa complementar no Python 2: faz com que as strings no código sejam vistas como objetos unicode por padrão, i.e., como se tivessem um prefixo "u" em cada string. Um exemplo no IPython, lembrando que underscore ("_") referencia o último "Out":


In [1]: "áéíóúçÑ ひらがな"
Out[1]: '\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba\xc3\xa7\xc3\x91 \xe3\x81\xb2\xe3\x82\x89\xe3\x81\x8c\xe3\x81\xaa'

In [2]: len(_)
Out[2]: 27

In [3]: u"áéíóúçÑ ひらがな"
Out[3]: u'\xe1\xe9\xed\xf3\xfa\xe7\xd1 \u3072\u3089\u304c\u306a'

In [4]: len(_)
Out[4]: 12

In [5]: from __future__ import unicode_literals

In [6]: "áéíóúçÑ ひらがな"
Out[6]: u'\xe1\xe9\xed\xf3\xfa\xe7\xd1 \u3072\u3089\u304c\u306a'

In [7]: len(_)
Out[7]: 12


Você pode começar a resolver o problema com algo assim:

questoes = [
("texto que enuncia a questão", "resposta certa", ["resposta errada 1", "resposta errada 2", ...]),
("texto que enuncia a questão", "resposta certa", ["resposta errada 1", "resposta errada 2", ...]),
]

Isto é uma lista de triplas cujo terceiro elemento é uma lista de respostas erradas. Com essa lista, você pode usar choice, shuffle e sample para escolher uma questão, uma parte da lista de respostas erradas, e decidir uma "posição" para a resposta (no seu exemplo, letras de "a" e "e").

Um próximo passo pode ser a geração dessa lista "questoes" a partir de uma string, por exemplo:

txt = """

Texto questão 1

###

Resposta q1

###

Resposta errada 1

###

Resposta errada 2
...

######

Texto questão 2

###

Resposta q2

###

Resposta errada q2-1
...

"""

Isto é uma string de múltiplas linhas. Há separadores que deixam bem claro o que está acontecendo. A quantidade de questões e de respostas erradas por questão não precisa ser determinada a priori. Você pode tentar somente converter isso em uma lista de tuplas (texto, resposta_certa, lista_de_respostas_erradas), o que permite usar o código feito anteriormente para tal lista. Isso pode ser feito diretamente com os métodos das strings:
Um possível passo seguinte poderia ser utilizar isto no lugar de tuplas:

Um passo razoável depois disso tudo pronto é carregar a string "txt" de um arquivo "questoes.txt". Para isso, recomendo que use o "codecs.open" ao invés do "open",
Ela irá se comportar de maneira parecida com o open, devolvendo um file-like object
mas o método read do resultado do codecs.open já efetua a leitura em unicode.

Não deixe o arquivo sem "fechar" (e repare que "file" existe). Troque

file = open('/home/jonny/perg.txt', 'r')

texto = file.read()


por:

f = open('/home/jonny/perg.txt', 'r')

try:

texto = f.read()

finally:
f.close()

ou então:

with open('/home/jonny/perg.txt', 'r') as f:

texto = f.read()


Mais detalhes sobre o with:

Além disso, o nome do arquivo pode ser relativo ao utilizado para chamar o script, não precisa ser absoluto.

Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)
Reply all
Reply to author
Forward
0 new messages