Crossin的编程教室

如何开发一个打飞机游戏

1. 从官网 python.org 下载 Python 并安装。

Image

如果安装遇到问题,可来交流群讨论。

2. 用 pip 安装 pygame 模块

pip install pygame
Image

3. 编写代码,在窗口里显示一张飞机图片

import pygame
pygame.init()screen = pygame.display.set_mode((450,800), 0, 32)plane = pygame.image.load('plane.png')screen.blit(plane, (200, 400))
while True:foreventin pygame.event.get():ifevent.type == pygame.QUIT:            pygame.quit()            exit()    pygame.display.update()
Image

4. 让飞机随着鼠标位置进行移动

import pygame
pygame.init()WHITE = (255, 255, 255)screen = pygame.display.set_mode((450,800), 0, 32)plane = pygame.image.load('plane.png')

while True:foreventin pygame.event.get():ifevent.type == pygame.QUIT:            pygame.quit()            exit()
    x, y = pygame.mouse.get_pos()    x -= plane.get_width()/2    y -= plane.get_height()/2    screen.fill(WHITE)    screen.blit(plane, (x, y))
    pygame.display.update()

5. 创建更多的敌机,从屏幕顶部向下移动

import pygameimport random
pygame.init()WHITE = (255, 255, 255)screen = pygame.display.set_mode((450,800), 0, 32)plane = pygame.image.load('plane.png')
classEnemy:defrestart(self):self.x = random.randint(50, 400)self.y = random.randint(-200, -50)self.speed = random.random() * 2 + 0.5
def__init__(self):self.restart()self.image = pygame.image.load('enemy.png').convert_alpha()
defmove(self):ifself.y < 800:self.y += self.speedelse:self.restart()
classPlane:defrestart(self):self.x = 200self.y = 600
def__init__(self):self.restart()self.image = pygame.image.load('plane.png').convert_alpha()
defmove(self):        x, y = pygame.mouse.get_pos()        x-= self.image.get_width() / 2        y-= self.image.get_height() / 2self.x = xself.y = y
plane = Plane()enemies = []for i in range(5):    enemies.append(Enemy())
whileTrue:for event in pygame.event.get():if event.type == pygame.QUIT:            pygame.quit()            exit()
# 绘制背景    screen.fill(WHITE)# 绘制敌机for e inenemies:        e.move()        screen.blit(e.image, (e.x,e.y))# 绘制玩家        plane.move()        screen.blit(plane.image, (plane.x, plane.y))
    pygame.display.update()
Image

6. 增加碰撞检测。如果撞上敌机,则游戏结束

# ……# 前略
gameover = Falsefont = pygame.font.Font(None, 32)
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()
# 绘制背景screen.fill(WHITE)
if not gameover:# 绘制敌机for e in enemies:if checkCrash(e, plane):gameover = Truee.move()screen.blit(e.image, (e.x,e.y))# 绘制玩家plane.move()screen.blit(plane.image, (plane.x, plane.y))else:text = font.render("Game Over!", 1, (0, 0, 0))screen.blit(text, (165, 400))
pygame.display.update()
Image

7. 发射子弹,消灭敌机

# ……
class Bullet:def __init__(self):self.x = 0self.y = -1self.image = pygame.image.load('bullet.png').convert_alpha()self.active = False
def move(self):if self.active:self.y -= 5if self.y < 0:self.active = False
def restart(self):mouseX, mouseY = pygame.mouse.get_pos()self.x = mouseX - self.image.get_width() / 2self.y = mouseY - self.image.get_height() / 2self.active = True
# ……
def checkHit(enemy, bullet):if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and (bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()    ):enemy.restart()bullet.active = False#增加返回值return Truereturn False
# ……
bullets = []for i in range(10):bullets.append(Bullet())count_b = len(bullets)index_b = 0interval_b = 0
# ……
while True:    # ……if not gameover:# 发射子弹interval_b -= 1if interval_b < 0:bullets[index_b].restart()interval_b = 30index_b = (index_b + 1) % count_bfor b in bullets:if b.active:for e in enemies:checkHit(e, b)b.move()screen.blit(b.image, (b.x, b.y))      # ……  
Image

8. 记录游戏分数

# ……#分数score = 0
while True:    # ……if not gameover:# ……# 绘制敌机for e in enemies:if checkCrash(e, plane):gameover = Truee.move()screen.blit(e.image, (e.x,e.y))# 绘制玩家plane.move()screen.blit(plane.image, (plane.x, plane.y))#在屏幕左上角显示分数text = font.render("Socre: %d" % score, 1, (0, 0, 0))screen.blit(text, (0, 0))else:text = font.render("Game Over!", 1, (0, 0, 0))screen.blit(text, (165, 380))#在屏幕中央显示分数text = font.render("Socre: %d" % score, 1, (0, 0, 0))screen.blit(text, (165, 420))
pygame.display.update()
Image

9. 再增加一点点细节,美化贴图、添加音效等

Image

这样就开发出了一个打飞机游戏,你学会了吗?


近期文章

如何跟着AI学Python编程

Python字符串易踩的10个“坑”

AI 时代,我还需要学编程吗?

Python打包+加速神器:nuitka

这款Github“官方”字体,好看又懂程序员


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:


添加微信 crossin123 ,加入编程教室共同学习~
Image
感谢转发和点赞的各位~