Python 输入输入时,“我的显示”菜单会重复多次

Python 输入输入时,“我的显示”菜单会重复多次,python,class,object,Python,Class,Object,我正在实践我自己提出的课程理念中的课程和继承。基本上我做了一个街机游戏菜单模拟器,可以玩两种模式,单人和多人。每次我输入一个选项(1或2),菜单都会显示几次,然后继续接受输入,我只希望菜单显示一次。这是我的密码: # Suppose you are at an arcade and you and your friend want to play a multiplayer game that requires UI. # Make the game ask for the users

我正在实践我自己提出的课程理念中的课程和继承。基本上我做了一个街机游戏菜单模拟器,可以玩两种模式,单人和多人。每次我输入一个选项(1或2),菜单都会显示几次,然后继续接受输入,我只希望菜单显示一次。这是我的密码:

    # Suppose you are at an arcade and you and your friend want to play a multiplayer game that requires UI.
# Make the game ask for the users name and age to see if they can play, make the program so that it can add a friend.
# If any of the players are under the age of 18, they are not allowed to  play, otherwise proceed.
# **EXTRA CREDIT** --> Add a functionality which adds the players to a list until the list reaches 4 players, then stop adding to the list.

# arcade_game.py
import sys


# give the user a greeting
import self as self

lst = []


class menu:
    def __init__(self, ready):
        self.ready = ready

    #display menu
    @classmethod
    def display_menu(self):
        print("Pick from one of the choices below, type in the corressponding number")
        print("1. single player \n"
              "2. Multiplayer")
        choice = int(input("Enter your choice here: "))
        return choice

    # ready or not function to see if the user is ready to play
    def ready_or_not(self):
        # see if user types 1 or 2 with try & except
        try:
            # ask user if they are ready
            self.ready = int(input("Are you ready to play? Type 1 for yes, 2 for no"))
            self.display_menu()
        except ValueError:
            print("You did not type 1 or 2, please try again!")


# add players class
class player(menu):
    # add a default player to __init__(), **(since there has to be at least one player)**
    def __init__(self, ready, player1):
        super().__init__(ready)
        self.player1 = player1

    # single player method
    def set_name(self):
        self.player1 = input("Enter your name for single player mode")
        print("Lets play! ", self.player1)

    # multiplayer method
    def set_names(self):
        try:
            self.player1 = input("Enter your name to begin")
            lst.append(self.player1)
            # add another player to continue
            while len(lst) <= 4:
                add = input("Add player here: ")
                lst.append(add)
                if len(lst) == 4:
                    print("Player limit reached!")
                    break;
        except ValueError:
            print("You didnt enter valid input, please try again")

    # get the names of the players only if 1 is picked from display_menu() above, including player1
    def check_choice(self):
        if self.display_menu() == 1:
            self.set_name()
        elif self.display_menu() == 2:
            self.set_names()
        else:
            print("Exiting....")
            print("Goodbye!")
            sys.exit(0)


m = menu("yes")
m.ready_or_not()
p = player("yes", "test")
p.check_choice()
#假设你在一个街机上,你和你的朋友想玩一个需要用户界面的多人游戏。
#让游戏询问用户的姓名和年龄,看看他们是否可以玩,制作程序以便添加朋友。
#如果任何球员未满18岁,则不允许他们参加比赛,否则继续比赛。
#**额外积分**-->添加一项功能,将玩家添加到列表中,直到列表中有4名玩家,然后停止添加到列表中。
#arcade_game.py
导入系统
#向用户打招呼
将自我导入为自我
lst=[]
类菜单:
定义初始化(自我,准备就绪):
self.ready=ready
#显示菜单
@类方法
def显示菜单(自我):
打印(“从以下选项中选择一个,键入相应的数字”)
打印(“1.单人\n”
“2.多人游戏”)
choice=int(输入(“在此处输入您的选择:”)
返回选择
#就绪或不就绪功能,以查看用户是否已准备好播放
def就绪或未就绪(自身):
#查看用户是否使用try&except键入1或2
尝试:
#询问用户他们是否准备好了
self.ready=int(输入(“您准备好玩了吗?输入1表示是,输入2表示否”))
self.display_菜单()
除值错误外:
打印(“您没有键入1或2,请重试!”)
#添加玩家类
类播放器(菜单):
#将默认播放机添加到uuu init_uuuu(),**(因为必须至少有一个播放机)**
def uuu init uuuuu(自身、就绪、播放器1):
超级()。\uuuu初始化\uuuu(准备就绪)
self.player1=player1
#单人法
def set_名称(自身):
self.player1=输入(“为单人模式输入您的姓名”)
打印(“让我们玩吧!”,self.player1)
#多层方法
def集合_名称(自身):
尝试:
self.player1=输入(“输入您的姓名以开始”)
lst.append(self.player1)
#添加其他玩家以继续

而len(lst)
就绪或不就绪
调用
self.display\u菜单()

check\u choice
还调用
self.display\u menu()
至少一次,如果第一次键入的不是
1
的内容,则至少调用两次:

def check_choice(self):
    if self.display_menu() == 1:
        self.set_name()
    elif self.display_menu() == 2:
        self.set_names()
    else:
        print("Exiting....")
        print("Goodbye!")
        sys.exit(0)
您的顶级代码在一个菜单实例上调用
ready\u或

m = menu("yes")
m.ready_or_not()
…和
检查另一个上的\u choice()

p = player("yes", "test")
p.check_choice()
因此,如果您键入的不是
1
,程序将显示两次菜单,然后第三次显示菜单

如果不希望菜单显示两次或三次,请不要调用该方法两次或三次


如果只想显示一次菜单并记住该选项,而不是显示两到三次,则需要使用在
ready\u或\u not
中创建的
self.ready
属性,而不是再次调用该方法

然而,这仍然无法正常工作,因为您的类设计很奇怪。您已经创建了两个独立的实例,
m
p
,每个实例都有自己独立的属性。我不知道为什么
player
首先继承了
menu
(或者为什么
display\u menu
@classmethod
,或者为什么它调用它的参数
self
,而不是
cls
(如果它是一个)以及其他各种东西),但是,考虑到
player
在您的设计中是
菜单
,您可能只需要一个
播放器
实例,如下所示:

p = player("yes", "test")
p.ready_or_not()
p.check_choice()
def check_choice(self):
    if self.choice == 1:
        self.set_name()
    elif self.choice == 2:
        self.set_names()
    else:
        print("Exiting....")
        print("Goodbye!")
        sys.exit(0)
然后,您可以这样更改
检查选项

p = player("yes", "test")
p.ready_or_not()
p.check_choice()
def check_choice(self):
    if self.choice == 1:
        self.set_name()
    elif self.choice == 2:
        self.set_names()
    else:
        print("Exiting....")
        print("Goodbye!")
        sys.exit(0)
我花了一段时间才弄明白,但似乎当您完成
display\u menu()
调用
ready\u或
时,您需要从ready或not()中删除
display\u menu()

编辑 看来我参加聚会迟到了


你能展示你的输出吗?或者尝试添加
输入(“”)
并调试复制菜单的代码的确切位置code@Surya泰吉,你准备好上场了吗?键入1表示“是”,键入2表示“否”,从下面的一个选项中选择,键入相应的数字1。单人游戏2。多人游戏在这里输入你的选择:2从下面的选择中选择一个,输入相应的数字1。单人游戏2。多人游戏在这里输入你的选择:2从下面的选择中选择一个,输入相应的数字1。单人游戏2。多人游戏在这里输入你的选择:2输入你的名字开始当我在菜单方法中添加输入时,它仍然重复,但带有一个空白的空格@Suryatej很有意义,我在想这个,但不是100%确定,非常感谢!谢谢你的帮助@abamert@nathan您能解释一下您是如何在代码中使用
@classmethod
的吗