如何为足球游戏创立一个球队(面向对象)

这个问题想要的不是具体的代码实现,而是思路。

首先我的需求是,小游戏里需要建立各种足球队。球队里有球员,还有阵型,替补席什么的。
球员分4种:①上场的球员(10个)②上场门将(1个)③替补球员(最多21个)④替补门将(最多6个)
要求:其中阵型是死的,比如说433阵型的中间是10号,那么交换球员位置(不管是和替补换还是和场上的人换)后,10号仍然在原位,只不过新的人变成了10号,原来的10号位跑别处了。然后还可以增加球员或者删除球员。

如果有现成的思路,可以不看我后面的絮叨(最好稍微看下),直接看最后的问题。

我目前是这样做的:
class character用它来建立角色

然后
class Team
self.队伍名 = 队伍名字
读含有球队信息的csv文件,根据队伍名字获得球员名单:info列表,里面含有所有人员名字(只要有名字,就能通过character创建角色)
其中,上场人员是固定的11个,但是替补数量不定,有的队伍可能一个没有,有的可能有好多。但不管多少,我会确保len(info)=10+1+21+6=38,如果不够就补None,因为如果名字是None,后面就会创建个队员None
self.门将 = character(A)
self.1号 = character(B)
self.2号 = character(B)
以此类推
self.替补 = character(C)
这里一共有38行代码,38个位置。这也是我前面要补None的原因,否则会报错

问题1:我尝试过用exec("self.x号 = character(A) ")来批量创建变量名,给球队添加角色,但是出现了些问题,我觉得难以解决,最终没采用,还是一行行敲出来的。这个是否能用问题二里我的方法解决?感觉可以,但不知道有没有更好方法来实现?

问题二:有时候Team需要换人,这个我最后用改变Team的_dic_强行解决了,虽然这样有点粗暴。这里有没有优化的方法?

问题三:更大的问题来了,如果有剧情的话,比如要增加一个球员Z,用它把球员B换掉。正常来说,我的流程是:把Z加到替补里→用问题二里换人的方法,把Z和B换位置。但是我换人是用self.x号和self.y号交换的(也就是几号和几号换),而刚才的流程需要以名字为准(也就是先找到self.x号.name = Z, self.y号 = B,然后才能x和y交换),如果玩家过程中改变了站位,就不能以x号找人了

有没有解决方法或者思路呢?

球员一个列表。门将一个列表。上场球员和门将用字典存储,字典的key用编号和门将来做,球员和门将都加一个上场或者替补的属性

class Character:
    def __init__(self,name):
        self.name = name #球员名称

class Team:
    def __init__(self,name):
        self.name = name #球队名称
        self.players = [] #球员列表
        self.goalkeepers = [] #守门员列表
        self.fighters = {k:None for k in range(1,11)} #上场队员字典,10个球员,一个守门员,初始化为空
        self.fighters['goalkeeper'] = None

    #球队添加一个球员,也可以替换球员
    def add_player(self,name,expel=None):
        if not expel:
            for i in range(len(self.players)):
                if self.players[i].name==expel:
                    del self.players[i]
                    break
        if len(self.players)<31:
            self.players.append(Character(name))
            return True
        else:
            return False
    
    #球队添加一个守门员,也可以替换守门员
    def add_goalkeeper(self, name, expel=None):
        if not expel:
            for i in range(len(self.goalkeepers)):
                if self.goalkeepers[i].name==expel:
                    del self.goalkeepers[i]
                    break
        if len(self.goalkeepers)<7:
            self.goalkeepers.append(Character(name))
            return True
        else:
            return False

    #设定出场队员,指定编号和队员,直接替换对应编号
    def fight(self,number,cha):
        self.fighters[number]=cha
        for k,v in self.fighters.items():
            print(f'{k}:{v.name if v else None}', end=',')
        print('\n','-'*80)
        
if __name__ =='__main__':
    team = Team('name')
    for i in range(31): #初始化球员列表
        team.add_player('player'+str(i))
    for i in range(7): #初始化守门列表
        team.add_goalkeeper('gk'+str(i))
    for i in range(10): #指定首发球员
        team.fight(i+1,team.players[i])
    team.fight('goalkeeper',team.goalkeepers[0]) #指定收发守门员

    team.fight(10, team.players[16]) #替换球员
    team.fight(7, team.players[18]) #替换球员
    team.fight('goalkeeper', team.goalkeepers[3]) #替换守门员

1.用列表
2.写一个交换函数
3.名字不重复可以用名字,可以增加一个唯一的ID号,通过ID号查找和交换

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632