- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个列表,其中包含 enemy
类,我使用 for
循环和敌人类中名为 的函数让它们跟随玩家移动()
。
但是当有多个敌人时,他们会在跟随玩家时变得困惑,所以我决定将其添加到 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 pygame
from random import randint
from pygame.locals import *
pygame.init()
screen=pygame.display.set_mode((640,480))
clock=pygame.time.Clock()
px=35
py=35
prect=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-=1
enemies=[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 pygame
import random
from pygame.locals import *
pygame.init()
screen=pygame.display.set_mode((640,480))
clock=pygame.time.Clock()
px=35
py=35
prect=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 -= 1
enemies=[Enemy(50,60),Enemy(200,100), Enemy(200,400), Enemy(200,200), Enemy(200,400), Enemy(200,200)]
roam = {} # Dict to track relative roam/chase
roam_count = {} # Dict to track time for which roaming
max_roam = {}
max_chasing = len(enemies) // 3
cur_chasing = 0
for 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()
我在不同的地方评论过。希望您能从中得到要点,或许还有一些想法。
关于python - 列表中敌人之间的 Pygame/Python 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889817/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!