2016-07-28 2 views
1

Я создаю игру Rock, Paper, Scissors для класса. в качестве части игры мне нужно отобразить меню меню оружия для выбора пользователем. Затем компьютер будет случайно выбирать оружие из списка. Проблема, с которой я столкнулся (я считаю), состоит в том, что элементы списка варьируются от [0,2], где перечислены пункты меню [1,3]. Я искал вокруг часами, но я не понимаю сложных вещей, которые я читал в Интернете, поэтому я не уверен, как их применять.Сравнение ввода пользователя с случайно выбранным элементом списка - Python

# random integer 
from random import randint 

# list for weapon 
WEAPON = ["Rock", "Paper", "Scissors"] 

# one player mode 
def onePlayer(): 
scoreP = 0 
scoreC = 0 
again = "" 
player = False 

print("---------------------------------------------") 
print("\n\tPlayer VS Computer") 

while player == False: 
    print("Weapons:") 
    print("1. Rock") 
    print("2. Paper") 
    print("3. Scissors") 
    print("4. Quit") 

    player = input("\nSelect your weapon: ") 
    if player == "quit" or player == "q" or player == "4": 
     player = True 
     main() 
    else: 
     try: 
      player = int(player) 
      if player == 1: 
       player = WEAPON[0] 
      elif player == 2: 
       player = WEAPON[1] 
      elif player == 3: 
       player = WEAPON[2] 
     except: 
      print("please enter a number 1 through 4\n") 

    computer = WEAPON[randint(0,2)] 

    if player == computer: 
     print(player," vs ",computer) 
     print("It's a tie!\n") 
     print("Player:",scoreP,"\nComputer:",scoreC) 
     print("") 
    elif player == 1: 
     # computer == paper 
     if computer == 1: 
      print(player," vs ",computer) 
      print("Paper covers rock! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Rock smashes scissors. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    elif player == 2: 
     if computer == 2: 
      print(player," vs ",computer) 
      print("Scissors cut paper! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Paper covers rock. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    elif player == 3: 
     if computer == 0: 
      print(player," vs ",computer) 
      print("Rock smashes scissors! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Scissors cut paper. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    #else: 
    # print("Please select a valid play option\n") 
    player = False  

Пожалуйста, не обращайте внимания на утверждения печати внутри операторов if/else. Я понимаю, что их нужно будет изменить. Моя основная проблема - логика сравнения пользовательского ввода с выбором случайного списка компьютеров.

+0

Что не так с кодом? Не могли бы вы сделать его более кратким? (В чем вопрос?) – Jerrybibo

ответ

1

В операторах if кажется, что вы сравниваете переменную computer, которая является строкой, целому числу. Вы назначаете computer = WEAPON[randint(0,2)], поэтому компьютер является одним из следующих: ["Rock", "Paper", "Scissors"]. Однако в ваших операциях if вы говорите: if computer == 1:, чтобы сравнить его с человеком (ваша персональная переменная одинакова, вы присваиваете ей строку, прежде чем сравнивать ее с целыми числами).

Вы просто должны убедиться, что вы сравниваете яблоки с яблоками

3

Вы должны быть осторожны с содержимым ваших переменных:

# this is storing a string  
computer = WEAPON[randint(0,2)] 

# this expects an integer 
elif player == 1: 
     # computer == paper 
     if computer == 1: 

Это было бы корнем некоторые из проблем, вы видите.

Кроме того, при кодировании старайтесь использовать значащие имена переменных и избегать повторного использования их для нескольких целей: в этом случае две новые переменные, такие как player_weapon и computer_weapon (вместо повторного использования плеера и компьютера), вероятно, ваша ошибка. Не ленитесь при объявлении переменных! ;)

1

Сравнить струны, а не к числам, как этот

if player == computer: 
     print(player," vs ",computer) 
     print("It's a tie!\n") 
     print("Player:",scoreP,"\nComputer:",scoreC) 
     print("") 
    elif player == 'Rock': 
     # computer == paper 
     if computer == 'Paper': 
      print(player," vs ",computer) 
      print("Paper covers rock! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Rock smashes scissors. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    elif player == 'Paper': 
     if computer == 'Scissors': 
      print(player," vs ",computer) 
      print("Scissors cut paper! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Paper covers rock. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    elif player == 'Scissors': 
     if computer == 'Rock': 
      print(player," vs ",computer) 
      print("Rock smashes scissors! You lose!\n") 
      scoreC = scoreC + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
     else: 
      print("Scissors cut paper. You win!\n") 
      scoreP = scoreP + 1 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 
    #else: 
    # print("Please select a valid play option\n") 
    player = False 
1

Я конденсируется большинство коды, реализовав небольшую dict_map. Это можно конденсировать дальше, но зачем беспокоиться.

# random integer 
from random import randint 

# list for weapon 
WEAPON = ["Rock", "Paper", "Scissors"] 
MAPP = {"Rock":{"Win":'Scissors', "Loss":"Paper", "Adj":"Smashes"}, 
     "Paper":{"Win":"Rock", "Loss":"Scissors", "Adj":"Covers"}, 
     "Scissors":{"Win":"Paper", "Loss":"Rock", "Adj":'Cuts'}} 

def have_won(player, computer): 
    #determines if the players choice has beaten the computers 
    if MAPP[player]["Win"] == computer: 
     adj = MAPP[player]['Adj'] 
     return True, ' '.join([player, adj, computer]) 
    else: 
     adj = MAPP[computer]['Adj'] 
     return False, ' '.join([computer, adj, player]) 

# one player mode 
def onePlayer(): 
    scoreP = 0 
    scoreC = 0 
    again = "" 
    player = False 

    print("---------------------------------------------") 
    print("\n\tPlayer VS Computer") 

    while player == False: 
     print("Weapons:") 
     print("1. Rock") 
     print("2. Paper") 
     print("3. Scissors") 
     print("4. Quit") 

     player = input("\nSelect your weapon: ") 
     if player == "quit" or player == "q" or player == "4": 
      player = True 
     else: 
      try: 
       player = int(player) 
       if player == 1: 
        player = WEAPON[0] 
       elif player == 2: 
        player = WEAPON[1] 
       elif player == 3: 
        player = WEAPON[2] 
      except: 
       print("please enter a number 1 through 4\n") 

     computer = WEAPON[randint(0,2)] 
     print player, computer 
     outcome = have_won(player, computer) 
     if player == computer: 
      print(player," vs ",computer) 
      print("It's a tie!\n") 
      print("Player:",scoreP,"\nComputer:",scoreC) 
      print("") 

     elif outcome[0] == True: 
      print(outcome[1]+"! You Win!!") 
      scoreP += 1 
     elif outcome[0] == False: 
      print(outcome[1]+"! You Lose!!") 
      scoreC += 1 
     #else: 
     # print("Please select a valid play option\n") 
     print("Player:",scoreP,"\nComputer:",scoreC) 
     player = False 
onePlayer() 
+0

Это более продвинутый, чем то, что я узнал в своем классе, но это в основном то, что я думал в своей голове. Большое спасибо! На данный момент я немного смущен, потому что мне нужно предоставить способ проверки ввода пользователя, но я не уверен, какая область кода обрабатывает вход и как. – sedkil

+0

В настоящее время проверки почти не проверяются. Это можно просто добавить. – TheLazyScripter