我正在开发一个简单的2D游戏,许多敌人不断产生并追逐python + pygame中的玩家或玩家.我遇到的一个问题是,有很多人编写了这种类型的游戏已经遇到的问题是敌人会很快收敛.我已经用这个函数暂时解决了这个问题,如果它们彼此太靠近,它会将任意两个敌人随机分开.这很有效,但是关于O(n ^ 2)算法,每帧运行,在高敌时,程序开始减速.
当我的程序运行此功能时,敌人似乎形成了圆形物体,我昵称为"丛".丛似乎通常是黄道但实际上可能更复杂(不对称),因为当玩家移动时,敌人被拉向不同的方向.我喜欢这种丛的行为方式,但我想知道是否有更有效的方法来计算它.目前,丛中的每个敌人(通常> 100)首先朝着玩家的方向移动,然后被推开.如果有一种方法来计算丛生成的数字,以及它如何移动它将节省大量的计算.
我不确定如何处理这个问题.可以计算图形边界移动的位置,然后展开它以确保区域保持不变.
我的两个功能目前也被用来移动敌人:
def moveEnemy(enemy, player, speed):
a = player.left-enemy.left
b = player.top-enemy.top
r = speed/math.hypot(a,b)
return enemy.move(r*a, r*b)
def clump(enemys):
for p in range(len(enemys)):
for q in range(len(enemys)-p-1):
a = enemys[p]
b = enemys[p+q+1]
if abs(a.left-b.left)+abs(a.top-b.top)<CLUMP:
xChange = (random.random()-.5)*CLUMP
yChange = ((CLUMP/2)**2-xChange**2)**.5
enemys[p] = enemys[p].move(int(xChange+.5), int(yChange + .5))
enemys[p+q+1] = enemys[p+q+1].move(-int(xChange+.5),-int(yChange+.5))
return enemys
Run Code Online (Sandbox Code Playgroud)
编辑:一些关于丛的外观的屏幕截图:http: //imageshack.us/photo/my-images/651/elip.png/ http://imageshack.us/photo/my-images/832/newfni.png /
http://imageshack.us/photo/my-images/836/gamewk.png/
丛似乎主要是一个刚刚拉伸的圆形物体(如日食,但可能在多个方向上拉伸),但由于长方形的敌人,它目前有直边.
我是一个相对初学的程序员,他做了一些Visual Basic,Python,最近开始研究Java或C++以获得更快的语言.这些语言更快的主要原因似乎是它们被编译(或者用于Java,主要是编译).这引出了我的问题,是否有可能制作一个像Python一样容易编译的语言?
解释语言的优势似乎主要在于使范围和类型中的变量具有动态性.然而,总的来说(根据我的小经验)将代码长度缩短了一小部分(可能低于10%,添加公共修饰符或int只是一个单词).此外,我不确定是否可以使用真正的编译语言(如c ++)进行垃圾收集,但它在Java中可用,它与C++一样快/快.
是否可以使用非常简单的语法(如Python)创建一种语言,只需进行一些小的更改(静态变量),并允许它在Java/C++中编译,并从那里编译成一个非常快速的程序?
例如:在我现在非常有限的java视图中,要打印一些你必须写的东西:
System.out.println("print this");
Run Code Online (Sandbox Code Playgroud)
但是,在Python 3中,您可以编写:
print("print this")
Run Code Online (Sandbox Code Playgroud)
如果有人用这种理论语言print("print this")编写,它将被编译为System.out.println("print this");然后编译成JVM字节码.这种类型的语言可能会缩短生产时间,同时仍具有快速执行速度.
compiler-construction programming-languages language-design high-level
我正在尝试开始使用 cython 并尝试编译我的第一个程序。我用以下代码创建了一个 hello.pyx:
def show():
print ("Hello World")
Run Code Online (Sandbox Code Playgroud)
和一个带有以下代码的 setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("hello", ["hello.pyx"])]
setup(
name = 'Hello world app',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Run Code Online (Sandbox Code Playgroud)
两者都在我称为“cython 程序”的文件夹中,该文件夹位于 C:\Python32\cython 程序。Cython 位于 C:\Python32\Lib\site-packages\Cython。但是,当我运行 setup.py 时,出现以下错误:
Traceback (most recent call last):
File "C:\Python32\cython programs\setup.py", line 10, in <module>
ext_modules = ext_modules
File "C:\Python32\lib\distutils\core.py", line 136, in setup
raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
SystemExit: usage: setup.py …Run Code Online (Sandbox Code Playgroud) 我通过创建一个 Node 对象在 python 中创建了一个通用树。每个节点可以有 0、1 或 2 棵树。
我正在尝试创建一种方法来打印树中所有节点的列表。该列表不需要按顺序排列。这是我的简单尝试:
def allChildren(self, l = list()):
l.append(self)
for child in self.children:
l = child.allChildren(l)
return l
Run Code Online (Sandbox Code Playgroud)
我第一次运行这个方法时,它工作正常。但是,出于某种原因,它正在存储以前的运行。我第二次运行该方法时,它会打印所有节点两次。即使我创建了 2 个独立的树,它仍然记得之前的运行。例如:我创建了 2 棵树,a 和 b。如果我运行 a.allChildren() 我会收到正确的结果。然后我运行 b.allChildren() 并接收 a 的所有节点和 b 的所有节点。