Python制作飞机大战游戏

让我们用python来做一个飞机大战小游戏,要放置玩家和敌机还有子弹,设置玩家控制方向:WASD,攻击:J。

运行视频:

飞机大战 2024-03-17 13-28-14

代码:

import random
import tkinter

root = tkinter.Tk()
root.title('飞机大战')
root.geometry('800x650+400+100')
canvas = tkinter.Canvas(root, width=550, height=520, bg='white')
canvas.pack()
lb = tkinter.Label(root, width=20, height=1, bg='white')
lb.place(x=290, y=540)
count = 0
message = "消灭敌机数量:"
lb['text'] = message + str(count)
lb2 = tkinter.Label(root, width=20, height=1, bg='white')
lb2.place(x=290, y=570)
lb2['text'] = '---'


# 玩家
class PlayerPlane:
    # 机翼的坐标
    wings_x1, wings_y1 = 240, 470
    wings_x2, wings_y2 = 290, 470
    # 尾翼的坐标
    tail_x1, tail_y1 = 250, 500
    tail_x2, tail_y2 = 280, 500
    # 机身的坐标
    fuselage_x1, fuselage_y1 = 265, 500
    fuselage_x2, fuselage_y2 = 265, 440
    # 子弹的坐标
    bullet_x1, bullet_y1 = fuselage_x2, fuselage_y2
    bullet_x2, bullet_y2 = bullet_x1, bullet_y1 - 120

    def __init__(self):
        # 机翼
        self.wings = canvas.create_line(self.wings_x1, self.wings_y1, self.wings_x2, self.wings_y2)
        # 尾翼
        self.tail = canvas.create_line(self.tail_x1, self.tail_y1, self.tail_x2, self.tail_y2)
        # 机身
        self.fuselage = canvas.create_line(self.fuselage_x1, self.fuselage_y1, self.fuselage_x2, self.fuselage_y2)
        # 子弹
        self.bullet = None
        # 移动距离
        self.move_distance = 5

    # 攻击
    def attack(self, event):
        # 子弹的坐标
        self.bullet_x1, self.bullet_y1 = self.fuselage_x2, self.fuselage_y2
        self.bullet_x2, self.bullet_y2 = self.bullet_x1, self.bullet_y1 - 120
        # 子弹
        self.bullet = canvas.create_line(self.bullet_x1, self.bullet_y1, self.bullet_x2, self.bullet_y2, fill='red',
                                         dash=(1, 1))
        # 80毫秒之后子弹消失
        canvas.after(80, self.delete_bullet)

    # 删除子弹
    def delete_bullet(self):
        canvas.delete(self.bullet)

    # 左移
    def move_left(self, event):
        if self.wings_x1 == 0:
            return
        canvas.move(self.wings, -self.move_distance, 0)
        self.wings_x1 -= self.move_distance
        self.wings_x2 -= self.move_distance

        canvas.move(self.tail, -self.move_distance, 0)
        self.tail_x1 -= self.move_distance
        self.tail_x2 -= self.move_distance

        canvas.move(self.fuselage, -self.move_distance, 0)
        self.fuselage_x1 -= self.move_distance
        self.fuselage_x2 -= self.move_distance

    # 右移
    def move_right(self, event):
        if self.wings_x2 == 550:
            return
        canvas.move(self.wings, self.move_distance, 0)
        self.wings_x1 += self.move_distance
        self.wings_x2 += self.move_distance

        canvas.move(self.tail, self.move_distance, 0)
        self.tail_x1 += self.move_distance
        self.tail_x2 += self.move_distance

        canvas.move(self.fuselage, self.move_distance, 0)
        self.fuselage_x1 += self.move_distance
        self.fuselage_x2 += self.move_distance

    # 上移
    def move_up(self, event):
        if self.fuselage_y2 == 0:
            return
        canvas.move(self.wings, 0, -self.move_distance)
        self.wings_y1 -= self.move_distance
        self.wings_y2 -= self.move_distance

        canvas.move(self.tail, 0, -self.move_distance)
        self.tail_y1 -= self.move_distance
        self.tail_y2 -= self.move_distance

        canvas.move(self.fuselage, 0, -self.move_distance)
        self.fuselage_y1 -= self.move_distance
        self.fuselage_y2 -= self.move_distance

    # 下移
    def move_down(self, event):
        if self.fuselage_y1 == 530:
            return
        canvas.move(self.wings, 0, self.move_distance)
        self.wings_y1 += self.move_distance
        self.wings_y2 += self.move_distance

        canvas.move(self.tail, 0, self.move_distance)
        self.tail_y1 += self.move_distance
        self.tail_y2 += self.move_distance

        canvas.move(self.fuselage, 0, self.move_distance)
        self.fuselage_y1 += self.move_distance
        self.fuselage_y2 += self.move_distance


# 敌机类
class EnemyPlane:
    wings_x1 = 0
    wings_y1 = 30
    wings_x2 = 40
    wings_y2 = 30
    tail_x1 = 10
    tail_y1 = 0
    tail_x2 = 30
    tail_y2 = 0
    fuselage_x1 = 20
    fuselage_y1 = 0
    fuselage_x2 = 20
    fuselage_y2 = 60
    # 子弹的坐标
    bullet_x1, bullet_y1 = fuselage_x2, fuselage_y2
    bullet_x2, bullet_y2 = bullet_x1, bullet_y1 + 120

    def __init__(self):
        self.bullet = None
        # 移动距离
        self.move_distance = 10

    def create(self):
        lt = [0, 40, 80, 120]
        x_change = random.choice(lt)
        self.wings_x1 += x_change
        self.wings_x2 += x_change
        self.tail_x1 += x_change
        self.tail_x2 += x_change
        self.fuselage_x1 += x_change
        self.fuselage_x2 += x_change
        # 机翼
        self.wings = canvas.create_line(self.wings_x1, self.wings_y1, self.wings_x2, self.wings_y2)
        # 尾翼
        self.tail = canvas.create_line(self.tail_x1, self.tail_y1, self.tail_x2, self.tail_y2)
        # 机身
        self.fuselage = canvas.create_line(self.fuselage_x1, self.fuselage_y1, self.fuselage_x2, self.fuselage_y2)
        self.move()

    def attack(self):
        # 子弹的坐标
        self.bullet_x1, self.bullet_y1 = self.fuselage_x2, self.fuselage_y2
        self.bullet_x2, self.bullet_y2 = self.bullet_x1, self.bullet_y1 + 120
        # 子弹
        self.bullet = canvas.create_line(self.bullet_x1, self.bullet_y1, self.bullet_x2, self.bullet_y2, fill='red',
                                         dash=(1, 1))
        # 80毫秒之后子弹消失
        canvas.after(100, self.delete_bullet)

    # 删除子弹
    def delete_bullet(self):
        canvas.delete(self.bullet)

    def delete(self):
        canvas.delete(self.wings)
        canvas.delete(self.tail)
        canvas.delete(self.fuselage)

    def move(self):
        global count
        self.attack()

        canvas.move(self.wings, 0, self.move_distance)
        self.wings_y1 += self.move_distance
        self.wings_y2 += self.move_distance

        canvas.move(self.tail, 0, self.move_distance)
        self.tail_y1 += self.move_distance
        self.tail_y2 += self.move_distance

        canvas.move(self.fuselage, 0, self.move_distance)
        self.fuselage_y1 += self.move_distance
        self.fuselage_y2 += self.move_distance
        time_id2 = root.after(2000, self.move)

        if self.fuselage_y2 == 530:
            root.after_cancel(time_id2)
            self.delete()

        # 检测是否受到攻击
        if (self.wings_x1 <= p.bullet_x2 <= self.wings_x2 and self.wings_y2 >= p.bullet_y2) or (
                p.bullet_x2 == self.fuselage_x2 and p.bullet_y2 <= self.fuselage_y2):
            root.after_cancel(time_id2)
            self.delete()
            count += 1
            lb['text'] = message + str(count)
            if count == n:
                lb2['text'] = '敌机已全部消灭!'

# 创建玩家飞机
p = PlayerPlane()
#  存放敌机
lt = []
# 敌机数量
n = 3
for i in range(n):
    lt.append(EnemyPlane())
i = 0

def cre():
    global i, n, count
    time_id = root.after(6000, cre)
    if i < n:
        lt[i].create()
        i += 1
    else:
        root.after_cancel(time_id)
# 创建敌机
cre()

# 绑定事件
canvas.bind('<KeyPress-j>', p.attack)
canvas.bind('<KeyPress-a>', p.move_left)
canvas.bind('<KeyPress-d>', p.move_right)
canvas.bind('<KeyPress-w>', p.move_up)
canvas.bind('<KeyPress-s>', p.move_down)
# 设置按钮获取焦点
canvas.focus_set()

root.mainloop()

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!很高兴回答你关于Python飞机大战的问题。Python飞机大战是一个经典的小游戏,你可以使用Python编程语言来实现。这个游戏的目标是控制一个飞机,尽可能地击败敌人并生存下来。 要创建Python飞机大战游戏,你可以使用Pygame库。Pygame是一个用于开发2D游戏Python库,它提供了许多有用的函数和方法来处理图形、声音和用户输入等方面。 在游戏中,你可以创建一个玩家飞机和敌人飞机的精灵类。玩家飞机可以通过键盘输入来控制移动,按下空格键可以发射子弹。敌人飞机可以随机生成,并向玩家飞机发射子弹。你需要编写逻辑来检测碰撞、计分和游戏结束等情况。 以下是一个简单的Python飞机大战游戏的代码示例: ```python import pygame import random # 初始化游戏 pygame.init() # 设置游戏窗口大小 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Plane Battle") # 定义颜色 WHITE = (255, 255, 255) RED = (255, 0, 0) # 加载图像 player_img = pygame.image.load("player.png") enemy_img = pygame.image.load("enemy.png") bullet_img = pygame.image.load("bullet.png") # 定义玩家飞机类 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = player_img self.rect = self.image.get_rect() self.rect.centerx = screen_width // 2 self.rect.bottom = screen_height - 10 self.speed_x = 0 def update(self): self.speed_x = 0 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: self.speed_x = -5 if keys[pygame.K_RIGHT]: self.speed_x = 5 self.rect.x += self.speed_x if self.rect.left < 0: self.rect.left = 0 if self.rect.right > screen_width: self.rect.right = screen_width def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) all_sprites.add(bullet) bullets.add(bullet) # 定义敌人飞机类 class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = enemy_img self.rect = self.image.get_rect() self.rect.x = random.randrange(screen_width - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speed_y = random.randrange(1, 4) def update(self): self.rect.y += self.speed_y if self.rect.top > screen_height + 10: self.rect.x = random.randrange(screen_width - self.rect.width) self.rect.y = random.randrange(-100, -40) self.speed_y = random.randrange(1, 4) # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = bullet_img self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed_y = -10 def update(self): self.rect.y += self.speed_y if self.rect.bottom < 0: self.kill() # 创建精灵组 all_sprites = pygame.sprite.Group() enemies = pygame.sprite.Group() bullets = pygame.sprite.Group() # 创建玩家飞机实例并加入精灵组 player = Player() all_sprites.add(player) # 生成敌人飞机 for _ in range(10): enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 游戏主循环 running = True clock = pygame.time.Clock() while running: clock.tick(60) # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() # 更新精灵 all_sprites.update() # 检测碰撞 hits = pygame.sprite.groupcollide(enemies, bullets, True, True) for hit in hits: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) hits = pygame.sprite.spritecollide(player, enemies, False) if hits: running = False # 绘制背景 screen.fill(WHITE) # 绘制精灵 all_sprites.draw(screen) # 刷新屏幕 pygame.display.flip() # 退出游戏 pygame.quit() ``` 这只是一个简单的示例,你可以根据自己的需求进行扩展和优化。希望这能帮到你!如果你有任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值