【问题标题】:python function random cycling if statementspython函数随机循环if语句
【发布时间】:2015-04-19 17:20:58
【问题描述】:

我正在制作一个石头剪刀布游戏,但遇到了decisioncycle() 的问题。我正在尝试做的是要求用户在usercycle() 中输入一个选项,让计算机在gamecycle() 中生成一个随机选项,然后确定谁赢得了这一轮并通过输赢计数跟踪每个结果.它似乎在随机决定何时工作。

import random


class rpsgame:

    rps= ["rock", "paper","scissors"]


    wincount=0
    losecount=0
    def usercycle(self):
        userchoice = input("rock, paper, scissor.....")
        print("SHOOT")
        return userchoice

    def gamecycle(self):
        computerchoice = random.choice(rpsgame.rps)
        return computerchoice




    def decisioncycle(self):
            if rpsgame.usercycle(self) == rpsgame.rps[0] and rpsgame.gamecycle(self) == rpsgame.rps[1]:
                    print("paper beats rock, you lose!")
                    rpsgame.losecount +=1
            elif rpsgame.usercycle(self) == rpsgame.rps[1] and rpsgame.gamecycle(self) == rpsgame.rps[0]:
                    print("paper beats rock, you win!")
                    rpsgame.wincount+=1
            elif rpsgame.usercycle(self) == rpsgame.rps[0] and rpsgame.gamecycle(self) == rpsgame.rps[2]:
                    print("rock beats scissors, you win!")
                    rpsgame.wincount+=1
            elif rpsgame.usercycle(self) == rpsgame.rps[2] and rpsgame.gamecycle(self) == rpsgame.rps[0]:
                    print("rock beats scissors, you lose!")
                    rpsgame.losecount+=1
            elif rpsgame.usercycle(self) == rpsgame.rps[1] and rpsgame.gamecycle(self) == rpsgame.rps[2]:
                    print("scissors beats paper, you lose!")
                    rpsgame.losecount+=1
            elif rpsgame.usercycle(self) == rpsgame.rps[2] and rpsgame.gamecycle(self) == rpsgame.rps[1]:
                    print("scissors beats paper, you win!")
                    rpsgame.wincount+=1
            elif rpsgame.usercycle(self) == rpsgame.gamecycle(self):
                    print("it's a tie!!!")
            print("wins {}, losses {}".format(rpsgame.wincount, rpsgame.losecount))




while True:
    rg = rpsgame()
    rg.usercycle()
    rg.gamecycle()
    rg.decisioncycle()

我认为我的问题在于决策周期()。这是我在课堂上的第一次尝试,因为游戏正在使用全局变量,但我在这里读到,这对于未来来说是一种不好的做法。

【问题讨论】:

  • 在决策周期中,每个 if/elif 语句都像是一个单独的游戏回合,我认为这不是您真正想要的。
  • 没错,当我像这样在没有使用全局变量的类的情况下编写它时,它按预期工作。我到底错过了什么?
  • 在决定游戏结果的任何函数中,您应该只调用 usercycle 和 gamecycle 一次,并将结果分配给 2 个变量。然后使用这些变量进行比较。
  • 这行得通,但我仍然不完全理解为什么它首先与全局变量一起工作,这本身就是一个教训。我可能应该远离全局变量...
  • 不,因为 computerchoice 和 userchoice 是 gamecycle 和 usercycle 函数的本地。它们不存在于这些功能之外。如果您希望它们成为 rpsgame 的属性,则必须在它们前面加上 self,例如self.computerchoice.

标签: python function loops


【解决方案1】:

您可以使用模运算,而不是使用大量循环来评估每个组合。

假设您制作地图

"rock" => 0
"paper"=>1
"scissors" => 2

您可以将解决方案评估为

(A.number - B.number) % 3

如果这个结果为0,则为平局,如果为1,则A赢,如果2 A输了

【讨论】:

  • 可以很好地使用枚举,尽管该算法的工作原理并不是很明显。在我在这里看到的所有 RPS 游戏中,我从未见过提供的算术方法!我的意思是,如果在所有情况下都有效,那真的很酷。它是可扩展的吗? (例如石头剪刀布蜥蜴史波克)
  • 如果您将 A-B 视为差异,您可以将其视为 -1,0 或 1 或在有限域 0,1 和 2 中的差异(2 与 -1 相同)。它被称为有限域中的算术,来自数论。例如,在 C 中 % 不能以这种方式工作,因此应该将其写为 (3+A-B)%3
【解决方案2】:

您在每种情况下都要求新的用户输入。您可能只想阅读一次,然后每次都进行比较

user_choice = self.usercicle()
game_choice = self.gamecycle()
if(user_choice == self.rps[0] and game_choice == self.rps[1]):
    print "Paper beats rock, you lose!"
    self.losecount += 1
elif( user_choice...

等等

【讨论】:

  • 看看这个我注意到的区别是你在三分之一内运行了前两个函数,然后只调用第三个函数来运行整个脚本。这是一种更清洁的方法,但我尝试了这个,它给了我相同的结果。
  • 我更建议另一种方法来实现decisioncycle 的主体。如果不出意外,您可以在顶部打印两个选项是什么,并尝试找出哪对答案有效或无效。
【解决方案3】:

我认为你应该创建一个单独的函数来确定获胜者,并使用 dict,而不是 7 路 if 语句:

def who_won(player, computer):
    rules = {"rock": "scissors", "paper": "rock", "scissors": "paper"}
    if player == computer:
        return None
    if rules[computer] == player:
        return "computer"
    return "player"

检查无效输入可能是个好主意,但这应该在输入函数中完成,而不是在这个函数中。

【讨论】:

    【解决方案4】:

    我认为这实际上可以简化。有一些错误,它们看起来像是由于对类的简单不熟悉。看这里:

    class RpsGame:
    
        # create a game loop. Let's try a while loop
        # also, let's try using a dict to make comparisons easier
    
        def play(self):
            rps = {'rock':'scissors', 'paper':'rock', 'scissors':'paper'}
            score = 0
            # lets just say player must win 3 or lose 3 to end the game
            while -3 < score < 3:
                # ask user for their choice just once here, for instance
                user = raw_input("Rock, paper or scissors: ").lower()
                # and check the input is valid
                # get the computer choice with random
    
                # then find the winner and adjust score
                # when score reaches -3, computer wins etc.
                # comparisons could go like:
                if com == rps[user]: 
                    score += 1
                elif user == rps[com]:
                    score -= 1
    
            self.game_over(score)
    
        def game_over(self, score):
            if score == -3:
                result == "You win"
            else:
                result == "You lose"
    
            print "%s!!" % result
    
    
    # We would start by instantiating the game
    game = RpsGame()
    # And then calling the play method
    game.play()
    

    如果我也是你,我会去阅读更多关于课程和“自我”用法的内容。

    【讨论】:

    • 请注意self 不是关键字! :)
    【解决方案5】:

    那里有很多时髦的东西,但我认为您遇到的问题是您将 self 传递给一个不(真的)将参数作为输入的函数。

    class TestClass(object):
        def some_method(self):
            return random.choice(['rock', 'paper', 'scissors'])
        def make_choice(self):
            return self.some_method(self)
            # raises TypeError
    

    一个方法的类是自动给定它所属的实例作为第一个参数。如果你再次尝试通过它,它会失败。

    也就是说,我认为您的课程应该如下所示:

    class Roshambo(object):
        ROCK = 'rock'
        PAPER = 'paper'
        SCISSORS = 'scissors'
    
        OPTIONS = [ROCK, PAPER, SCISSORS]
    
        def get_user_input(self):
            choice = input("r/p/s? ").lower()
            if choice.startswith('r'): choice = self.ROCK
            elif choice.startswith('p'): choice = self.PAPER
            elif choice.startswith('s'): choice = self.SCISSORS
            else:
                # what do we do now?
                pass  # for now
            return choice
    
        def get_computer_input(self):
            return random.choice(self.OPTIONS)
    
        def start(self):
            # get input ONCE...
            user_choice = get_user_input()
            computer_choice = get_computer_input()
    
            if user_choice == ROCK and computer_choice == ROCK:
                # tie
            # etc....
    

    然后实例化

    game = Roshambo()
    

    然后运行

    game.start()
    

    【讨论】:

    • 他在decisioncycleself 中的所有调用都是完全有效的——他不是在实例上调用它们,而是直接在类上调用它们。
    • 诚然,他根本不应该在那里称呼它,但他称呼它的方式绝对不是他的问题!
    • @Ben 嗯嗯,我确实想念他实际上是在打电话给self.__class__.methodname(self),但即使这没有导致错误,也绝对没有帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2018-01-25
    • 2016-02-13
    • 2021-12-29
    • 1970-01-01
    • 2013-07-10
    • 2017-10-13
    相关资源
    最近更新 更多