首页
学习
活动
专区
圈层
工具
发布

2人游戏
EN

Stack Overflow用户
提问于 2013-11-11 23:42:31
回答 2查看 4.7K关注 0票数 0

一场有两名玩家的比赛。在这个游戏中,每个玩家轮流从三个袋子中的一个中移除1到5个物体: A,B,C。移除最后一个物体的玩家赢得比赛。以下是规则:

·游戏开始时,每个包包含10个物品。

·玩家一次可以从一个袋子中移除物体。

·玩家不能选择移除0对象。对象的数量必须介于1到5之间(包括在内)。

·游戏结束时,所有的袋子都是空的。

·当前玩家必须先选择包(A或B或C),然后选择必须从该包中移除的对象的数量。

·您还必须检查用户的输入是否有效。这是一个有效的包(A或B或C)吗?它是一个有效的数字(介于1到5之间)吗?还有,包里有足够的物品吗?如果没有满足这些条件中的任何一项,请再次请求用户输入。(您需要使用循环来完成此操作)

示例:

A、B、C

10,10,10 Player1从B接收5个对象。

10,5,10,Player2从C.

10 5 5 Player1从A.

7,5,5 Player2从B中获取3个对象。

7,2,5 Player1从C.

7~2 0 Player2从A.

5~2 0 Player1从A.

4,2,0 Player2从A.

1 2 0 Player1从B获取1个对象。

1 10 0 Player2从B获取1个对象。

1 0 0 Player1从A.

*注意:*我只能使用循环,或者如果条件没有列表或其他条件

我已经走了这么远:

代码语言:javascript
复制
A=5
B=5
C=5
total_objects=15
Player1=0
Player2=0

while total_objects>0:
    selected_bag=input("Choose the bag:")
    if selected_bag == A or B or C:
        print("Valid bag")
    else:
        selected_bag=input("Not a valid bag choose again:")


    removed=int(input("How many objects do you want to remove?"))
    if removed>5 or removed<1:
        int(input("You must enter between 1 and 5:"))

    elif removed == 1 or 2 or 3 or 4 or 5:
        if selected_bag == A:
            A-=removed
        if selected_bag == B:
            B-=removed
        if selected_bag == C:
            C-=removed

    if A>0:
        print("There are",A,"objects left")
    elif B>0:
        print("There are",B,"objects left")
    elif C>0:
        print("There are",C,"objects left")


print("You win!")
EN

回答 2

Stack Overflow用户

发布于 2013-11-11 23:47:14

你不是这样检查物品的。这一行:

代码语言:javascript
复制
if selected_bag == A or B or C:

不像你想的那样。它评估A or B or C,然后将其与您的selected_bag进行比较。

使用in操作符代替。另外,您需要检查的是字符串,而不是变量:

代码语言:javascript
复制
if selected in ('A', 'B', 'C'):

正如abarnert所提到的,你也需要改变其他的。

另外,更改这一行:

代码语言:javascript
复制
elif removed == 1 or 2 or 3 or 4 or 5:

要正确循环,需要在条件为false时执行continue

代码语言:javascript
复制
else:
    selected_bag=input("Not a valid bag choose again:")
    continue

一个简单的else语句。

代码语言:javascript
复制
else:

老实说,您的代码有很多问题。@abarnert比我解释的要好得多。

票数 3
EN

Stack Overflow用户

发布于 2013-11-11 23:55:56

这一行有两个大问题:

代码语言:javascript
复制
if selected_bag == A or B or C:

正如艾基德已经解释过的,第一个问题是or不是那样工作的,您需要in

第二个问题是,您希望检查用户是否输入了任何字符串"A""B""C",而不是他是否输入了ABC变量的值。

所以,你想要的是:

代码语言:javascript
复制
if selected_bag in ('A', 'B', 'C'):

您将再次重复这两个问题,并需要再次修复它们:

代码语言:javascript
复制
elif removed == 1 or 2 or 3 or 4 or 5:

…需要是…

代码语言:javascript
复制
elif removed in (1, 2, 3, 4, 5):

…或者更好的…

代码语言:javascript
复制
elif 1 <= removed <= 5:

然后,在这里面:

代码语言:javascript
复制
    if selected_bag == A:
        A-=removed

…需要是…

代码语言:javascript
复制
    if selected_bag == "A":
        A-=removed

…B和C也是如此。

最后,本部分:

代码语言:javascript
复制
if removed>5 or removed<1:
    int(input("You must enter between 1 and 5:"))

…没有什么有用的东西。它要求用户输入另一个数字,将结果转换为int,然后忽略它,然后切换到if A>0:部件。如果你想一直问,直到用户给出一个有效的答案,你需要某种循环。当然,你必须把这个价值存储在某个地方,这样它才会有用。例如:

代码语言:javascript
复制
removed=int(input("How many objects do you want to remove?"))
while removed>5 or removed<1:
    removed = int(input("You must enter between 1 and 5:"))

对于selected_bag输入部分,您有一个非常类似的错误。

如果你想要处理两个球员,你需要跟踪谁是当前轮到它。一个简单的方法是存储一个current_player变量,并在循环中每次更新它。例如:

代码语言:javascript
复制
current_player = 2

while total_objects>0:
    current_player = 2 if current_player == 1 else 1
    print("Player", current_player, " is now up.")

    # all the existing code

print('Player", current_player, "wins!")

如果你想“抛硬币”来决定谁先走,你可以把第一行改为:

代码语言:javascript
复制
import random
current_player = random.choice((1, 2))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19918224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档