简体   繁体   English

一种更有效的Python编写代码方式

[英]A more python efficient way to write a code

I have to write a program game similar to rock paper scissors, but with five options instead of three. 我必须编写一个类似于石头剪刀布的程序游戏,但要有五个选择而不是三个选择。 I was able to write the code with a system of ifs, but I would like to know if there is a better way to write the code. 我能够使用ifs系统编写代码,但是我想知道是否有更好的方法编写代码。

Game rules: 游戏规则:

As you can see, there are a total of 5 options (X → Y means X wins over Y): 如您所见,共有5个选项(X→Y表示X胜过Y):

  1. Rock → Lizard & Scissors 岩石→蜥蜴和剪刀
  2. Paper → Rock & Spock 纸→摇滚
  3. Scissors → Paper & Lizard 剪刀→纸和蜥蜴
  4. Lizard → Spock & Paper 蜥蜴→Spock和纸
  5. Spock → Scissors & Rock Spock→剪刀和摇滚

Main Code: 主要代码:

import random
from ex2_rpsls_helper import get_selection

def rpsls_game():
  com_score = 0
  player_score = 0
  draws = 0
  while(abs(com_score - player_score) < 2):
    print("    Please enter your selection: 1 (Rock), 2 (Paper), 3 (Scissors), 4 (Lizard) or 5 (Spock): ")
    selection = int(input())
    # a while loop to make sure input i between 0<x<6
    while(selection <= 0 or selection > 5):
        print(    "Please select one of the available options.\n")
        selection = int(input())
    com_selection = random.randint(1,5)
    print("    Player has selected: "+get_selection(selection)+".")
    print("    Computer has selected: "+get_selection(com_selection)+".")

    # A set of else and elseif to determin who is the winner
    if(give_winner(selection, com_selection)):
        print("    The winner for this round is: Player\n")
        player_score += 1
    elif(give_winner(com_selection,selection)):
        print("    The winner for this round is: Computer\n")
        com_score += 1
    else:
        print("    This round was drawn\n")
        draws += 1

    print("Game score: Player "+str(player_score)+", Computer "+str(com_score)+", draws "+str(draws))
  if(player_score > com_score):
    return 1
  else:
    return -1

The IFS system: IFS系统:

def give_winner(first_selection, second_selection):
    if(first_selection is 1):
        if(second_selection is 3 or second_selection is 4):
            return True
    elif(first_selection is 2):
        if(second_selection is 1 or second_selection is 5):
            return True
    elif(first_selection is 3):
        if(second_selection is 2 or second_selection is 4):
            return True
    elif(first_selection is 4):
        if(second_selection is 2 or  second_selection is 5):
            return True
    elif(first_selection is 5):
        if(second_selection is 3 or second_selection is 1):
            return True
    return False

Any ideas? 有任何想法吗?

Instead of a complicated series of if statements, you could have an list or dictionary of (first, second) tuples, 您可以拥有一个(first, second)元组的列表或字典,而不是一系列复杂的if语句,

a = [(1,3), (1,4), (2,1), (2,5) ...]

def give_winner(first_selection, second_selection):
    return (first_selection, second_selection) in a

You could also use a frozenset to improve performance. 您也可以使用frozenset来提高性能。

You could use a dictionary. 您可以使用字典。

dictionary = {
    1: [3, 4],
    2: [1, 5],
    3: [2, 4],
    4: [2, 5],
    5: [3, 1]
}

def give_winner(first_selection, second_selection):
    if dictionary.has_key(first_selection):
        if second_selection in dictionary[first_selection]:
            return True
    return False

You can make use of classes in python. 您可以使用python中的类。 For example, you can make player as a class with the following attributes:- 例如,您可以将播放器设置为具有以下属性的类:

    Score
    Name
    OptionChosen

etc similarly, you can make methods like 等类似的,你可以使像

    UpdateScore()
    DeclareWinner()

etc. This way your program will feel more "neat". 等等。这样您的程序会感觉更“整洁”。 You can also make a main() function which contains a 您还可以制作一个main()函数,其中包含一个

    while True:

and put all your content there. 并将所有内容放在那里。 for ex 对于前

    class Player:
        def __init__(self,name, score = 0):
          self.name = name
          self.score = score  # initially score is zero
        def ChooseOption(self, name):
           if name == "computer":
            # select choice randomly code
           else:
             var = int(input("Enter choice: "))
        def UpdateScore(self):
            self.score += 1
    def main():
        player1 = Player("Name")
        player2 = Player("Computer") 
        while True:
         resp1 = player1.ChooseOption()
         resp2 = player2.ChooseOption()
         # add other code to manipulate resp1 and resp2 here 

and similarly you can code other things, Hope this gives you some idea 同样,您可以编写其他代码,希望这可以给您一些帮助

give winner alternative also: 还给优胜者替代方案:

def give_winner(first_selection, second_selection):
    rules = {
        1: lambda x: x in (3, 4),
        2: lambda x: x in (1, 5),
        3: lambda x: x in (2, 4),
        4: lambda x: x in (2, 5),
        5: lambda x: x in (3, 1)
    }
    return rules[first_selection](second_selection)

I enjoyed building my own little version of Rock Paper Scissor Lizard Spock. 我喜欢构建自己的小版本的剪刀石头布蜥蜴Spock。

You started your post by explaining som rules. 您通过解释som规则开始了您的文章。 So i figured, why not incorporate the rules inside the code. 所以我想,为什么不将规则合并到代码中。 And i wanted to use real words instead of numbers since it would be easier to understand. 我想用实词代替数字,因为这样更容易理解。 But i agree it would be a hassle to spell scissors correct everytime, so i wanted numbers to work as input as well. 但是我同意每次都要正确校正剪刀会很麻烦,所以我也希望数字也能用作输入。

from random import randint

# ex. scissors and lizard is beaten by rock
beaten_by = {'rock': ['scissors', 'lizard'],
             'paper': ['rock', 'spock'],
             'scissors': ['paper', 'lizard'],
             'lizard': ['spock', 'paper'],
             'spock': ['scissors', 'rock']}

def rplsls_game():
    player_score, computer_score = 0, 0
    weapons = ['rock', 'paper', 'scissors', 'lizard', 'spock']

    while(abs(player_score - computer_score) < 2):

        print "-----------------------------------------------------------"
        print " Please enter your selection: "
        print " 1 (Rock), 2 (Paper), 3 (Scissors), 4 (Lizard) or 5 (Spock)"

        computer_weapon = weapons[randint(0, 4)]
        weapon = raw_input()
        if weapon in '12345': weapon = weapons[int(weapon) - 1]
        if weapon not in weapons:
            print "invalid input"
            continue        
        print "You selected: " + weapon
        print "Computer selected: " + computer_weapon

        if computer_weapon in beaten_by[weapon]:
            print "You won!"
            player_score += 1
        elif weapon in beaten_by[computer_weapon]:
            print "Computer won!"
            computer_score += 1
        else:
            print "Draw!"

        print "Player: " + str(player_score)
        print "Computer: " + str(computer_score)

    if player_score > computer_score:
        print "Congratulations! you won the game"
    else:
        print "Computer won the game..."

rplsls_game()

You can use also raw_input instand: 您还可以使用raw_input instand:

print("    Please enter your selection: 1 (Rock), 2 (Paper), 3 (Scissors), 4 (Lizard) or 5 (Spock): ")
selection = int(input())

try:
  selection = input("Please enter your selection: 1 (Rock), 2 (Paper), 3 (Scissors), 4 (Lizard) or 5 (Spock): ")
except ...

You complete forgot about exceptions. 您完全忘记了异常。

And if stemtmants in your give_winner function is too large, use dictionar or lambda function. 而且,如果Give_winner函数中的主干太大,请使用dictionar或lambda函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM