Python新手练习:Rock Paper Scissors

时间:2014-02-21 19:58:06

标签: python python-2.7

我一直在尝试编写一个简单的RPS游戏,用户可以在游戏中对抗计算机。 此时只有1次迭代(因为我卡住了......)并且没有验证用户的输入是否有效。 我遇到的问题是,无论我为了将计算机和用户的分数存储在变量中而尝试做什么,它都保持等于0,无论我尝试什么缩进或者我试图放置返回的地方。 (正如你在下面的代码中看到的那样......我试着没有运气的一些部分被注释掉了)。理想情况下,由于我计划进行多次迭代,我希望变量u和v本身能够更新并保持得分,而不仅仅是打印谁赢得特定迭代。

你能帮我理解我在这里做错了吗?

干杯

from random import randrange
rps = ["r", "p", "s"]



def gameplay(user,comp):
    u = 0 #user's score
    v = 0 #computer's score
    print "Computer chose: " + comp
    if comp == user:
        pass
    elif comp == "r" and user == "p":
        u += 1
        #print u
        #return u

    elif comp == "r" and user == "s":
        v += 1
        #print v
        #return v

    elif comp == "p" and user == "s":
        u += 1
        #print u
        #return u

    elif comp == "p" and user == "r":
        v += 1
        #print v
        #return v

    elif comp == "s" and user == "r":
        u += 1
        #print u
        #return u

    elif comp == "s" and user == "p":
        v += 1
        #print v
        #return v

    return u
    return v

gameplay(raw_input("your move?"),rps[randrange(3)])
print u
print v

3 个答案:

答案 0 :(得分:3)

只是为了好玩......看看你是否能理解这个OOP实现(开始学习OOP永远不会太早)

WIN,TIE,LOSE = 1,0,-1
class RockPaperScissors:
    def __str__(self):
        return self.__class__.__name__
class Rock(RockPaperScissors):
    def __cmp__(self,other):
        if isinstance(other,Rock): return TIE
        if isinstance(other,Paper): return LOSE
        return WIN

class Paper(RockPaperScissors):
    def __cmp__(self,other):
        if isinstance(other,Paper): return TIE
        if isinstance(other,Scissors):return LOSE
        return WIN

class Scissors(RockPaperScissors):
    def __cmp__(self,other):
        if isinstance(other,Scissors): return TIE
        if isinstance(other,Rock):return LOSE
        return WIN

def RPS(ltr_code):
    return {'r':Rock,'p':Paper,'s':Scissors}[ltr_code.lower()]()


player = RPS("r")
computer = RPS("s")
if player > computer:
    print "Player Wins! %s beats %s"%(player,computer)
elif player < computer:
    print "Computer wins!! %s beats %s"%(computer,player)
else: 
    print "Tied!! %s ties %s"%(computer,player)

答案 1 :(得分:1)

您的计划有两个问题:

  1. 一个函数可以返回多个值,但它必须将它们作为元组返回,而不是先返回元组,然后返回另一个。将return语句更改为return (u, v)
  2. 您需要将函数返回的值绑定到函数外部的某些值,以便可以使用它们。试试u, v = gameplay(...)。这会将函数返回的uv的值绑定到函数外部的变量uv。变量的名称不必匹配;您也可以使用任何其他名称,例如my_score, cpu_score = gameplay(...)
  3. 当这两个被修复时,似乎工作正常。

答案 2 :(得分:1)

每次你在开始时调用“游戏玩法”时你都要设置u,v = 0,0。你需要在方法之外定义分数以使一切正常工作:

from random import randrange
rps = ["r", "p", "s"]

u, v = 0, 0

def gameplay(user,comp,u,v):
    print "Computer chose: " + comp
    if comp == user:
        pass
    elif comp == "r" and user == "p":
        u += 1
    elif comp == "r" and user == "s":
        v += 1
    elif comp == "p" and user == "s":
        u += 1
    elif comp == "p" and user == "r":
        v += 1
    elif comp == "s" and user == "r":
        u += 1
    elif comp == "s" and user == "p":
        v += 1
    return u, v

for i in range(4): # 4 Games
    u, v = gameplay(raw_input("your move?"),rps[randrange(3)],u,v)

print "User: ", u, " CPU: ",v #Displaying final scores