Pygame/Python 列表中敌人之间的测试?

我有一个列表,包含enemy类,我已经使用for循环和enemy类中的一个名为move()的函数让它们跟随玩家。

但是当有多个敌人时,它们在跟随玩家时会变得混乱,因此我决定在for循环中添加以下内容:

for enmy in enemies:   pygame.draw.circle(screen, (255,0,0), (enmy.x-enmy.rad,enmy.y-enmy.rad), enmy.rad, 0)   for enmy2 in enemies:       if enmy2 is not enmy:            if not enmy.rect.colliderect(enmy2.rect):                enmy.move()enmy.rect=pygame.Rect(enmy.x-enmy.rad*2,enmy.y-enmy.rad*2,enmy.rad*2,enmy.rad*2)pygame.draw.rect(screen, (0,0,255), enmy.rect, 2)

所以我希望这能测试列表中除了自身之外的每个实例,但当对象独自存在时它不会移动!(而且如果有两个,它们会碰撞然后就停止)

这是完整的代码(不需要额外的文件 c:)

import pygamefrom random import randintfrom pygame.locals import *pygame.init()screen=pygame.display.set_mode((640,480))clock=pygame.time.Clock()px=35py=35prect=pygame.Rect(px-10,py-10,20,20)class Enemy(object):    def __init__(self,x,y):        self.x=x        self.y=y        self.rad=randint(5,10)        self.rect=pygame.Rect(0,0,0,0)    def move(self):        if self.x>px:            self.x-=1        if self.y<py:            self.y+=1        if self.x<px:            self.x+=1        if self.y>py:            self.y-=1enemies=[Enemy(90,80),Enemy(100,100)]while True:    screen.fill((200,230,200))    key=pygame.key.get_pressed()    if key[K_UP]:        py-=2    if key[K_DOWN]:        py+=2    if key[K_RIGHT]:        px+=2    if key[K_LEFT]:        px-=2    for e in pygame.event.get():        if e.type==QUIT:            exit()    for enmy in enemies:        pygame.draw.circle(screen, (255,0,0), (enmy.x-enmy.rad,enmy.y-enmy.rad), enmy.rad, 0)        for enmy2 in enemies:            if enmy2 is not enmy:                if not enmy.rect.colliderect(enmy2.rect):                    enmy.move()        enmy.rect=pygame.Rect(enmy.x-enmy.rad*2,enmy.y-enmy.rad*2,enmy.rad*2,enmy.rad*2)        pygame.draw.rect(screen, (0,0,255), enmy.rect, 2)    prect=pygame.Rect(px-20,py-20,20,20)    pygame.draw.circle(screen, (0,0,255), (px-10,py-10), 10, 0)    pygame.draw.rect(screen, (255,0,0), prect, 2)    clock.tick(80)    pygame.display.flip()

请有人帮帮我!


回答:

经过一番深思熟虑和摆弄(也玩了一会),我设法做了以下事情…

import pygameimport randomfrom pygame.locals import *pygame.init()screen=pygame.display.set_mode((640,480))clock=pygame.time.Clock()px=35py=35prect=pygame.Rect(px-10,py-10,20,20)class Enemy(object):    def __init__(self,x,y):        self.x=x        self.y=y        self.rad=random.randint(5,10)        self.rect=pygame.Rect(0,0,0,0)        self.x_dir = random.choice(('left','right'))        self.y_dir = random.choice(('up','down'))    def move(self, mode='chase'):        if mode=='chase':            if self.x>px:                self.x-=1            elif self.x<px:                self.x+=1            if self.y<py:                self.y+=1            elif self.y>py:                self.y-=1        else: # roam around            # Move for x direction            if self.x_dir == 'left':                if self.x > 1:                    self.x -= 1                else:                    self.x_dir = 'right'                    self.x += 1            else:                if self.x < px - 1:                    self.x += 1                else:                    self.x_dir = 'left'                    self.x -= 1            # Now move for y direction            if self.y_dir == 'up':                if self.y > 1:                    self.y -= 1                else:                    self.y_dir = 'down'                    self.y += 1            else:                if self.y < py - 1:                    self.y += 1                else:                    self.y_dir = 'up'                    self.y -= 1enemies=[Enemy(50,60),Enemy(200,100), Enemy(200,400), Enemy(200,200), Enemy(200,400), Enemy(200,200)]roam = {} # Dict to track relative roam/chaseroam_count = {} # Dict to track time for which roamingmax_roam = {}max_chasing = len(enemies) // 3cur_chasing = 0for i, enmy in enumerate(enemies):    if cur_chasing < max_chasing:        roam[i] = 'chase'        cur_chasing += 1    else:        roam[i] = 'roam'    roam_count[i] = 0    max_roam[i] = random.randint(100, 500)while True:    screen.fill((200,230,200))    key=pygame.key.get_pressed()    if key[K_UP]:        py-=2    if key[K_DOWN]:        py+=2    if key[K_RIGHT]:        px+=2    if key[K_LEFT]:        px-=2    for e in pygame.event.get():        if e.type==QUIT:            exit()    prect=pygame.Rect(px-20,py-20,20,20)    for e_1, enmy in enumerate(enemies):        pygame.draw.circle(screen, (255,0,0), (enmy.x-enmy.rad,enmy.y-enmy.rad), enmy.rad, 0)        moved_once = False        for e_2, enmy2 in enumerate(enemies):            if enmy2 is not enmy:                if enmy.rect.colliderect(enmy2.rect):                    if roam[e_2] == roam[e_1] == 'roam':                        if cur_chasing < max_chasing:                            roam[e_1] = 'chase'                    elif roam[e_2] == roam[e_1] == 'chase':                        roam[e_2] = 'roam'                        cur_chasing -= 1                    if roam[e_1] == 'roam':                        roam_count[e_1] += 1                        enmy.move('roam')                        if roam_count[e_1] > max_roam[e_1]:                            roam_count[e_1] = 0                            if cur_chasing < max_chasing:                                roam[e_1] = 'chase'                    else:                        enmy.move('chase')                else:                    if not moved_once:                        if roam[e_1] == 'roam':                            roam_count[e_1] += 1                            enmy.move('roam')                            if roam_count[e_1] > max_roam[e_1]:                                roam_count[e_1] = 0                                if cur_chasing < max_chasing:                                    roam[e_1] = 'chase'                        else:                            enmy.move('chase')                        moved_once = True        enmy.rect=pygame.Rect(enmy.x-enmy.rad*2,enmy.y-enmy.rad*2,enmy.rad*2,enmy.rad*2)        pygame.draw.rect(screen, (0,0,255), enmy.rect, 2)    pygame.draw.circle(screen, (0,0,255), (px-10,py-10), 10, 0)    pygame.draw.rect(screen, (255,0,0), prect, 2)    clock.tick(80)    pygame.display.flip()

我在多处添加了注释。希望你能理解大意,并从中获得一些灵感。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注