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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值