1943中途岛海战2020年8月22日海龟画图版(原雷电模拟升级版)

主程序源代码:

"""
   1943中途岛海战2020年8月22日.py
   这是重新编程的用纯粹的Python海龟模块制作的一个飞机大战游戏。
   老版本就叫雷电模拟。在游戏中用鼠标操作飞机,敌机会疯狂扑过来,
   并且会朝玩家飞机发射子弹。玩家飞机只有一条命令,被击中了就会坠毁。
   只要击毁了300架敌机,玩家就能过关!
"""
import time
from bullet import *                       # 从bullet模块导入所有命令
from glob import glob
from particle import *                     # 从particle导入所有命令
from enemy import Enemy                    # 从enemy导入Enemy类
from plane import Plane                    # 从plane导入Plane类
from random import choice                  # 从随机模块导入选择命令
from turtle import Screen                  # 从turtle导入Screen命令
from explosion import explode              # 从explosion导入explode命令
from winsound import PlaySound,SND_LOOP,SND_ASYNC

target= 300                                # 击毁目标数量则胜利
plane_image = "res/飞机.gif"               # 玩家飞机造型图
enemy_image = "res/敌机.gif"               # 敌机造型图
bullet_image = "res/子弹.gif"              # 子弹造型图
images = glob("explosion/*.gif")           # 爆炸序列帧图
project_name = '1943中途岛海战2020年8月22日海龟画图版'

screen = Screen()                          # 新建窗口和屏幕
screen.delay(0)                            # 延时为0毫秒
screen.bgcolor('blue')                     # 背景颜色为蓝色
screen.setup(448,512)                      # 宽度和高度
screen.title(project_name)                 # 在标题栏上显示项目名称 
screen.addshape(plane_image)               # 注册玩家飞机造型到造型字典
screen.addshape(enemy_image)               # 注册敌机造型到形状字典
screen.addshape(bullet_image)              # 注册子弹造型到形状字典
[screen.addshape(im) for im in images]     # 注册爆炸图到造型字典

PlaySound('res/重复.wav',SND_LOOP|SND_ASYNC)   # 异步重复播放背景音乐

# 封面显示程序段
display_cover = True                       # 定义全局变量控制下面的while循环
def end_display_cover():                   # 定义函数
    global display_cover
    display_cover = False
    screen.onkeypress(None,'space')
    
screen.onkeypress(end_display_cover,'space')# 绑定空格键到函数上
screen.listen()                             # 监听按键检测
# 不断地显示两张背景图片,所以能看到字在闪动
while display_cover:
    screen.bgpic('res/bg1.png')
    screen.update()
    time.sleep(0.2)
    screen.bgpic('res/bg2.png')
    screen.update()
    time.sleep(0.2)
screen.bgpic('nopic')                         # 不显示背景图

# 写上游戏目标文字
w = Turtle(visible=False)                     # 新建隐藏的海龟对象
w.penup()                                     # 抬笔 
w.sety(200)                                   # 设置坐标
w.color('gray')                               # 设置颜色为灰色
ft = ('',14,'normal')                         # 字体风格三元组 
info = '目标!击毁' + str(target) + '敌机'    # 要写的文字
w.write(info,align='center',font=ft)          # 写上文字  
info = 'writed by lixingqiu'
w.sety(175)                                   # 设置y坐标为175  
w.write(info,align='center',font=ft)          # 写上作者姓名拼音

# 角色准备阶段

bs = []                                       # 子弹列表
ps = []                                       # 敌机发出的粒子列表

player = Plane(plane_image)                   # 实例化玩家飞机  
es = [Enemy(enemy_image) for i in range(10)]  # 生成10架敌机

# 游戏循环
frames = 0                                    # 统计循环次数
running = 1                                   # 控制while循环的变量                             
counter = 0                                   # 统计被击中的敌机数量
while running:
    # 生成子弹,并且移动玩家飞机的子弹
    spawn_bullet(bs,frames,bullet_image,player.pos())
    # 生成粒子,并且移动敌机所发射的粒子
    spawn_particle(ps,frames,choice(es).pos(),player.pos())

    # 粒子和玩家飞机的碰撞检测,粒子碰到了玩家飞机,则玩家飞机阵亡,作战失败!
    for p in ps:                              # 每一颗粒子
        if p.distance(player)<20:             # 粒子碰到玩家飞机
            player.hideturtle()               # 隐藏玩家飞机
            explode(player.pos(),images)      # 玩家飞机阵亡,产生爆炸效果
            running = 0                       # 结束循环,显示作战失败图 

    # 敌机移动与碰撞检测
    for e in es:                              # 每一架敌机                
        e.move()                              # 敌机移动
        if e.collide(player):                 # 如果敌机碰到玩家飞机
            e.ht()          
            explode(e.pos(),images)           # 产生爆炸效果
            e.goto_top()                      # 到最顶上去
            player.hideturtle()               # 隐藏玩家飞机
            explode(player.pos(),images)      # 玩家飞机阵亡,产生爆炸效果
            running = 0
        for b in bs:                          # 每一颗子弹
            if e.collide(b):                  # 如果敌机碰到子弹
               e.ht()                         # 敌机隐藏
               counter +=1                    # 统计一下
               info = '当前已击毁 ' + str(counter) +  ' 架敌机'
               screen.title(info)             # 在标题栏里显示
               if counter == target:          # 达到了目标数量则胜利
                   running = 2                # 2表示成功结束                              
               explode(e.pos(),images)        # 在敌机坐标产生爆炸效果
               e.goto_top()
            
    frames += 1
    time.sleep(0.001)
    if running == 2:break

# 游戏结尾
player.ht()                                   # 隐藏玩家飞机        
w.clear()                                     # 擦掉所写的字
[p.kill() for p in ps]                        # 删除每一颗粒子
[ e.ht() for e in es]                         # 隐藏每一架敌机

if running == 2:
    """作战成功"""
    images = ['res/success1.png','res/success2.png'] # 成功的时候显示的图形表
elif running == 0 :
    images = ['res/失败1.png','res/失败2.png']       # 作战失败显示的图形列表

# 不断地切换游戏结束时的两张背景图片
i = 0
while True:    
    screen.bgpic(images[i])                   # 切换到索引为i的背景图
    screen.update()                           # 更新屏幕显示
    time.sleep(0.2)                           # 等待0.2秒
    i = 1 - i                                 # 切换到下一个索引号

教程前言

用Python海龟画图能做什么?很多人可能会回答为绘图。这是正确的回答。但是如果想进一步学习Python海龟画图,那就不仅仅是绘图了。也可以用turtle模块制作各种各样的动画、游戏、课件、音乐艺术作品等等。作者本人就制作很多很多,大多数放在个人博客里。

Python海龟画图模块基于tkinter模块开发。而tkinter是一个GUI库。用tkinter模块可以创建画布,在画布上移动各种“项目”,让它们交互,从而制作动画和游戏。turtle的画布就是tkinter的画布,所以用turtle模块当然也可以做动画与游戏。

这个教程是作者用纯粹的Python海龟模块编写的叫《1943中途岛海战》射击游戏的详细教程。采用了模块化的设计方法,把作品分为了6个部分。每个模块都可以单独运行,通过主程序让模块中的角色交互,从而展现出最终的游戏场景。

本教程适合于学习了Python基础的人士阅读。推荐学到了Python类与继承。不过在本教材中,首先会复习一下Python的类与继承。在阅读之前,读者应该多多试玩这个游戏,增加“游戏感”。试玩以后,仔细阅读源代码,最后看教程与视频,以下是教程目录

教程目录

1 1943中途岛海战主要介绍
2 万物皆对象
3 Point类的移动方法
4 类的继承
5 测试Circle类
6 Turtle类的继承
7 Ball类源代码简版
8 Ball类初始化方法浅析
9 Ball类移动方法浅析一
10 Ball类移动方法浅析二
11 Ball类is_on_edge方法
12 进化版Ball类源代码
13 Ball类的茶炉夜话
14 如何做游戏的茶炉夜话
15 1942美日的约会
16 1943中途岛海战是街机游戏
17 1943中途岛海战文件夹预览
18 1943中途岛海战explosion文件夹预览
19 1943中途岛海战res文件夹预览
20 一览众山小
21 主程序框架
22 bullet模块介绍
23 bullet.py文件结构
24 Bullet类的框架
25 Bullet类初始化方法源码
26 Bullet类__init__方法介绍
27 Bullet类kill方法之谜
28 海龟诞生时究竟发生了什么?
29 海龟为什么要自杀?
30 Bullet类子弹移动方法
31 spawn_bullet函数说明
32 测试bullet模块
33 particle模块介绍
34 particle.py文件结构
35 Particle类的框架
36 Particle类的方法概述
37 spawn_particle函数
38 测试particle模块
39 enemy模块介绍
40 enemy.py文件结构
41 Enemy类的框架
42 测试enemy模块
43 plane模块介绍
44 plane.py文件整体结构
45 Plane类主要框架
46 测试plane模块
47 explosion模块介绍
48 explode函数主要代码
49 测试explosion模块
50 主程序整体流程图
51 主程序变量一览表
52 屏幕设置与注册造型
53 造型字典与造型列表
54 循环播放背景音乐
55 封面显示说明
56 封面显示程序段
57 游戏目标文字
58 角色准备阶段
59 游戏主循环三变量
60 生成子弹和粒子
61 碰撞检测简介
62 粒子和玩家飞机的碰撞检测
63 敌机移动与碰撞检测上
64 敌机移动与碰撞检测下
65 循环计数判断结束
66 游戏结束
67 动态背景画面
68 作者简介

编者的话

大家好,我是李兴球,也就是本教材的编写者。首先我是一名创造者,然后我也是一名校外培训机构的编程老师。这些年来,我用Python的海龟画图模块,还有些第三方模块编写了很多很多的程序。这个版本的飞机大战相对于本人曾经创造过的版本,反而简化及优化了很多代码。目的是为了方便教学及读者们对这个作品进行扩展,所以并没有设计太多内容。比如,在游戏中,滚动的纵版背景就去掉了,因为读者学习完这个作品后,完全可以自己加上去。例如,玩家飞机的子弹是自动发射的,读者也可以改为按j键发射子弹,按wsad或上下左右方向箭头发射子弹。我也没有给这个游戏设计道具。游戏的难易度也没有进行明显的可视化选择性的设计。因为作为教程,不能太复杂,这些读者学习完后都可以自行发挥。如,变成多关卡的,第一关敌机采用什么阵型,第二关敌机又是什么阵型,一直到最后一关是来个大BOSS。

这个作品其实不难,我相信,任何人都能看懂,大概浏览一下是学不会的,需要对本教材的每个字认认真真地看,不断地揣摩本人的写作意图,这样才能学得更好。

本人还会原创更多的作品,编写更多的教材,录制更多的视频,不断地在Python这条道路上越走越远,欢迎随时查看我的博客 www.lixingqiu.com。

《1943中途岛海战2020年8月22日版》是用纯粹的Python海龟画图模块制作的一个版本。
它的教程已经制作完毕,共包括:12个python源文件(含例程),8个视频教程,文字教程76页,音乐与图片素材若干。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李兴球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值