【问题标题】:Game with 2-player2人游戏
【发布时间】:2013-11-23 22:55:50
【问题描述】:

2 人游戏。在这个游戏中,每个玩家轮流从三个袋子之一中取出 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 获取 5 个对象。
10 5 5 Player1 从 A 拿走了 3 个物体。
7 5 5 Player2 从 B 处获取 3 个对象。
7 2 5 Player1 从 C 获取 5 个对象。
7 2 0 Player2 从 A 拿走了 2 个对象。
5 2 0 Player1 从 A 获取 1 个对象。
4 2 0 Player2 从 A 获取 3 个对象。
1 2 0 Player1 从 B 中取出 1 个对象。
1 1 0 Player2 从 B 获取 1 个对象。
1 0 0 Player1 从 A 获取 1 个对象。

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

我已经做到了:

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!")

【问题讨论】:

  • 请具体询问您的问题。有什么问题?
  • 即使我选择 D 作为包包,它表示包包有效,我该如何替换玩家?
  • 有效的包是什么意思?它的值为 5?
  • 如果用户选择 D 它应该说 not a valid bag 再次选择
  • 不要试图空白你的问题或删除源代码。对于使用该网站的每个人来说,它仍然存在于历史中,但是对于通过搜索找到类似问题的任何人来说,它使您的问题(及其答案)毫无用处。

标签: python loops python-3.x nested-loops


【解决方案1】:

这不是您检查项目的方式。这一行:

if selected_bag == A or B or C:

没有做你认为它做的事。它评估A or B or C,然后将其与您的selected_bag 进行比较。

请改用in 运算符。另外,您需要检查的是字符串,而不是变量:

if selected in ('A', 'B', 'C'):

正如 abarnert 所说,您还需要更改其他人。

另外,更改这一行:

elif removed == 1 or 2 or 3 or 4 or 5:

并且要正确循环,当条件为假时需要continue

else:
    selected_bag=input("Not a valid bag choose again:")
    continue

到一个简单的else 声明。

else:

说实话,您的代码存在很多问题。 @abarnert 比我能解释得更好。

【讨论】:

  • 两次询问正确的袋子后,它转到“您要删除多少对象?”它不再问了。如何解决?
  • 更新了我的答案,请检查
【解决方案2】:

这条线有两个大问题:

if selected_bag == A or B or C:

第一个问题,正如 aikid 已经解释的那样,or 不是这样工作的;你想要in


第二个问题是你想检查用户是否输入了任何字符串"A""B""C",而不是他是否输入了AB的任何值, 和 C 变量恰好是。

所以,你想要的是:

if selected_bag in ('A', 'B', 'C'):

你又重复了这两个问题,并且需要再次修复它们:

elif removed == 1 or 2 or 3 or 4 or 5:

……必须是……

elif removed in (1, 2, 3, 4, 5):

……或者更好……

elif 1 <= removed <= 5:

然后,在其中:

    if selected_bag == A:
        A-=removed

……必须是……

    if selected_bag == "A":
        A-=removed

... B 和 C 也是如此。


最后,这部分:

if removed>5 or removed<1:
    int(input("You must enter between 1 and 5:"))

... 没有做任何有用的事情。它要求用户输入另一个数字,将结果转换为int,然后忽略它并转到if A&gt;0: 部分。如果您想一直询问直到用户给出有效答案,您需要某种循环。当然,您必须将该值存储在某个地方才能使其有用。例如:

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 变量,并在每次循环中更新它。例如:

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!")

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

import random
current_player = random.choice((1, 2))

【讨论】:

  • @user2979303:要添加 player-2,您可能需要一个标志来指定轮到谁了。让我编辑答案,让您有一个开始的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2019-08-05
  • 2013-10-09
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多