小编end*_*x1x的帖子

一次指挥大量敌人

我正在开发一个简单的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/

丛似乎主要是一个刚刚拉伸的圆形物体(如日食,但可能在多个方向上拉伸),但由于长方形的敌人,它目前有直边.

python algorithm pygame

9
推荐指数
1
解决办法
507
查看次数

是否可以制作高级编译语言?

我是一个相对初学的程序员,他做了一些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

6
推荐指数
1
解决办法
2948
查看次数

编译第一个cython程序时出错

我正在尝试开始使用 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)

python compiler-errors cython

4
推荐指数
1
解决办法
6108
查看次数

Python:打印树的所有节点无意中存储数据

我通过创建一个 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 的所有节点。

python tree class python-3.x

1
推荐指数
1
解决办法
781
查看次数