import pygame import random import sys import time # 初始化pygame pygame.init() # 设置颜色 WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) # 设置屏幕大小 SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) # 植物和僵尸的类 classPlant:def__init__(self, x, y): self.x = x self.y = y self.bullets = [] defshoot(self): bullet = pygame.Rect(self.x + 20, self.y, 5, 10) self.bullets.append(bullet) defmove_bullets(self):for bullet in self.bullets: bullet.y -= 5defdraw(self): pygame.draw.rect(screen, GREEN, pygame.Rect(self.x, self.y, 50, 50)) for bullet in self.bullets: pygame.draw.rect(screen, RED, bullet) classZombie:def__init__(self): self.x = random.randint(SCREEN_WIDTH, SCREEN_WIDTH + 50) self.y = random.randint(0, SCREEN_HEIGHT) self.speed = random.randint(1, 5) defmove(self): self.x -= self.speed defdraw(self): pygame.draw.rect(screen, RED, pygame.Rect(self.x, self.y, 50, 50)) # 游戏主循环 defgame_loop(): plant = Plant(SCREEN_WIDTH - 60, SCREEN_HEIGHT // 2) zombies = [Zombie() for _ in range(5)] running = Truewhile running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = Falseelif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: plant.shoot() screen.fill(WHITE) plant.move_bullets() plant.draw() for zombie in zombies: zombie.move() zombie.draw() # 检查子弹是否击中僵尸 for bullet in plant.bullets: if zombie.x < bullet.x < zombie.x + 50and zombie.y < bullet.y < zombie.y + 50: plant.bullets.remove(bullet) zombies.remove(zombie) break# 检查僵尸是否到达屏幕左边 zombies = [zombie for zombie in zombies if zombie.x > 0] pygame.display.flip() time.sleep(0.1) pygame.quit() sys.exit() # 运行游戏 game_loop()
import randomimport tkinterroot = 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 = 0message = "消灭敌机数量:"lb['text'] = message + str(count)lb2 = tkinter.Label(root, width=20, height=1, bg='white')lb2.place(x=290, y=570)lb2['text'] = '---'# 玩家classPlayerPlane:# 机翼的坐标 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 - 120def__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# 攻击defattack(self, event):# 子弹的坐标self.bullet_x1, self.bullet_y1 = self.fuselage_x2, self.fuselage_y2self.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)# 删除子弹defdelete_bullet(self): canvas.delete(self.bullet)# 左移defmove_left(self, event):ifself.wings_x1 == 0:return canvas.move(self.wings, -self.move_distance, 0)self.wings_x1 -= self.move_distanceself.wings_x2 -= self.move_distance canvas.move(self.tail, -self.move_distance, 0)self.tail_x1 -= self.move_distanceself.tail_x2 -= self.move_distance canvas.move(self.fuselage, -self.move_distance, 0)self.fuselage_x1 -= self.move_distanceself.fuselage_x2 -= self.move_distance# 右移defmove_right(self, event):ifself.wings_x2 == 550:return canvas.move(self.wings, self.move_distance, 0)self.wings_x1 += self.move_distanceself.wings_x2 += self.move_distance canvas.move(self.tail, self.move_distance, 0)self.tail_x1 += self.move_distanceself.tail_x2 += self.move_distance canvas.move(self.fuselage, self.move_distance, 0)self.fuselage_x1 += self.move_distanceself.fuselage_x2 += self.move_distance# 上移defmove_up(self, event):ifself.fuselage_y2 == 0:return canvas.move(self.wings, 0, -self.move_distance)self.wings_y1 -= self.move_distanceself.wings_y2 -= self.move_distance canvas.move(self.tail, 0, -self.move_distance)self.tail_y1 -= self.move_distanceself.tail_y2 -= self.move_distance canvas.move(self.fuselage, 0, -self.move_distance)self.fuselage_y1 -= self.move_distanceself.fuselage_y2 -= self.move_distance# 下移defmove_down(self, event):ifself.fuselage_y1 == 530:return canvas.move(self.wings, 0, self.move_distance)self.wings_y1 += self.move_distanceself.wings_y2 += self.move_distance canvas.move(self.tail, 0, self.move_distance)self.tail_y1 += self.move_distanceself.tail_y2 += self.move_distance canvas.move(self.fuselage, 0, self.move_distance)self.fuselage_y1 += self.move_distanceself.fuselage_y2 += self.move_distance# 敌机类classEnemyPlane: 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 + 120def__init__(self):self.bullet = None# 移动距离self.move_distance = 10defcreate(self): lt = [0, 40, 80, 120] x_change = random.choice(lt)self.wings_x1 += x_changeself.wings_x2 += x_changeself.tail_x1 += x_changeself.tail_x2 += x_changeself.fuselage_x1 += x_changeself.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()defattack(self):# 子弹的坐标self.bullet_x1, self.bullet_y1 = self.fuselage_x2, self.fuselage_y2self.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)# 删除子弹defdelete_bullet(self): canvas.delete(self.bullet)defdelete(self): canvas.delete(self.wings) canvas.delete(self.tail) canvas.delete(self.fuselage)defmove(self): global countself.attack() canvas.move(self.wings, 0, self.move_distance)self.wings_y1 += self.move_distanceself.wings_y2 += self.move_distance canvas.move(self.tail, 0, self.move_distance)self.tail_y1 += self.move_distanceself.tail_y2 += self.move_distance canvas.move(self.fuselage, 0, self.move_distance)self.fuselage_y1 += self.move_distanceself.fuselage_y2 += self.move_distance time_id2 = root.after(2000, self.move)ifself.fuselage_y2 == 530: root.after_cancel(time_id2)self.delete()# 检测是否受到攻击if (self.wings_x1 <= p.bullet_x2 <= self.wings_x2 andself.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 = 3for i in range(n): lt.append(EnemyPlane())i = 0defcre(): global i, n, count time_id = root.after(6000, cre)if i < n: lt[i].create() i += 1else: 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()