Скальные бумажные ножницы в Python

Я пытаюсь написать программу Python, и мне сложно получить мой результат. Я написал это как функцию возврата значения, и каждый раз, когда я запускаю программу, кажется, что она пропускает шаг, на котором он извлекает оценку, если я не включаю оператор else, который он автоматически перескажет оператор else. Я приложу полный код ниже. Большое спасибо за любую помощь, я благодарен! Это также моя первая публикация на этом форуме. Прошу прощения, если я что-то прикручу.

#constants Rock = 1 Paper = 2 Scissors = 3 #Define the main function def main(): #set control loop keep_going = 'Y' #set counter to zero computer_wins = 0 player_wins = 0 tie_score = 0 #call display message display_message() while keep_going == 'y' or keep_going == 'Y': play_game() #prompt user to keep going keep_going = input('would you like to play again? (Y for Yes): ') print('The computer won', computer_wins, 'times') print('The player won', player_wins, 'times') print('There were', tie_score, 'tie scores') def play_game(): #get random input computer = get_random() #get the players input play = get_play() #validate input if play == '1' or play == '2' or play == '3': play == True else: play == False print('Error: Invalid Entry') play = input('Please enter 1 for Rock, 2 for Paper, or 3 for Scissors: ') if play == computer: print('Tie Score, Please try again') tie_score += 1 else: get_score(computer, play) print('The computer chose:', computer) print('The player chose: ', play) #define display message def display_message(): print('Welcome to Rock Paper Scissors, a game of chance to see who will') print('outsmart the other. This game is Man VS Computer.') print('The program will select a random integer and then ask you for an integer') print('1 for Rock 2 for paper or 3 for Scissors. The program will then tell') print('you who won the game.') print('GOOD LUCK!') print print def get_random(): import random #generate random int computer = random.randint(1, 3) return computer def get_play(): #prompt user to enter an integer 1, 2, or 3 play = input('Select 1 for Rock, 2 for Paper, or 3 for Scissors: ') return play def get_score(computer, play): if computer == 1 and play == 2: score = 'player wins' print('Paper covers Rock, Player Wins') #player wins player_wins += 1 elif computer == 1 and play == 3: score = 'computer wins' print('Scissors cut Paper, Computer Wins') #computer wins computer_wins += 1 elif computer == 2 and play == 1: score = 'computer wins' print('Paper covers Rock, Computer Wins') #computer wins computer_wins += 1 elif computer == 2 and play == 3: score = 'player wins' print('Scissors cut Paper, Player Wins') #player wins player_wins += 1 elif computer == 3 and play == 1: score = 'player wins' print('Rock smashes Scissors, Player Wins') #player wins player_wins += 1 elif computer == 3 and play == 2: score = 'computer wins' print('Scissors cut Paper, Computer Wins') #computer wins computer_wins += 1 #call main function main() 

8 Solutions collect form web for “Скальные бумажные ножницы в Python”

Там так много неправильно, трудно понять, с чего начать (но не отчаивайтесь) …

Прежде всего, это выглядит (в основном из-за использования input и raw_input и ваших parens с вашими заявлениями на печать) вы используете Python 3, который уже собирается ограничить объем помощи. Большинство людей все еще используют Python 2.6 или 2.7. Но с этим с дороги …

Основные оставшиеся вопросы, касающиеся вашего вопроса:

Во-первых: вы используете строки для ввода проигрывателя (например, «1», «2», «3») и номера для выбора компьютера (например, 1, 2, 3). Поэтому вам нужно сравнить их как таковые. Другими словами, вместо:

 if computer == 1 and play == 2: 

Вам нужно будет сказать:

 if computer == 1 and play == '2': 

Во-вторых: вы пытаетесь ссылаться на переменные одной функции в другой, и это не сработает. Если вы хотите, чтобы ваши переменные computer_wins и т. Д. Были глобальными, вам необходимо инициализировать их в глобальной области, например, сразу после объявления «#constants» и до того, как вы войдете в main . Затем в любой функции, которая их использует, вы должны сказать, например, global computer_wins чтобы указать, что они глобальные, а не локальные.

После того, как вы устраните эти проблемы, он должен работать немного лучше, но вам все равно придется делать много очистки и продолжать работать над этим!

Держитесь за это, и скоро это будет для вас естественным.

Я ответил на ваш вопрос отдельно, но для забавы здесь есть небольшая работа Rock, Paper, Scissors, на которую можно посмотреть. Это для Python 2.x и, вероятно, не будет работать в Python 3, но это может быть полезно для вас или кого-то в будущем в поисках этого.

 # "Rock, Paper, Scissors" demo for Python 2.x # by Dan Kamins import random ROCK = 1 PAPER = 2 SCISSORS = 3 NAMES = { ROCK: 'Rock', PAPER: 'Paper', SCISSORS: 'Scissors' } WHAT_BEATS_WHAT = { ROCK: SCISSORS, PAPER: ROCK, SCISSORS: PAPER } WIN_ACTIONS = { ROCK: 'crushes', PAPER: 'smothers', SCISSORS: 'cuts' } score_player = 0 score_computer = 0 score_ties = 0 def main(): intro() while main_loop(): pass summary() def intro(): print "Welcome to Rock, Paper, Scissors!" def main_loop(): player = get_player_input() computer = random.randint(1, 3) check_result(player, computer) return ask_play_again() def check_result(player, computer): global score_player, score_computer, score_ties if player == computer: print "Tie! Computer also chose {0}.".format(NAMES[computer]) score_ties += 1 else: if WHAT_BEATS_WHAT[player] == computer: print "Your massive {0} {1} the computer's {2}!".format( NAMES[player], WIN_ACTIONS[player], NAMES[computer]) score_player += 1 else: print "The computer's {0} {1} your pathetic {2}!".format( NAMES[computer], WIN_ACTIONS[computer], NAMES[player]) score_computer += 1 def ask_play_again(): again = raw_input("Enter Y to play again: ") return again in ('y', 'Y') def get_player_input(): while True: print player = raw_input("Enter 1 for Rock 2 for paper or 3 for Scissors: ") try: player = int(player) if player in (1,2,3): return player except ValueError: pass print "Please enter a number from 1 to 3." def summary(): global score_player, score_computer, score_ties print "Thanks for playing." print "Player won: ", score_player print "Computer won: ", score_computer print "Ties: ", score_ties if __name__ == '__main__': main() 

Несколько быстрых заметок от быстрого снятия кода:

В get_score() вы можете добавить предложение else для обработки любых связей, которые произойдут, и вам не нужно будет явно проверять его в play_game()

Переместите import random перемещение в верхнюю часть файла. Обычно импорт всегда находится в верхней части файла. Кроме того, нет необходимости повторно импортировать каждый раз, когда вы хотите получить случайное число.

Не уверен, что это опечатка, потому что play кажется, всегда содержит целое число, но у вас есть play == True и play == False внутри play_game() . Если вы хотите, чтобы play содержала True или False , вам нужно использовать один знак равенства, например play = True . Но это не имеет смысла, потому что вы сравниваете play с computer как будто они целые.

Кроме того, что вы пытаетесь выполнить с помощью переменной score в get_score() ?

Ах, если вы заставили метод get_score() вернуть что-то, чтобы вы знали, кто выиграл матч, это было бы полезно. Вы не можете получить доступ к computer_wins или player_wins внутри get_score() потому что они были определены внутри main() . Простой способ сделать это – вернуть int из get_score() . это скорее способ обработки C-стиля (возврат -1/0/1). что-то вроде (псевдо-код):

 def get_score(): score = 0 if computer wins: score = -1 elif player wins: score = 1 return score winner = get_score() if winner == 0: print 'tie game' elif winner == 1 print 'the player won' else: print 'the computer won' 

Вот еще один вариант, который работает как в Python 2.x, так и 3.x:

 try: input = raw_input except NameError: input = input # py3k import random import sys import textwrap from collections import namedtuple ROCK, PAPER, SCISSORS = ROCK_PAPER_SCISSORS = range(1, 4) NAME = dict(zip(ROCK_PAPER_SCISSORS, "Rock Paper Scissors".split())) Score = namedtuple('Score', 'win verb') GAME_MATRIX = { # who wins and who does what (PAPER, ROCK): Score(win=True, verb='covers'), (SCISSORS, PAPER): Score(win=True, verb='cut'), (ROCK, SCISSORS): Score(win=True, verb='smashes'), } GAME_MATRIX.update(dict(((second, first), Score(not win, verb)) for (first,second), (win,verb) in GAME_MATRIX.items())) def main(): # keep scores: how many times computer, player win and number of ties scores = dict(zip("computer player tie".split(), [0]*3)) display_welcome_message() # set control loop keep_going = 'Y' while keep_going.upper() == 'Y': try: play_game(scores) except Exception as e: print("Error: %s" % (e,)) sys.exit(1) # prompt player to keep going keep_going = input('Would you like to play again? (Y for Yes): ') print('\nThe computer won {computer} times\n' 'The player won {player} times\n' 'There were {tie} tie scores'.format(**scores)) def play_game(scores): # get players choices for this round computer_choice = random.choice(ROCK_PAPER_SCISSORS) player_choice = get_player_input() # print choices for player, choice in [('computer', computer_choice), ('player', player_choice)]: print('The {0} chose: {1} ({2})'.format(player, NAME[choice], choice)) # update scores; print who wins if player_choice == computer_choice: scores['tie'] += 1 print('Tie Score, Please try again') else: score = GAME_MATRIX[computer_choice, player_choice] if score.win: # computer wins scores['computer'] += 1 template = '{first} {verb} {second}, Computer wins' else: # player wins scores['player'] += 1 template = '{second} {verb} {first}, Player wins' print(template.format(first=NAME[computer_choice], second=NAME[player_choice], verb=score.verb)) def display_welcome_message(): print(textwrap.fill(textwrap.dedent(""" Welcome to Rock Paper Scissors, a game of chance to see who will outsmart the other. This game is Man VS Computer. The program will select a random integer and then ask you to input %s for Rock %s for Paper or %s for Scissors. The program will then tell you who won the game. GOOD LUCK! """ % tuple(ROCK_PAPER_SCISSORS)))) def get_player_input(ntries=10): for _ in range(ntries): try: choice = int(input('\nSelect %s for Rock, %s for Paper, or ' '%s for Scissors: ' % tuple(ROCK_PAPER_SCISSORS))) except ValueError: pass else: if choice in ROCK_PAPER_SCISSORS: return choice # success print('Error: your choice must be one of: %s' % ( ', '.join(map(str, ROCK_PAPER_SCISSORS)))) raise RuntimeError('failed to get player choice in %d tries' % ntries) if __name__=="__main__": main() 

Этот код может быть хорошей ссылкой для вас. 🙂
Удачи !
Обратите внимание, что это код Py2.x

 # Author: Niklas Rosenstein # Created: 2011/10/23 import sys import random PAPER = 0 ROCK = 1 SCISSOR = 2 WIN = 10 LOSS = 11 TIE = 12 TABLE = { PAPER: 'Paper', ROCK: 'Rock', SCISSOR: 'Scissor', } if 'expand TABLE': # just for overvieability # expands the TABLE conveniently tableExpand = [ (PAPER,('paper', 'p', '0')), (ROCK, ('rock', 'r', 'stone', '1')), (SCISSOR, ('scissor', 's', '2')) ] exp = None key = None for exp in tableExpand: for key in exp[1]: TABLE[key] = exp[0] del tableExpand, exp, key class Game(object): wins = 0 losses = 0 ties = 0 def evaluateInput(self, inp): # evaluate the input # raises ValueError if input is invalid # lowercase the string inp = inp.strip() inp = inp.lower() # comparison table try: return TABLE[inp] except KeyError: raise ValueError, 'Input is invalid.' def choose(self, choice): # make a choice and compare it with # the computers choice # check if the choice is correct if choice not in [ROCK, PAPER, SCISSOR]: raise ValueError, 'Expected Id of either ROCK, PAPER or SCISSOR' # generate a choice for the computer com = random.choice([ROCK, PAPER, SCISSOR]) result = choice - com if result == 0: self.ties += 1 return TIE, com elif result < 0: self.wins += 1 return WIN, com else: self.losses += 1 return LOSS, com TEXT_CHOOSE = 'Choose (or "quit" to quit): ' TEXT_PLAYER_CHOOSE = "You've choosen: " TEXT_COMPUTER_CHOOSE = 'The computer choosed: ' TEXT_CHOICE_INVALID = 'You choice is invalid.\n' TEXT_WIN = "You've won this match." TEXT_LOSS = "You've lost this match." TEXT_TIE = "This match was tie." TEXT_GOODBYE = "Thanks for playing." TEXT_WELCOME = "Welcome to Rock-Paper-Scissor !\n" \ "This game is all about guessing. Try to choose the\n" \ "thing that beats the computers choice. Thereby, the\n" \ "following rules are importan:\n" \ " Paper beats Rock.\n" \ " Rock beats Scissor.\n" \ " Scissor beats Paper.\n" \ "\n" \ "Valid inputs are:\n\n" \ " | for Paper: | p | paper | - | 0 |\n" \ " | for Rock: | r | rock | stone | 1 |\n" \ " | for Scissor: | s | scissor | - | 2 |\n" \ " | To quit the game: | q | quit | - | - |\n" \ "\n" \ "Much fun whishes you: Niklas Rosenstein (2011)\n" \ + ("-" * 50) + "\n" def printScores(g): print "Scores:" print " Wins: %s" % g.wins print " Losses: %s" % g.losses print " Ties: %s" % g.ties def main(): g = Game() # play the game ;-) print TEXT_WELCOME while True: inp = raw_input(TEXT_CHOOSE) if inp.lower() in ('q', 'quit'): break try: inp = g.evaluateInput(inp) except ValueError: print TEXT_CHOICE_INVALID continue t, com = g.choose(inp) inp = TABLE[inp] com = TABLE[com] print TEXT_PLAYER_CHOOSE, inp print TEXT_COMPUTER_CHOOSE, com print if t == WIN: print inp, "beats", com + ".", print TEXT_WIN elif t == LOSS: print com, "beats", inp + ".", print TEXT_LOSS else: print inp, "euqals", com + ".", print TEXT_TIE print printScores(g) print "-" * 50 print print TEXT_GOODBYE printScores(g) print print "Press any key to exit." sys.stdin.read(1) main() 

Вот еще один способ сделать это:

 import random; print ('Game of chance 1=Rock,2=Paper,3=Scissor'); print ('Type 9 to exit'); while 1: z=random.randint(1,3); a=int(input('1=Rock,2=Paper,3=Scissor:--->')); if a==z: print ('Tie!!!'); if a==1 and z==2: print ('Rock covers paper So You Win!!!'); if a==2 and z==3: print ('Scissor cuts paper so you loose :('); if a==2 and z==1: print ('Rock covers paper so you loose :('); if a==3 and z==2: print ('Scissor cuts paper So You Win!!!'); if a==9: break print ('Thanks for playing the game') 

Другой способ сделать Rock, Paper, Scissors, но без цикла …

 import random Rock = '1' Paper = '2' Scissors = '3' print('Welcome to Rock, Paper Scissors! The game of all kids to decide on something. \nIn this game you will have to beat the computer once. \n(Psst if it\'sa draw the start the program again! ;D)\nSo how to play. Well, it\'s simple. Pick 1 for Rock, 2 for Paper and 3 for Scissors. \nSo Rock beats Scissors. Scissors cuts Paper and Paper covers Rock. Got it Lets play') player=int(input('Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: ')) if player<1 or player>3: player=int(input('Invalid number. Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: ')) if player<1 or player>3: print('Well, now you can\'t play this game because you are mucking around. Next time DON\'T!') else: computer=random.randint(1, 3) print(player,computer) print('Remember Rock = 1, Paper = 2 and Scissors = 3') if player==1 and computer==1 or player==2 and computer==2 or player==3 and computer==3: print('It\'sa draw. =l Restart the game if you want to.') if player==1 and computer==2 or player==2 and computer==3 or player==3 and computer==1: print('Computer wins! You lose. Sorry. =(') if player==1 and computer==3 or player==2 and computer==1 or player==3 and computer==2: print('You have won. Well done. =D') 

Если это какая-то помощь.

Еще один способ: добавление Ящерицы и Спок

 import random def winner(p1, p2): actors = ['Paper', 'Scissors', 'Spock', 'Lizard', 'Rock'] verbs = {'RoLi':'crushes', 'RoSc':'breaks', 'LiSp':'poisons', 'LiPa':'eats', 'SpSc':'smashes', 'SpRo':'vaporizes', 'ScPa':'cut', 'ScLi':'decapitate', 'PaRo':'covers', 'PaSp':'disproves'} p1, p2 = actors.index(p1), actors.index(p2) winner, looser = [(p1, p2), (p1, p2), (p2, p1), (p1, p2), (p2, p1)][p1 - p2] return ' '.join([actors[winner], verbs.get(actors[winner][0:2] + actors[looser][0:2], 'ties'), actors[looser]]) more = True while more: z=random.randint(0,4); a=int(input('1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->'))-1; if a==z: print 'Tie\n'; else: try: print winner(a,z) + '\n' except IndexError: more = False print ('Thanks for playing the game') 

Вывод:

 1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->1 Rock crushes Lizard 1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->2 Paper covers Rock 1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->3 Scissors tie Scissors 1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->4 Lizard poisons Spock 
  • Почему свойства должны быть атрибутами класса в Python?
  • Понимание распределения памяти для больших целых чисел в Python
  • Невозможно вызвать метод родителя в понимании списка в инициализаторе ребенка, но работает явный цикл
  • win32com.client.Dispatch + Cherrypy = CoInitialize не был вызван
  • Есть ли стандартный способ убедиться, что скрипт python будет интерпретироваться python2, а не python3?
  • Краткое руководство по использованию gnuplot с python?
  • Сортировка по нескольким клавишам с использованием разных порядков
  • Максимальная глубина рекурсии превышена, но только при использовании декоратора
  • Ошибка синтаксиса при следующем руководстве Pygame / Python на youtube
  • Anaconda3 2.4 с ошибкой установки python 3.5 (запись процедуры не найдена, Windows 10)
  • Как получить имя файла и lineno атрибута SyntaxError
  • Python - лучший язык программирования в мире.