jogo craps

904 views
Skip to first unread message

Herbert Parentes Fortes Neto

unread,
Dec 15, 2014, 4:21:21 AM12/15/14
to python-brasil
olá,

tenho estudado python fazendo os exercícos de python.org.br. o site
está fora do ar, mas consegui um pdf com a lista de exercícios.

esse está na parte de funções. resolvi sem elas primeiro e depois iria
usá-las. mas como tem os 'break', deixei assim mesmo. não parece
precisar de funções.

como não tem um resultado exato ou algo assim, gostaria que alguém
verificasse. o enunciado:

5.10 '''Jogo de Craps.''' Faça um programa de implemente um jogo de Craps. O jogador
lança um par de dados, obtendo um valor entre 2 e 12. Se, na primeira jogada,
você tirar 7 ou 11, você um "natural" e ganhou. Se você tirar 2, 3 ou 12 na
primeira jogada, isto é chamado de "craps" e você perdeu. Se, na primeira jogada,
você fez um 4, 5, 6, 8, 9 ou 10,este é seu "Ponto". Seu objetivo agora é continuar
jogando os dados até tirar este número novamente. Você perde, no entanto, se
tirar um 7 antes de tirar este Ponto novamente.

como resolvi:

import random
import time


print ("começando a jogar")
time.sleep(3)
point = 0
rodada = 1
while True:
print ("rodada {0}". format(rodada))
sorte = random.randrange(2,13)
print ("num sorteado: {0}" . format(sorte))
if point:
if sorte == 7 :
print ("you loose")
break

if sorte == 7 or sorte == 11:
if rodada == 1:
print (sorte)
print ("you are natural, you won on {0} round!" . format(rodada))
break
elif sorte ==2 or sorte == 3 or sorte == 12:
if rodada == 1:
print ("na rodada {0}" . format(rodada), end=' ')
print ("craps, you looser")
break
else:
if sorte == point:
print ("you won!")
break
if point == 0:
point = sorte
print (point)
print ("this is your point")

rodada += 1

print ("jogando novamente")
time.sleep(3)


print ()



abraço,
--
Herbert Parentes Fortes Neto (hpfn)

Herbert Parentes Fortes Neto

unread,
Dec 15, 2014, 4:21:38 AM12/15/14
to python-brasil
refiz o exercício com funções. como é pedido:

import random
import time

def luck(x_s,y_r):
'''o mais sortudo.'''
if x_s == 7 or x_s == 11:
if y_r == 1:
print (x_s)
print ("you are natural, you won on {0} round!" . format(y_r))
quit(0)
#break

def bad_luck(a_s, a_r):
'''o mais azarado.'''
if a_s ==2 or a_s == 3 or a_s == 12:
if a_r == 1:
print ("na rodada {0}" . format(a_r), end=' ')
print ("craps, you looser")
quit(0)
#break

def point_n(b_s, b_p):
''' marca o point number.'''
if b_s == b_p:
print ("you won!")
quit(0)
#break
if b_p == 0:
b_p = b_s
print (b_p)
print ("this is your point")
return b_p

print ("começando a jogar")
time.sleep(3)
point = 0
rodada = 1

while True:
print ("rodada {0}". format(rodada))
sorte = random.randrange(2,13)
print ("num sorteado: {0}" . format(sorte))
if point:
if sorte == 7 :
print ("you loose")
break
luck (sorte, rodada)

bad_luck (sorte, rodada)

if point == 0:
point = point_n (sorte, point)
else:
point_n(sorte, point)

rodada += 1

print ("jogando novamente")
time.sleep(3)


George Mendonça

unread,
Apr 23, 2016, 10:02:43 PM4/23/16
to Python Brasil, hp...@ig.com.br
Muito bacana Herbert, vou dar uma olhada.

George Mendonça

unread,
Apr 24, 2016, 5:22:58 PM4/24/16
to python...@googlegroups.com, hp...@ig.com.br
A princípio tem um erro na segunda função. Boa noite.

____________________________________________________________
 George Mendonça - "Todo conceito é compreendido quando amado."
 Análise de sistemas, gestão, entusiasta de software livre e professor
 Coordenador TI Faculdade JK Santa Maria-DF www.jk.edu.br
____________________________________________________________
 www.georgemendonca.com.br  - Twitter - Facebook
____________________________________________________________

--
--
------------------------------------
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ê recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/kTk-cETYuhU/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Filipe Cifali

unread,
Apr 24, 2016, 6:58:39 PM4/24/16
to python...@googlegroups.com, hp...@ig.com.br
Ola Herbert, o site esta fora do ar para voce? Pode me enviar um print + traceroute para o site? 

Valeu! 


Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Para mais opções, acesse https://groups.google.com/d/optout.



--
[ ]'s

Filipe Cifali Stangler

Rodrigo Baron

unread,
Apr 25, 2016, 7:52:39 AM4/25/16
to Python Brasil, hp...@ig.com.br
Acho que ficaria melhor se você separar o caso "natural" e "craps" do caso "point". Quero dizer, você só continua jogando (loop) se você fizer "point", sendo assim desnecessário verificar a jogada para "natural" e "craps" todas as vezes. 

obs.: sobre nome de parâmetro de função, def bad_luck(a_s, a_r) não tem muito sentido porque os valores de a_s e a_r vem de outro escopo, agora a_s = get_sorte() dentro de uma função tem algum sentido porque esta no mesmo escopo.

Herbert Fortes

unread,
Apr 27, 2016, 10:21:12 AM4/27/16
to Python Brasil
Olá,


On Monday, April 25, 2016 at 8:52:39 AM UTC-3, Rodrigo Baron wrote:
Acho que ficaria melhor se você separar o caso "natural" e "craps" do caso "point". Quero dizer, você só continua jogando (loop) se você fizer "point", sendo assim desnecessário verificar a jogada para "natural" e "craps" todas as vezes. 

 Aqui acho que entendi.
 

obs.: sobre nome de parâmetro de função, def bad_luck(a_s, a_r) não tem muito sentido porque os valores de a_s e a_r vem de outro escopo, agora a_s = get_sorte() dentro de uma função tem algum sentido porque esta no mesmo escopo.

 Li isso[0] sobre escopo.

[0] - http://www.programeempython.com.br/blog/escopo-de-variaveis-em-python/
  

 Repetindo o exercício
 
5.10 '''Jogo de Craps.''' Faça um programa de implemente um jogo de Craps. O jogador
lança um par de dados, obtendo um valor entre 2 e 12. Se, na primeira jogada,
você tirar 7 ou 11, você um "natural" e ganhou. Se você tirar 2, 3 ou 12 na
primeira jogada, isto é chamado de "craps" e você perdeu. Se, na primeira jogada,
você fez um 4, 5, 6, 8, 9 ou 10,este é seu "Ponto". Seu objetivo agora é continuar
jogando os dados até tirar este número novamente. Você perde, no entanto, se
tirar um 7 antes de tirar este Ponto novamente.


 Novo código:
# python 3

import random
import time

def ate():
    ''' msg final '''
    print ("\n até a próxima\n")

def luck(x_s):

    '''o mais sortudo.'''
    if x_s == 7 or x_s == 11:
        print (x_s)
        print ("you are natural, you won on first round!")
        ate()
        quit(0)

def bad_luck(a_s):
    '''o mais azarado.'''
    if a_s == 2 or a_s == 3 or a_s == 12:
        print (" {0} sorteado - craps na primeira rodada, you looser" . format(a_s))
        ate()
        quit(0)


def point_n(b_s, b_p):
    ''' marca o point number.'''
    if b_s == b_p:
        print ("you won!")
        return 0

    if b_p == 0:
        b_p = b_s
        print ("{0} - this is your point\n" .format(b_p))
        time.sleep(2)
        return b_p

    print ("jogando novamente\n")
    time.sleep(2)

    return b_p

 def first_try ():
    '''primeira conferida'''
    s_a = anuncio(0, "inicialmente 7 ou 11")

    luck (s_a)
    bad_luck (s_a)

    return point_n (s_a, 0)

def anuncio(a, x):
    '''informação para cada interação do loop.'''
    print ("rodada {0}". format(a))
    s = random.randrange(2,13)
    print ("num sorteado: {0} - esperado {1}" . format(s,x))

    return s

print ("começando a jogar\n")
time.sleep(2)
rodada = 1
point = first_try();

while point:
    sorte = anuncio(rodada, point)

    # interrompe loop aqui
    if sorte == 7 :
        print ("you loose, 7 foi sorteado.")
        break

    # interrompe loop aqui
    # quando retornar 0
    point = point_n(sorte, point)

    rodada += 1

ate()



Menos 'if'. E mais organizado, acredito.



abraço,
Herbert


Herbert Fortes

unread,
Apr 27, 2016, 10:21:15 AM4/27/16
to Python Brasil, hp...@ig.com.br
Olá,

Obrigado a todos por recuperar o email de tempos atrás.

Voltei a assinar o grupo. E estou retomando os estudos.



abraços,
Herbert

Herbert Fortes

unread,
Apr 28, 2016, 2:33:34 AM4/28/16
to python...@googlegroups.com
Olá,
Aqui pode melhorar:

> def point_n(b_s, b_p):
-''' marca o point number.'''
+''' atualiza point number.'''
> if b_s == b_p:
> print ("you won!")
> return 0
-if b_p == 0:
- b_p = b_s
- print ("{0} - this is your point\n" .format(b_p))
- time.sleep(2)
- return b_p
-
-print ("jogando novamente\n")
-time.sleep(2)
-
-return b_p
+else:
+ print ("jogando novamente\n")
+ time.sleep(2)
+ return b_p

Aqui também:

> def first_try ():
> '''primeira conferida'''
> s_a = anuncio(0, "inicialmente 7 ou 11")
>
> luck (s_a)
> bad_luck (s_a)
>
-return point_n (s_a, 0)
+return s_a

>
> def anuncio(a, x):
> '''informação para cada interação do loop.'''
> print ("rodada {0}". format(a))
> s = random.randrange(2,13)
> print ("num sorteado: {0} - esperado {1}" . format(s,x))
>
> return s
>
> print ("começando a jogar\n")
> time.sleep(2)
> rodada = 1
> point = first_try();
>
> while point:
> sorte = anuncio(rodada, point)
>
> # interrompe loop aqui
> if sorte == 7 :
> print ("you loose, 7 foi sorteado.")
> break
>
> # interrompe loop aqui
> # quando retornar 0
> point = point_n(sorte, point)
>
> rodada += 1
>
> ate()
>



Rodrigo Baron

unread,
Apr 28, 2016, 9:17:57 AM4/28/16
to Python Brasil
Use aquele conceito de escopo quando você precisa entender oque a função faz (pois este deve ser o seu limite de visão para conseguir entender), o ideal é que a função tenha apenas um objetivo/responsabilidade e que outra pessoa consiga entender o mais rápido possível (de preferencia apenas lendo uma chamada da função ou olhando a sua assinatura). Por exemplo:

def calcula(n1, n2, op):
...

da uma pista do que a função faz, mas você não tem certeza então vai ter que ler o código inteiro dela. Outro exemplo:

def soma(a, b):
...

fácil de entender né? Mesmo que não entenda uma implementação diferente:

def soma(*numeros):
  return reduce(lambda a,b: a+b, numeros)

você sabe que a função soma os números que você passa como parâmetro e retorna o resultado. Agora a sua função:

def point_n(b_s, b_p):

''' atualiza point number.''' 
  if b_s == b_p:
    print ("you won!")
    return 0
  else: 

    print ("jogando novamente\n") 
    time.sleep(2) 
    return b_p

Oque ela faz? 
* Ela decide se você ganhou ou não? 
* Ela realmente "atualiza point number"? 
* point_n significa "point number" então ela gera um "point number"?

se você olha para a chamada da função...

point = point_n(sorte, point)

a principio da pra entender que ela gera um "point number", então você percebe que a variável point é passada como parâmetro e é modificada com o resultado, então você conclui que o objetivo da função é atualizar o point number.

porem se você olhar novamente para o código da pra perceber que sua maior responsabilidade é decidir se você ganhou ou não que é o fator crucial para a aplicação.

Consegue perceber como uma função simples pode tornar a aplicação complexa? Mas inicialmente isso é normal...
 
Att,

Herbert Fortes

unread,
Apr 28, 2016, 2:00:32 PM4/28/16
to python...@googlegroups.com
Olá,

> point = point_n(sorte, point)
>
>
> a principio da pra entender que ela gera um "point number", então você
> percebe que a variável point é passada como parâmetro e é modificada com o
> resultado, então você conclui que o objetivo da função é atualizar o point
> number.
>
> porem se você olhar novamente para o código da pra perceber que sua maior
> responsabilidade é decidir se você ganhou ou não que é o fator crucial para
> a aplicação.
>
> Consegue perceber como uma função simples pode tornar a aplicação complexa?
> Mas inicialmente isso é normal...
>

Os exemplos calcula() - soma() foram muito bons.

O comentário na função precisa de ajustes.

E acabei lembrando de um poeta que disse que código bem
escrito precisa de poucos comentários.



Obrigado,
Herbert
> --
> --
> ------------------------------------
> 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 inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
> Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages