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