Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python I';我创造了太空入侵者,但它';it’它不能正常工作_Python_Python 2.7_Codeskulptor - Fatal编程技术网

Python I';我创造了太空入侵者,但它';it’它不能正常工作

Python I';我创造了太空入侵者,但它';it’它不能正常工作,python,python-2.7,codeskulptor,Python,Python 2.7,Codeskulptor,在我的编程课上,我正在做一个太空入侵者游戏。。。我的代码并不完美,但大多数情况下都能正常工作。主要是 我不想透露太多细节(我会提供一个到Codeskulptor页面的链接,这样你就可以自己看到了),但有一件事让我感到不安,那就是我的敌人正在减速,他们应该加速 我正在把水平速度(vx)打印到控制台上,我可以看到它在增加。当vx还在增加时,加速会正常工作,直到某一点,他们再次减速?!当只剩下四个敌人时,这真的很容易发现 所有敌方/外星物体都存储在一个列表中,当它们被激光击中时,它们会被一个名为“ki

在我的编程课上,我正在做一个太空入侵者游戏。。。我的代码并不完美,但大多数情况下都能正常工作。主要是

我不想透露太多细节(我会提供一个到Codeskulptor页面的链接,这样你就可以自己看到了),但有一件事让我感到不安,那就是我的敌人正在减速,他们应该加速

我正在把水平速度(vx)打印到控制台上,我可以看到它在增加。当vx还在增加时,加速会正常工作,直到某一点,他们再次减速?!当只剩下四个敌人时,这真的很容易发现

所有敌方/外星物体都存储在一个列表中,当它们被激光击中时,它们会被一个名为“kill”的函数从列表中删除

功能如下:

def kill(enemy):
    global points
    points += 1
    for enemies in EnemyList_1:
        if enemies.vx > 0:
            enemies.vx += 1.0/4/60
        elif enemies.vx < 0:
            enemies.vx -= 1.0/4/60
    EnemyList_1.remove(enemy)
def杀伤(敌人):
全局点
点数+=1
对于EnemyList_1中的敌人:
如果0.vx>0:
vx+=1.0/4/60
elif.vx<0:
vx-=1.0/4/60
敌人列表1.移除(敌人)
正如您在EnemyList_1列表中看到的敌人对象一样,当调用函数时,敌人对象将被删除(该函数由my Equires类中的以下函数调用):

def激光装置(自身,激光):
全球等待,FriendLaserList
如果abs(self.x-laser.x)
等待变量是我用来在激光发射之间创建冷却时间的变量。别费心看了

我的代码可能看起来像火车失事,但在大多数情况下,它是有效的,我对自己的工作很满意,这是我第一次做这样的事情

游戏的链接(当然没有结束,所有的评论都是荷兰语,给我的老师等),但是所有的变量都是英语:

在您尝试运行它的前几次,它将无法工作,因为SimpleGui模块正在加载图像。(我们的老师只接受存储在Google Drive中的images)

我迫切的问题是:为什么随着时间的推移,当更多的敌人被杀时,我的敌人会减速,而我的代码明确指出他们应该加速?

PS:我尝试过,而不是从列表中删除敌人,只是把他们放在画布外,但这给我带来了激光-敌人碰撞检查的麻烦。我宁愿删除他们,因为这样可以使游戏运行更平稳。我也尝试过。pop()和'del',但我遇到了同样的问题

我为我的n00b代码和我的英语错误道歉

不,但认真地说,不要因为我的代码现在有多糟糕而惊慌失措,很多东西都不起作用,我必须快速更改值等。但一旦一切正常,我会清理它等。现在我只需要修复它,我很困惑这是我做的事情还是只是一个错误

我为那些不想去codeskulptor的人编写的全部代码(警告:太乱了!):

导入simplegui
随机输入
#帧选项
宽度=450.0
高度=600.0
边框=(宽度/16,高度/12,1,'白色')
#维贾德期权
#格洛特·范德维詹登(Grootte van de vijanden)是一位年轻人。
#安塔尔/格罗特。纳图利克·尼特·格罗特·马克恩。。。
敌人大小=20.0
敌方中心点=敌方大小/2.0
敌人排=3
敌方数量=13
敌方数量=敌方行数量*敌方行
#得分
级别=1
分数=0
#斯佩勒
生命=3
播放器大小=22.0
#普拉特耶斯
heart=simplegui.load\u图像('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/hart.png')
heartwh=[heart.get_width(),heart.get_height()]
heartcenter=[heartwh[0]/2,heartwh[1]/2]
#奥维格·瓦里贝伦。
填充=(边框[0]+敌方大小*4.0,边框[1]+敌方大小*0.64285714285)
间距=(宽度-填充[0]*2.0)/(行数/数量-1)
CheckX=填充[0]-边界[0]-敌方中心点
#一级voor de vijanden厢式货车
一类(对象):
image=simplegui.load\u image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/vijand1wit.png')
宽度=图像。获取宽度()
高度=图像。获取高度()
wh=(宽度、高度)
中心=(宽度/2.0,高度/2.0)
大小=(敌人大小,敌人大小*高度/宽度)
vx=敌方尺寸/20.0/60.0
vy=敌方尺寸/2.0
att=2000
定义初始化(self,x,y):
self.x=x
self.y=y
self.pos=[浮动(self.x),浮动(self.y)]
self.x_org=self.pos[0]
#维詹登酒店
def更新(自我):
self.x=self.pos[0]
self.y=self.pos[1]
#尼埃的德维詹登·希滕的贝帕阿尔特。
def喷射(自):
self.attack=random.randrange(0,int(self.att))
如果6 2000*0.95**10:
敌人.att=敌人.att*0.95
elif.att<2000*0.95**10:
敌人.att=敌人.att*0.97
敌人列表1.移除(敌人)
打印透镜(电子列表1)
def elaserkill(激光):
EnemyLaserList.移除(激光)
def flaserkill(激光):
FriendLaserList.移除(激光)
def绘图(画布):
全球层面,积分,生命,等等
#特克斯特、斯考尔、莱文斯等。
canvas.draw_text('LEVENS:',(边框[0]+10,20],20,'white','monospace'))
画布.绘制文本('SCORE:'+str(points),(边框[0]+10,20*2),20,'white','monospace'))
canvas.draw_text('LEVEL:'+str(LEVEL),(WIDTH-BORDER[0]-frame.get_canvas_textwidth('LEVEL:'+str(LEVEL),20,'monospace'),20*2),20,'white,'monospace'))
对于范围(1,寿命+1)内的i:
画布。绘制图像(心脏,
心脏中心,
heartwh,
[边框[0]+10+文本层+20*i,
13],
    def laserhit(self, laser):
        global wait, FriendLaserList
        if abs(self.x - laser.x) < self.size[0] / 2.0 and abs(self.y - laser.y) < self.size[1] / 2.0:
            laser.x = WIDTH
            laser.y = HEIGHT
            laser.pos = [WIDTH, HEIGHT]
            laser.vy = 0
            wait = 0.0
            FriendLaserList = []
            kill(self)
import simplegui
import random

# Frame opties
WIDTH = 450.0
HEIGHT = 600.0
BORDER = (WIDTH / 16, HEIGHT / 12, 1, 'white')

# Vijand opties
# Grootte van de vijanden kan je aanpassen, ook het aantal.
# Aantal/Grootte. Natuurlijk niet te groot maken...
enemy_size = 20.0
enemy_centrepoint = enemy_size / 2.0
enemy_rows = 3
enemy_row_amount = 13
enemy_amount = enemy_row_amount * enemy_rows

# Score
level = 1
points = 0

# Speler
lives = 3
player_size = 22.0

# Plaatjes
heart = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/hart.png')
heartwh = [heart.get_width(), heart.get_height()]
heartcenter = [heartwh[0] / 2, heartwh[1] / 2]

# Overige variabelen.
PADDING = (BORDER[0] + enemy_size * 4.0, BORDER[1] + enemy_size * 0.64285714285)
SPACING = (WIDTH - PADDING[0] * 2.0) / (enemy_row_amount - 1)
CheckX = PADDING[0] - BORDER[0] - enemy_centrepoint


# Class voor de vijanden van level 1
class Enemy_One(object):
    image = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/vijand1wit.png')
    width = image.get_width()
    height = image.get_height()
    wh = (width, height)
    center = (width / 2.0, height / 2.0)
    size = (enemy_size,enemy_size * height/width)
    vx = enemy_size/20.0/60.0
    vy = enemy_size / 2.0
    att = 2000
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.pos = [float(self.x),float(self.y)]
        self.x_org = self.pos[0]
    # Verandert positie vijanden    
    def update(self):
        self.x = self.pos[0]
        self.y = self.pos[1]
    # Bepaalt of de vijanden schieten of niet.
    def shoot(self):
        self.attack = random.randrange(0,int(self.att))
        if 6 <= self.attack <= 7:
                EnemyLaserList.append(EnemyLaser(self.pos[0], self.pos[1]))
    # Bepaalt of de vijanden worden geraakt of niet
    def laserhit(self, laser):
        global wait, FriendLaserList
        if abs(self.x - laser.x) < self.size[0] / 2.0 and abs(self.y - laser.y) < self.size[1] / 2.0:
            laser.x = WIDTH
            laser.y = HEIGHT
            laser.pos = [WIDTH, HEIGHT]
            laser.vy = 0
            wait = 0.0
            FriendLaserList = []
            kill(self)
# Class voor de Fighter (jij)
class Fighter(object):
    image = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/speler.png')
    width = image.get_width()
    height = image.get_height()
    wh = (width, height)
    center = (width / 2.0, height / 2.0)
    vx = 0
    vx_org = 5
    size = (player_size, player_size * height/width)
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.pos = [self.x, self.y]
    def move(self):
        if BORDER[0] + player_size / 2.0 < self.x < WIDTH - BORDER[0] - player_size / 2.0:
            self.x += self.vx
            self.pos = [self.x, self.y]
        elif self.x <= BORDER[0] + player_size / 2.0:
            self.x += 1
        elif self.x >= WIDTH - BORDER[0] - player_size / 2.0:
            self.x -= 1
   # Kijken of de speler wordt geraakt door een laser
    def laserhit(self, laser):
        global lives
        if abs(self.x - laser.x) < self.size[0] / 2.0 and abs(self.y - laser.y) < self.size[1] / 2.0:
            lives -= 1
            elaserkill(laser)
    # Schieten
    def shoot(self):
        global FriendLaserList
        FriendLaserList.append(FriendlyLaser(self.x, self.y))
FriendLaserList = []
# Class voor de laser van de speler
class FriendlyLaser(object):
    image = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/lasergroen.png')
    width = image.get_width()
    height = image.get_height()
    wh = (width, height)
    center = (width / 2, height / 2)
    vy = -10
    size = (enemy_size / 10.0, enemy_size * 4 / 10.0)
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.pos = [self.x, self.y]
    # Verandert positie vriendelijke laser.
    def update(self):
        self.y += self.vy
        self.pos = [self.x, self.y]
        if self.y < BORDER[1] or self.pos == [WIDTH, HEIGHT]:
            flaserkill(self)
# Class voor de vijand lasers
class EnemyLaser(object):
    image = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/laser.png')
    width = image.get_width()
    height = image.get_height()
    wh = (width, height)
    center = (width / 2, height / 2)
    vy = 5
    size = (enemy_size / 10.0, enemy_size * 4 / 10.0)
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.pos = [self.x, self.y]
    # Verandert positie vijandelijke laser.
    def update(self):
        self.y += self.vy
        self.pos = [self.x, self.y]
        if self.y > HEIGHT - 10 or self.pos == [WIDTH, HEIGHT]:
            elaserkill(self)
# Speler
player = Fighter(WIDTH / 2.0, (HEIGHT - BORDER[1]) + (BORDER[1] / 2.0))
# Vijand Laser list
EnemyLaserList = []
# Level 1 vijanden maken
EnemyList_1 = []
def level_1():
    global EnemyList_1, lives, points, EnemyLaserList, level, FriendLaserList, wait
    wait = 0.0
    level = 1
    lives = 3
    points = 0
    EnemyList_1 = []
    EnemyLaserList = []
    FriendLaserList = []
    for i in range(0,enemy_amount + 1):
        # Rij 1
        if i < enemy_row_amount:
            EnemyList_1.append(Enemy_One(PADDING[0] + SPACING * (i),PADDING[1]))
        # Rij 2
        elif enemy_row_amount < i <= enemy_row_amount * 2:
            EnemyList_1.append(Enemy_One(PADDING[0] + SPACING * (i-enemy_row_amount - 1),PADDING[1] + SPACING))
        # Rij 3
        elif i > enemy_row_amount * 2:
            EnemyList_1.append(Enemy_One(PADDING[0] + SPACING * (i-enemy_row_amount * 2 - 1),PADDING[1] + SPACING * 2))

# Vijanden positie verplaatsen
def posupdate():
    global lives
    for enemy in EnemyList_1:
        if enemy.x_org - CheckX <= enemy.pos[0] <= enemy.x_org + CheckX:
            enemy.pos[0] += enemy.vx
        elif enemy.y + enemy.wh[1] >= HEIGHT - BORDER[1]:
            lives = 0
        else:
            enemy.vx = -enemy.vx
            enemy.pos[0] += enemy.vx
            enemy.pos[1] += enemy.vy
# Haal vijanden weg
def kill(enemy):
    global points
    points += 1
    for enemies in EnemyList_1:
        if enemies.vx > 0:
            enemies.vx += 1.0/4/60
        elif enemies.vx < 0:
            enemies.vx -= 1.0/4/60
        if enemies.att > 2000 * 0.95 ** 10:
            enemies.att = enemy.att * 0.95
        elif enemies.att < 2000 * 0.95 ** 10:
            enemies.att = enemy.att * 0.97
    EnemyList_1.remove(enemy)
    print len(EnemyList_1)
def elaserkill(laser):
    EnemyLaserList.remove(laser)
def flaserkill(laser):
    FriendLaserList.remove(laser)
def draw(canvas):
    global level, points, lives, wait
    # Tekst, score, levens, etc.
    canvas.draw_text('LEVENS: ',(BORDER[0] + 10, 20),20, 'white', 'monospace')
    canvas.draw_text('SCORE: ' + str(points),(BORDER[0] + 10, 20 * 2),20, 'white', 'monospace')
    canvas.draw_text('LEVEL: ' + str(level),(WIDTH - BORDER[0] - frame.get_canvas_textwidth('LEVEL:  ' + str(level),20,'monospace'), 20 * 2),20, 'white', 'monospace')
    for i in range(1, lives + 1):
        canvas.draw_image(heart,
                          heartcenter,
                          heartwh,
                            [BORDER[0] + 10 + text_levens + 20 * i,
                             13],
                            (20,
                             20.0 * heartwh[1]/heartwh[0]))
    # Borders voor debuggen
    canvas.draw_line((BORDER[0],0),
                     (BORDER[0],HEIGHT),
                     BORDER[2],
                     BORDER[3]
                     )
    canvas.draw_line((WIDTH-BORDER[0],0),
                     (WIDTH-BORDER[0],HEIGHT),
                     BORDER[2],
                     BORDER[3]
                     )
    canvas.draw_line((0,BORDER[1]),
                     (WIDTH,BORDER[1]),
                     BORDER[2],
                     BORDER[3]
                     )
    canvas.draw_line((0,HEIGHT - BORDER[1]),
                     (WIDTH,HEIGHT - BORDER[1]),
                     BORDER[2],
                     BORDER[3]
                     )
    # Teken vijandelijke lasers
    for laser in EnemyLaserList:
        laser.update()
        canvas.draw_image(laser.image,
                          laser.center,
                          laser.wh,
                          laser.pos,
                          laser.size)
    if points == enemy_amount and level == 1:
        #level = 2
        #levellabel.set_text("Level 2")
        if lives < 4:
            lives += 1
        canvas.draw_text("Je hebt gewonnen!",
                         (WIDTH / 2 - frame.get_canvas_textwidth('Je hebt gewonnen!', 40, 'monospace') / 2,HEIGHT / 2),
                         40, 'white', 'monospace')
        canvas.draw_text("Druk op 'R' voor een replay!",
                         (WIDTH / 2 - 10 - frame.get_canvas_textwidth('Druk op 'R' voor een replay!', 20, 'monospace') / 2,HEIGHT / 2 + HEIGHT / 8),
                         20, 'white', 'monospace')
    if lives <= 0:
        canvas.draw_text("Je hebt verloren!",
                         (WIDTH / 2 - frame.get_canvas_textwidth('Je hebt verloren!', 40, 'monospace') / 2,HEIGHT / 2),
                         40, 'white', 'monospace')
        canvas.draw_text("Druk op 'R' voor een replay!",
                         (WIDTH / 2 - 10 - frame.get_canvas_textwidth('Druk op 'R' voor een replay!', 20, 'monospace') / 2,HEIGHT / 2 + HEIGHT / 8),
                         20, 'white', 'monospace')
    else:
        # Teken & beweeg speler
        player.move()
        canvas.draw_image(player.image,
                          player.center,
                          player.wh,
                          player.pos,
                          player.size)
        # Laser hit checken voor de speler
        for laser in EnemyLaserList:
                player.laserhit(laser)
        # Schieten check
        if wait > 0.0:
            wait -= 1/60.0
        else:
            wait = 0.0
        # Laser v.d. speler tekenen
        for laser in FriendLaserList:
            laser.update()
            canvas.draw_image(laser.image,
                              laser.center,
                              laser.wh,
                              laser.pos,
                              laser.size)
        # Level 1 vijanden
        if level == 1:        
            # Update posities
            for enemy in EnemyList_1:
                posupdate()
                enemy.update()
                enemy.shoot()
                for laser in FriendLaserList:
                    enemy.laserhit(laser)

            # Teken vijanden
            for enemy in EnemyList_1:
                canvas.draw_image(enemy.image,
                                enemy.center,
                                enemy.wh,
                                enemy.pos,
                                enemy.size)
    # Debug Labels
    pointslabel.set_text("Punten: " + str(points))
    liveslabel.set_text("Levens: " + str(lives))
# Debug vermoorden van vijanden
# Ze worden sneller naarmate er meer doodgaan.
# Ze gaan meer aanvallen naarmate er meer doodgaan.
indexlist = []
wait = 0.0
def keydown(key):
    global wait
    # Speler bewegen naar links
    if key == simplegui.KEY_MAP['left']:
        player.vx = -player.vx_org
    # Speler bewegen naar rechts
    elif key == simplegui.KEY_MAP['right']:
        player.vx = player.vx_org
    # Spel opnieuw spelen
    elif key == simplegui.KEY_MAP['r']:
        level_1()
    # Schieten
    elif key == simplegui.KEY_MAP['space']:
        if wait == 0.0:
            wait = 1.0
            player.shoot()
def keyup(key):
    if key == simplegui.KEY_MAP['left']:
        player.vx = 0
    elif key == simplegui.KEY_MAP['right']:
        player.vx = 0

def button_kill():
    global points, indexlist
    # 'Dood' vijand, voor testen!
    kill(EnemyList_1[0])

def button_lives_add():
    global lives
    lives += 1
def button_lives_del():
    global lives
    lives -= 1
# Frame maken
frame = simplegui.create_frame("Game",WIDTH,HEIGHT)
frame.set_draw_handler(draw)
frame.set_keyup_handler(keyup)
frame.set_keydown_handler(keydown)

text_levens = frame.get_canvas_textwidth('LEVENS:', 20, 'monospace')

# Debug buttons.
debuglabel = frame.add_label("Debug knoppen.")
button = frame.add_button("Random Kill Enemy",button_kill,150)
pointslabel = frame.add_label("")
liveslabel = frame.add_label("")
levellabel = frame.add_label("Level: " + str(level))
button2 = frame.add_button("Extra leven",button_lives_add,150)
button2 = frame.add_button("Een leven minder",button_lives_del,150)

# Starten (level 1 & frame)
level_1()
frame.start()
def posupdate():
global lives
for enemy in EnemyList_1:
    if enemy.x_org - CheckX <= enemy.pos[0] <= enemy.x_org + CheckX:
        enemy.pos[0] += enemy.vx
    elif enemy.y + enemy.wh[1] >= HEIGHT - BORDER[1]:
        lives = 0
    else:
        enemy.vx = -enemy.vx
        enemy.pos[0] += enemy.vx
        enemy.pos[1] += enemy.vy
class Enemy_One(object):
image = simplegui.load_image('http://googledrive.com/host/0BzEhWaGeU4yUVEFJazFnVDJiRFE/vijand1wit.png')
width = image.get_width()
height = image.get_height()
wh = (width, height)
center = (width / 2.0, height / 2.0)
size = (enemy_size,enemy_size * height/width)
vx = 0.5
vy = enemy_size / 2.0
att = 2000
def __init__(self, x, y):
    self.x = x
    self.x_org = self.x
    self.y = y
    self.pos = [self.x,self.y]
# Verandert positie vijanden    
def update(self):
    global lives
    if self.y + self.wh[1] >= HEIGHT - BORDER[1]:
        lives = 0
    if self.x <= self.x_org - CheckX:
        self.x = self.x_org - CheckX
        self.vx = -self.vx
        self.x += self.vx
        self.y += self.vy
    elif self.x >= self.x_org + CheckX:
        self.x = self.x_org + CheckX
        self.vx = -self.vx
        self.x += self.vx
        self.y += self.vy
    else:
        self.x += self.vx
    self.pos = [self.x, self.y]