afrcmg 2022-07-21 18:45 采纳率: 87.5%
浏览 76
已结题

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

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

首先我的需求是,小游戏里需要建立各种足球队。球队里有球员,还有阵型,替补席什么的。
球员分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号找人了

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

  • 写回答

3条回答 默认 最新

  • 溪风沐雪 2022-07-22 09:12
    关注

    球员一个列表。门将一个列表。上场球员和门将用字典存储,字典的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]) #替换守门员
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月30日
  • 已采纳回答 7月22日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题