• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rolando2424

[Python] Jogo Pedra, Papel, Tesoura

11 mensagens neste tópico

Feito num momento de aborrecimento :D

E sem mais demoras... o script :D


EDIT: Adicionado um contador para um jogo de 3 partidas

#!/usr/bin/env python

# Created by Rolando2424
# Use it, custom it, change it, love it, worship it

import random
import sys

games_left = 3 # When it reaches 0, the winner is declared.
player_pts = 0
computer_pts = 0

def pc():
   """Choose a figure for the computer and return it"""
   computer_choose = random.randint(1,3)
   if computer_choose == 1:
       return "scissors"
   if computer_choose == 2:
       return "paper"
   if computer_choose == 3:
       return "rock"

def player():
   """Asks for input of the player and returns a figure"""
   player_choose = ""
   player_choose = raw_input("""Choose the figure you want
[scissors, paper, rock (exit to quit)]: """)
   if player_choose.lower().strip() == "exit":
       print "Good Bye!"
       sys.exit()

   if player_choose.lower().strip() == "scissors" or \
   player_choose.lower().strip() == "paper" or \
   player_choose.lower().strip() == "rock" or \
   player_choose.lower().strip() == "exit":
       return player_choose

   if player_choose.lower().strip() == "s":
       return "scissors"
   if player_choose.lower().strip() == "p":
       return "paper"
   if player_choose.lower().strip() == "r":
       return "rock"

   else:
       print """You can only choose "scissors", "paper", "rock" or "exit"
       """
       player()


def winner(computer, user):
   """Decides who is the winner"""
   global player_pts
   global computer_pts
   global games_left
   if computer == "rock" and user == "paper":
       print "YOU WIN!"
       player_pts += 1
       games_left -= 1

   elif computer == "rock" and user == "scissors":
       print "Computer Wins!"
       computer_pts += 1
       games_left -= 1

   elif computer == "scissors" and user == "paper":
       print "Computer Wins!"
       computer_pts += 1
       games_left -= 1

   elif computer == "scissors" and user == "rock":
       print "YOU WIN!"
       player_pts += 1
       games_left -= 1

   elif computer == "paper" and user == "rock":
       print "Computer Wins!"
       computer_pts += 1
       games_left -= 1

   elif computer == "paper" and user == "scissors":
       print "YOU WIN!"
       player_pts += 1
       games_left -= 1

   elif computer == user:
       print "It's a draw."

   print # Add a line

def main():
   global player_pts
   global computer_pts
   global games_left
   while games_left > 0:
       choose = player()


       pc_choose = pc()

       if pc_choose == "rock":
           print "Computer choosed rock."
       elif pc_choose == "scissors":
           print "Computer choosed scissors."
       elif pc_choose == "paper":
           print "Computer choosed paper."

       winner(pc_choose, choose)

   if computer_pts > player_pts: # Computer has won
       print "Computer wins the game!"
       play = ""
       while (play.strip().lower() != "y" and \
       play.strip().lower() != "n"):
           print "Want to play another game? [Y/N]",
           play = raw_input()
           play = play.lower().strip() # Just in case...

       if play == "n":
           print "Good Bye!"
           sys.exit()

       if play == "y":
           # Restart the counting variables
           games_left = 3
           player_pts = 0
           computer_pts = 0

           main()

   if player_pts > computer_pts: # Player has won
       print "You win the game!"
       play = ""
       while (play.strip().lower() != "y" and \
       play.strip().lower() != "n"):
           print "Want to play another game? [Y/N]",
           play = raw_input()
           play = play.lower().strip() # Just in case...

       if play == "n":
           print "Good Bye!"
           sys.exit()

       if play == "y":
           # Restar the counting variables
           games_left = 3
           player_pts = 0
           computer_pts = 0

           main()


main()


#!/usr/bin/env python

# Created by Rolando2424
# Use it, custom it, change it, love it, worship it

import random
import sys

def pc():
   """Choose a figure for the computer and return it"""
   computer_choose = random.randint(1,3)
   if computer_choose == 1:
       return "scissors"
   if computer_choose == 2:
       return "paper"
   if computer_choose == 3:
       return "rock"

def player():
   """Asks for input of the player and returns a figure"""
   player_choose = ""
   player_choose = raw_input("""Choose the figure you want
[scissors, paper, rock (exit to quit)]: """)
   if player_choose.lower().strip() == "scissors" or \
   player_choose.lower().strip() == "paper" or \
   player_choose.lower().strip() == "rock" or \
   player_choose.lower().strip() == "exit":
       return player_choose
   else:
       print """You can only choose "scissors", "paper", "rock" or "exit"
       """
       player()


def winner(computer, user):
   """Decides who is the winner"""
   if computer == "rock" and user == "paper":
       print "YOU WIN!"
   elif computer == "rock" and user == "scissors":
       print "Computer Wins!"
   elif computer == "rock" and user == "rock":
       print "It's a draw, try again"
   elif computer == "scissors" and user == "paper":
       print "Computer Wins!"
   elif computer == "scissors" and user == "rock":
       print "YOU WIN!"
   elif computer == "scissors" and user == "scissors":
       print "It's a draw, try again"
   elif computer == "paper" and user == "paper":
       print "It's a draw, try again"
   elif computer == "paper" and user == "rock":
       print "Computer Wins!"
   elif computer == "paper" and user == "scissors":
       print "YOU WIN!"

while True:
   choose = player()

   if choose == "exit":
       print "Good bye."
       sys.exit()

   pc_choose = pc()

   if pc_choose == "rock":
       print "Computer choosed rock."
   elif pc_choose == "scissors":
       print "Computer choosed scissors."
   elif pc_choose == "paper":
       print "Computer choosed paper."

   winner(pc_choose, choose)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Representa papel, papel e tesouro por um número, de acordo com a ordem de superiodade. Depois basta fazeres uma comparação entre números para decidir quem ganhou, em vez de teres tantos ifs. :)

E mais vale usares um try ... except quando testas se o input é válido, em vez de chamares novamente a função.

Keep up!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Man, no procedimento que verifica o vencedor, podias por algo do tipo:

if computer == user:
print "It's a draw, try again"
    if computer == "rock" and user == "paper":
        print "YOU WIN!"
    elif computer == "rock" and user == "scissors":
        print "Computer Wins!"
   elif computer == "scissors" and user == "paper":
        print "Computer Wins!"
    elif computer == "scissors" and user == "rock":
        print "YOU WIN!"
    elif computer == "paper" and user == "rock":
        print "Computer Wins!"
    elif computer == "paper" and user == "scissors":
        print "YOU WIN!"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Representa papel, papel e tesouro por um número, de acordo com a ordem de superiodade. Depois basta fazeres uma comparação entre números para decidir quem ganhou, em vez de teres tantos ifs. :)

Pedra, papel e tesoura têem a mesma ordemd e superioridade, não dá para fazer assim... Mas uma alternativa aos ifs era representar cada objecto por um número (não interessa a ordem) e pôr o número do user e o número randomizado numa lista e:

1º - Ver se os números são iguais - empate;

2º - Se não forem, verificar se a lista está contida numa lista de listas que representa a condição derrota e noutra lista de listas que representa a condição de vitória.

Ex: (não sei se é bem assim em python)

#pedra = 1, papel = 2, tesoura = 3
(...)
if computer == user:
      print "It's a draw, try again"
else:
      lista = [computer, user]
      lista_derrota = [ [1,3], [2,1], [3,2] ]
      lista_vitoria = [ [1,2], [2,3], [3,1] ]
      if lista in lista_derrota:
            print "Computer Wins!"
      elif lista in lista_vitoria:
            print "YOU WIN!"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se bem que se não está na lista_derrota só pode estar na lista vitória portanto pode-se eliminar essa parte. pegando no código do pcaldeira:

#pedra = 1, papel = 2, tesoura = 3
(...)
if computer == user:
      print "It's a draw, try again"
else:
      lista = [computer, user]
      lista_derrota = [ [1,3], [2,1], [3,2] ]
      if lista in lista_derrota:
            print "Computer Wins!"
      else:
            print "YOU WIN!"

indo mais além com a sintaxe poder-se-á compactar mais isto, da seguinte forma:

lista = [computer, user]
lista_derrota = [ [1,3], [2,1], [3,2] ]
result = ("It's a draw, try again",("Computer Wins!", "YOU WIN!")[lista in lista_derrota])[computer==user]

nunca programei em python por isso não sei se isto é possível ou não, mas ao procurar o operador ternário no google devolveu-me esta sintaxe por isso suponho que a agregação da sintaxe seja igual às outras linguagens

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas respotas ;)

Tenho aqui uma nova versão do programa, que armaneza as pontuações num jogo de 3 partidas :D

(Ainda não o optimizei, por isso o código está a confusão que está ^_^ )

E sem mais demoras o script.

#!/usr/bin/env python

# Created by Rolando2424
# Use it, custom it, change it, love it, worship it

import random
import sys

games_left = 3 # When it reaches 0, the winner is declared.
player_pts = 0
computer_pts = 0

def pc():
    """Choose a figure for the computer and return it"""
    computer_choose = random.randint(1,3)
    if computer_choose == 1:
        return "scissors"
    if computer_choose == 2:
        return "paper"
    if computer_choose == 3:
        return "rock"

def player():
    """Asks for input of the player and returns a figure"""
    player_choose = ""
    player_choose = raw_input("""Choose the figure you want
[scissors, paper, rock (exit to quit)]: """)
    if player_choose.lower().strip() == "exit":
        print "Good Bye!"
        sys.exit()
    
    if player_choose.lower().strip() == "scissors" or \
    player_choose.lower().strip() == "paper" or \
    player_choose.lower().strip() == "rock" or \
    player_choose.lower().strip() == "exit":
        return player_choose

    if player_choose.lower().strip() == "s":
        return "scissors"
    if player_choose.lower().strip() == "p":
        return "paper"
    if player_choose.lower().strip() == "r":
        return "rock"

    else:
        print """You can only choose "scissors", "paper", "rock" or "exit"
        """
        player()


def winner(computer, user):
    """Decides who is the winner"""
    global player_pts
    global computer_pts
    global games_left
    if computer == "rock" and user == "paper":
        print "YOU WIN!"
        player_pts += 1
        games_left -= 1
    
    elif computer == "rock" and user == "scissors":
        print "Computer Wins!"
        computer_pts += 1
        games_left -= 1
    
    elif computer == "scissors" and user == "paper":
        print "Computer Wins!"
        computer_pts += 1
        games_left -= 1
    
    elif computer == "scissors" and user == "rock":
        print "YOU WIN!"
        player_pts += 1
        games_left -= 1
    
    elif computer == "paper" and user == "rock":
        print "Computer Wins!"
        computer_pts += 1
        games_left -= 1
    
    elif computer == "paper" and user == "scissors":
        print "YOU WIN!"
        player_pts += 1
        games_left -= 1
    
    elif computer == user:
        print "It's a draw."

    print # Add a line

def main():
    global player_pts
    global computer_pts
    global games_left
    while games_left > 0:
        choose = player()
    

        pc_choose = pc()

        if pc_choose == "rock":
            print "Computer choosed rock."
        elif pc_choose == "scissors":
            print "Computer choosed scissors."
        elif pc_choose == "paper":
            print "Computer choosed paper."

        winner(pc_choose, choose)
   
    if computer_pts > player_pts: # Computer has won
        print "Computer WINS!"
        play = ""
        while (play.strip().lower() != "y" and \
        play.strip().lower() != "n"):
            print "Want to play another game? [Y/N]",
            play = raw_input()
            play = play.lower().strip() # Just in case...
    
        if play == "n":
            print "Good Bye!"
            sys.exit()
        
        if play == "y":
            # Restart the counting variables
            games_left = 3
            player_pts = 0
            computer_pts = 0
            
            main()
            
    if player_pts > computer_pts: # Player has won
        print "You WIN!"
        play = ""
        while (play.strip().lower() != "y" and \
        play.strip().lower() != "n"):
            print "Want to play another game? [Y/N]",
            play = raw_input()
            play = play.lower().strip() # Just in case...
        
        if play == "n":
            print "Good Bye!"
            sys.exit()
    
        if play == "y":
            # Restar the counting variables
            games_left = 3
            player_pts = 0
            computer_pts = 0
            
            main()


main()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e se arranjasses maneira de a linguagem saber que papel > pedra, pedra > tesoura, tesoura > papel.....

Em c++ criavas classes e podias fazer overload dos operadores, por exemplo.... não estou a ver bem outra solução, mas de certeza que existe maneira de definires isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e se arranjasses maneira de a linguagem saber que papel > pedra, pedra > tesoura, tesoura > papel.....

Em c++ criavas classes e podias fazer overload dos operadores, por exemplo.... não estou a ver bem outra solução, mas de certeza que existe maneira de definires isso...

OK, o jogo é para 2 jogadores.

Se usarmos uma representação inteira mais inteligente para papel, pdera, e tesoura, podemos assegurar, na soma das duas jogadas, qual vence.

1 -pedra

3 -papel

5 -tesoura

caso:

  soma == 4, papel ganha;

  soma == 6, pedra ganha;

  soma == 8, tesoura ganha;

  default empate;

não vejo mais simples....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi! Alguém me pode dizer o que é o

global

faz? Thank You ;)

Isso serve para dentro de uma função usares variáveis globais, ou seja, variáveis definidas na "raiz" do programa.
0

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