太空入侵者2019年6月17版设计框架,space invader made by turtle module

有一款最伟大的游戏,那就是太空入侵者,它的英文名为space invader。自1978年发售已来,不知被移植,模仿多少遍。游戏的剧情很简单,一群邪恶的异星人,有组织有秩序地排成了一个大方阵,向地球袭来.玩家的目标就是在它们冲到屏幕底端前消灭它们。太空入侵者的成功是空前绝后的。.在日本,机厅里摆放的除了<太空入侵者>还是<太空入侵者>,而生意照样异常火爆。这个游戏甚至导致了日圆硬币的短缺,以致于日本政府不得不将日圆硬币的流通量加大了四倍! 下面只是用海龟画图模块稍微模拟一下。

"""
   太空入侵者.py
   2019年6月17日版。
   space invader是一个经典的街机游戏,这里用turtle模块稍微模拟了一下。
   本人3年前采用turtle模块,使用面向过程的方法编写过这个游戏。
   这是采用面向对象方法,全部重新编程的更新版本。
   这一版本的激光威力更大哦,能直接穿透任何物体。
   
"""

import time
from turtle import Turtle,Screen
from winsound import PlaySound,SND_ASYNC

def write_result(string):
    """当游戏胜利或失败的汉字"""
    tmp = Turtle(visible=False)
    tmp.penup()
    tmp.color("yellow")
    tmp.write(string,align='center',font=('',32,'normal'))
            
class Laser(Turtle):
    """激光类,继承自海龟,实例化后会自行在定时器作用下移动"""
    group = []
    def __init__(self,position):
        pass

    def move(self):
        """不断地移动"""
        self.fd(10)
        if self.ycor() > self.sh//2 :
            self.ht()
            Laser.group.remove(self)
            print("移除激光")
        else:
            self.screen.ontimer(self.move,10)        
            
class Alien(Turtle):
    """外星飞船类,实例化后会每隔2秒向下移动,超过玩家飞船的坐标
       则游戏失败!所有飞船被消灭则游戏成功!
    """
    beyond = False
    group = []
    def __init__(self,image,position,player):
        """image:造型,position:坐标"""
        Turtle.__init__(self,shape=image,visible=False)
        self.penup()
        self.player_top = player.ycor()+25
        self.goto(position)
        self.st()
        self.movedown()
        Alien.group.append(self)   # 加入到组中

    def movedown(self):
        """不断地向下移动"""
        pass
        
class Plane(Turtle):
    """玩家飞船类"""
    发射声音='laser.wav'
    def __init__(self,image,position,keys):
        """image:造型,position:坐标,keys:按键表"""
        pass

    def move(self):
        """不断地在水平方向上移动"""
        pass
        
    def moveleft(self):
        self.dx = -5
        
    def moveright(self):
        self.dx = 5        

    def bounce_on_edge(self):
        """中心点碰到屏幕边缘就反弹"""
        if abs(self.xcor()) > self.sw//2:
            self.dx = -self.dx
        
    def shoot(self):
        """如果超过上次发射的时间则发射"""
        pass

    def _delay(self):
        """超时才可以再次发射"""
        if time.time() - self.start_time > self.shoot_interval:
            self.can_shoot = True
            self.screen.onkeypress(self.shoot,self.keys[2])
        else:
            self.screen.ontimer(self._delay,500)        
    
def main():

    width,height = 800,600
    screen = Screen()
    screen.delay(0)
    screen.bgcolor("black")
    screen.setup(width,height)
    screen.title("太空入侵,海龟画图版,作者:李兴球 www.lixingqiu.com")   
    
    战机 = "战机.gif"
    screen.addshape(战机)
    敌人 = "敌人.gif"
    screen.addshape(敌人)
    player1 = Plane(战机,(0,50-height//2),("Left","Right","Up"))

    # 生成外星人队列
    for x in range(50-width//2,width//2,70):
        for y in range(height//2-30,00,-50):
            Alien(敌人,(x,y),player1)
        
    def collide_check():
        """每隔10毫秒检测激光和外星飞船的碰撞"""
        for laser in Laser.group:
            for alien in Alien.group:
                if laser.distance(alien) < 25:
                    alien.ht()
        for index in range(len(Alien.group)):
            alien = Alien.group[index]
            if alien.isvisible() == False:
                Alien.group.remove(alien)
                break
        if len(Alien.group) == 0 :
            write_result("成功!")
            return
        screen.ontimer(collide_check,10)

    collide_check()    
    screen.listen()
    screen.mainloop()

if __name__ == "__main__":

    main()


    

python太空入侵space invader turtle