python simple tank war 简单坦克大战 used turtle module by lixingqiu

python simple tank war 简单坦克大战 used turtle module by lixingqiu

python turtle坦克大战tank war by lixingqiu李兴球

坦克是用海龟画图画出来的,不是很漂亮哦。下面是封面。
python turtle坦克大战tank war by lixingqiu李兴球

以下是部分代码预览:

"""坦克大战,小坦克被一群大坦克包围,情况十分危急。
  小坦克的优势在于速度快,能连续发射。制作日期:2018年10月。
  这是一个用python的海龟画图模块制作的射击小游戏,需要用鼠标指针操作小坦克突围!
  制作日期:2018年10月,作者:李兴球。

"""
#从海龟模块导入所有命令

from turtle import *
import math
from random import randint

def load_sound():
    """加载声音与播放背景音乐"""
    sound_normal = True
    explode_sound= None
    shoot_sound = None
    return sound_normal,explode_sound,shoot_sound
        
def init_screen():
    """初始化屏幕,注册坦克形状"""
    screen = Screen()
    screen.setup(width,height)
    p = ((0,0),(50,0),(50,80),(10,80),(10,150),(-10,150),(-10,80),(-50,80),(-50,0))
    screen.addshape("tank",p)        # 注册tank形状
    screen.bgcolor("blue")           # 屏幕背景色
    screen.title(gametitle)          # 设定屏幕标题
    screen.colormode(255)            # 设定颜色模式
    screen.delay(0)                  # 屏幕延时为0
    screen.bgpic("封面设计.png")     # 封面加载


class Bullet(Turtle):
    """炮弹类,炮弹生成后会自己移动,直到碰到边缘。"""
    def __init__(self,x,y,h):
        Turtle.__init__(self,visible=False,shape="circle")
        self.penup()
        self.dead = False
        self.goto(x,y)
        self.setheading(h)
        self.showturtle()
        self.move()
        
    def move(self):
        """炮弹移动,碰到边缘就‘死亡’"""
        self.fd(10)
        if self.bumpedge():self.dead = True


    def bumpedge(self):
        """碰到边缘返回True,否则False"""
        return abs(self.xcor())>width/2 or abs(self.ycor())>height/2
        
class NPCtank(Turtle):
    deadcount = 0                         #统计数量的类变量
    def __init__(self,mytank,my_bullet):
        """敌方坦克的敌人就是mytank,my_bullet是我方炮弹列表"""
        Turtle.__init__(self,shape='tank',visible=False)
         
        self.shapesize(0.3,0.3)
        color1 = randint(0,255),randint(0,255),randint(0,255)
        self.color("black",color1)
        self.penup()
        self.setheading(randint(1,360))
        self.fd(randint(200,height*0.4))   # 配合随机方向让npc随机移到一个地方    
        self.enemy = mytank
        self.enemy_bullet = my_bullet         
        self.face_enemy()                  # 一出生就面向mytank
        self.dead = False
        self.move()
        
    def move(self):
        """移动npc坦克,有时会面向mytank"""
        self.fd(1)
        self.shoot()      # 设置一定的机率发射炮弹
        self.bumpedge()   # 碰到屏幕边缘就向后转
        self.bumpenemy()  # 碰到敌人(mytank)后会爆炸,mytank当然也会爆炸,游戏结束
        self.bumpbullet() # 碰到我方炮弹就爆炸

    def bumpenemy(self):
        """碰到敌人就两方都死亡,npc的敌人就是mytank"""
        r = self.distance(self.enemy)
            
            
    def bumpbullet(self):
        """碰到我方炮弹就死亡"""
             
    def bumpedge(self):
        """bumpedge就掉头"""
        faraway = abs(self.xcor())>width/2 or abs(self.ycor())>height/2  
        if faraway:self.right(180) # 掉转头

    def face_enemy(self):
        """面向敌人,NPC的敌人就是mytank,可以增加代码让转向更平滑"""
        self.setheading(self.towards(self.enemy.position()))
        
    def shoot(self):
        """敌坦克的发射方法,同时把‘死了’的炮弹移去"""
 
        
class Bomb(Turtle):
    """炸弹类,它实例化后,自己就会切换造型,从而“爆炸”"""
    def __init__(self,x,y,images):
        """x,y是爆炸的坐标,images是已注册到屏幕形状列表的造型图片"""
        Turtle.__init__(self,visible=False)
        self.penup()
        self.goto(x,y)
        self.index = 0                 # 造型索引编号从0开始
        self.amount  = len(images)     # 造型数量
        self.images = images           # 造型列表
        self.showturtle()              # 显示
        if snd_normal: explode_sound.play()
        self.next_costume()      # 利用屏幕的定时器功能使之循环一定的次数
        
    def next_costume(self):
        if self.index < self.amount:     # 小于总数量就换造型       
           self.shape(self.images[self.index]) # 从列表取指定索引的图片,设为海龟的形状
           self.index = self.index + 1
           screen.ontimer(self.next_costume,50)

def make_mytank():
    """生成我方坦克对象,并返回到主程序"""

def mytank_wait_bump_enemybullet():
    """我方坦克每隔10豪秒等待是否碰到敌方炮弹"""
 

def follow_mouse(event):
    """本函数让小海龟面朝鼠标指针移动"""
        
    
def shoot(x,y):
    """mytank发射函数,被绑定在screen.onclick事件上"""


class Writer(Turtle):
    """用来在屏幕上写字的海龟对象"""
    def __init__(self,y):
        Turtle.__init__(self,visible = False)
        self.penup()
        self.sety(y)
        self.color("cyan")
        self.font = ("黑体",20,"normal")
    def print(self,string):
        self.clear()        
        self.write(string,align='center',font=self.font)
           

def start_game():
    screen.bgpic("草地.png")
     
    
if __name__ =="__main__":
    
    gametitle = "坦克大战_海龟画图版_作者:李兴球"
    tanksamount = 20                          # 坦克数量
    width,height=800,700                      # 屏幕宽度,高度
    enemybullet = []                          # 敌方炮弹列表
    mybullet = []                             # 我方炮弹列表
    """声音是否正常,爆炸声,射击声"""
    snd_normal,explode_sound,shoot_sound = load_sound()   # 加载声音
    screen,explosion_images = init_screen()   # 初始化屏幕,显示封面,返回screen和爆炸造型列表
    mytank = make_mytank()                    # 我方坦克
    top_turtle = Writer(310)                  # 顶部写字龟
    top_turtle.print("当前击毁敌方坦克数:0") # 在顶部写些字
    bottom_turtle = Writer(-330)              # 底部写字龟    
    screen.onkeypress(start_game,"space")     # 注册按空格事件,生成敌方坦克等等
    mytank_wait_bump_enemybullet()            # 等待碰到敌方炮弹 
    screen.listen()                           # 给屏幕设置焦点
    screen.mainloop()                         # 进入主循环    

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

李兴球

李兴球的博客是Python创意编程原创博客

评论已关闭。