Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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 在kivy游戏中创建多个敌人_Python_For Loop_Kivy_Kivy Language - Fatal编程技术网

Python 在kivy游戏中创建多个敌人

Python 在kivy游戏中创建多个敌人,python,for-loop,kivy,kivy-language,Python,For Loop,Kivy,Kivy Language,我目前正在kivy做一个太空inavders游戏。我有一艘宇宙飞船,它向敌人发射子弹。敌人向右移动,当他们到达边界时,他们向左移动,这种情况一次又一次地发生。一切都很完美。我可以射击,敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人设置一个自己的类,并一次又一次地编写相同的代码。我的想法是,我将创建一个敌人列表,然后从列表中显示他们。所以看起来好像有很多敌人。但是我不知道我怎么能做到这一点,而且我从一天起就没能做到。而且,当你有其他想法时,如果你能提出,那就太好了。这是我的密码 敌人阶

我目前正在kivy做一个太空inavders游戏。我有一艘宇宙飞船,它向敌人发射子弹。敌人向右移动,当他们到达边界时,他们向左移动,这种情况一次又一次地发生。一切都很完美。我可以射击,敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人设置一个自己的类,并一次又一次地编写相同的代码。我的想法是,我将创建一个敌人列表,然后从列表中显示他们。所以看起来好像有很多敌人。但是我不知道我怎么能做到这一点,而且我从一天起就没能做到。而且,当你有其他想法时,如果你能提出,那就太好了。这是我的密码

敌人阶级:

class Enemy(Widget):
    def collision(self,ball,enemy,enemy1):
        if self.collide_widget(ball):
            enemy.y = randint(300,500)
            enemy1.y = randint(300,500)
            ball.x = -1000
            ball.y = self.height / self.width


我的主要游戏课程:

class SapceGame(Widget):
enemy = ObjectProperty(None)
    enemy = ObjectProperty(None)
    x_change = NumericProperty(3)
    y_change = NumericProperty(-50)

    def enemy_movement(self, *args):
        self.enemy.x -= self.x_change
        if self.enemy.x  >= self.width -64:
            self.x_change = 3
            self.enemy.y += self.y_change
        elif self.enemy.x  <=0:
            self.x_change = -3
            self.enemy.y += self.y_change
        elif self.enemy.y < 0:
            print('Game Over')
    def update(self,dt):
        self.enemy_movement()

面向对象编程的主要概念之一是每个对象处理自己的行为。因此,你的
敌人
对象应该知道如何移动。然后,您只需要保留一个
敌人
对象的列表,并告诉每个对象在每次更新时执行其移动行为

以下是您的代码的修改版本:

from random import randint
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.widget import Widget


class Enemy(Widget):
    x_change = NumericProperty(3)
    y_change = NumericProperty(-50)

    def collision(self,ball,enemy,enemy1):
        if self.collide_widget(ball):
            enemy.y = randint(300,500)
            enemy1.y = randint(300,500)
            ball.x = -1000
            ball.y = self.height / self.width

    def move(self, *args):
        self.x -= self.x_change
        if self.x  >= self.parent.width -64:
            self.x_change = 3
            self.y += self.y_change
        elif self.x  <=0:
            self.x_change = -3
            self.y += self.y_change
        if self.y < 0:
            print('Game Over')
            App.get_running_app().stop_game()


class SpaceGame(Widget):
    enemies = ListProperty([])

    def add_enemy(self, *args):
        enemy = Enemy()
        enemy.pos = (randint(0, self.width - 64), self.height - 64)
        self.add_widget(enemy)
        self.enemies.append(enemy)

    def update(self,dt):
        for enemy in self.enemies:
            enemy.move()

Builder.load_string('''
<Enemy>:
    size_hint: None, None
    size: 64,64
    canvas:
        Rectangle:
            pos:self.pos
            size: self.size
            source:'alien.png'
''')


class SpaceApp(App):

    def build(self):
        game = SpaceGame()

        # add enemies at 5 second intervals
        self.new_enemy_event = Clock.schedule_interval(game.add_enemy, 5)

        # pro second 60 frames are shown
        self.updateEvent = Clock.schedule_interval(game.update, 1.0/60.0)

        return game

    def stop_game(self):
        self.updateEvent.cancel()
        self.new_enemy_event.cancel()


SpaceApp().run()
来自随机导入randint
从kivy.app导入应用程序
从kivy.clock导入时钟
从kivy.lang导入生成器
从kivy.properties导入ObjectProperty、NumericProperty、ListProperty
从kivy.uix.widget导入widget
类(小部件):
x_change=NumericProperty(3)
y_变化=数值属性(-50)
def碰撞(自身、球、敌人、敌人1):
如果self.collide_小部件(球):
敌方y=randint(300500)
enemy1.y=randint(300500)
ball.x=-1000
ball.y=自高度/自宽度
def移动(自身,*参数):
self.x-=self.x_变化
如果self.x>=self.parent.width-64:
self.x_change=3
self.y+=self.y\u变化

elif self.x嗨,太棒了。多谢各位。但是我有两个问题,我能控制敌人的数量吗。例如,我想要6个敌人,而不是增加敌人5秒。我该如何处理分数。我可以处理碰撞,但我不能处理kv文件中的分数。我无法从kv文件中获得参考。我修复了它,我只是需要一个or循环来满足我的愿望。但是你能帮我记下分数吗?在我的kv文件中,我有文本:str(root.friend.score)。在敌方类中,我有score=NumericProperty(0),每次它发生冲突时,我都添加self.score+=1。但我得到一个错误,它不能得到我的标签的参考。我无法将我的标签与我的敌人分类联系起来,我认为tat应该作为一个单独的问题提交。
class SpaceApp(App):

    def build(self):
        game = PongGame()

        # pro second 60 frames are shown
        Clock.schedule_interval(game.update, 1.0/60.0)

        return game



SpaceApp().run()


Now when I want to create more enemies I have to write the same code again and again. 
from random import randint
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.widget import Widget


class Enemy(Widget):
    x_change = NumericProperty(3)
    y_change = NumericProperty(-50)

    def collision(self,ball,enemy,enemy1):
        if self.collide_widget(ball):
            enemy.y = randint(300,500)
            enemy1.y = randint(300,500)
            ball.x = -1000
            ball.y = self.height / self.width

    def move(self, *args):
        self.x -= self.x_change
        if self.x  >= self.parent.width -64:
            self.x_change = 3
            self.y += self.y_change
        elif self.x  <=0:
            self.x_change = -3
            self.y += self.y_change
        if self.y < 0:
            print('Game Over')
            App.get_running_app().stop_game()


class SpaceGame(Widget):
    enemies = ListProperty([])

    def add_enemy(self, *args):
        enemy = Enemy()
        enemy.pos = (randint(0, self.width - 64), self.height - 64)
        self.add_widget(enemy)
        self.enemies.append(enemy)

    def update(self,dt):
        for enemy in self.enemies:
            enemy.move()

Builder.load_string('''
<Enemy>:
    size_hint: None, None
    size: 64,64
    canvas:
        Rectangle:
            pos:self.pos
            size: self.size
            source:'alien.png'
''')


class SpaceApp(App):

    def build(self):
        game = SpaceGame()

        # add enemies at 5 second intervals
        self.new_enemy_event = Clock.schedule_interval(game.add_enemy, 5)

        # pro second 60 frames are shown
        self.updateEvent = Clock.schedule_interval(game.update, 1.0/60.0)

        return game

    def stop_game(self):
        self.updateEvent.cancel()
        self.new_enemy_event.cancel()


SpaceApp().run()