# 这是一个提神醒脑的游戏!!!!! # 成年人建议在小孩陪同下使用 #为了方便修改将敌人,背景,音乐等位置用a,b,c,d 表示,直接修改abcd对应的文件位置即可使用 #加一个斜杠 C:\\Users\\MI\\Desktop\\fly\\resource 复制粘贴到pycharm再再后面补充一个\\ufo.png或者其他即可 # a b c d 字母不要改!! # 这个人很懒,与敌机相撞后会扣分,但是懒得编写复活,或者几秒无敌,如果一直在扣分判定范围内那么会一直扣分 a = 'C:\\Users\\MI\Desktop\\fly\\resource\\ufo.png' # UFO即为界面左上角图片 y = 'C:\\Users\\MI\Desktop\\fly\\resource\\bg.png' # 背景图片 c = 'C:\\Users\\MI\Desktop\\fly\\resource\\player.png' # 玩家飞机 d = 'C:\\Users\MI\\Desktop\\fly\\resource\\beijing.mp3' # 背景音乐 x = 'C:\\Users\\MI\Desktop\\fly\\resource\\exp.wav' # 击中音效 f = 'C:\\Users\\MI\\Desktop\\fly\\resource\\enemy.png' # 敌人图片 g = 'C:\\Users\\MI\\Desktop\\fly\\resource\\bullet.png' # 子d图片 h = 'C:\\Users\\MI\\Desktop\\fly\\resource\\laser.wav' # 发射音效 import random as rand from math import sqrt # 直接调用要使用的部分,在使用时直接使用sqrt() 无需math.sqrt(),对资源占用少,调用多个时逗号隔开 import pygame import time #****************************** #********* 初始化游戏 ********* #****************************** pygame.init() screen = pygame.display.set_mode((800, 600,)) # 输出框大小 pygame.display.set_caption('黄皓打飞机') icon = pygame.image.load(a) # 输出框位置以及名称 这是 a 对应 ufo bgImg = pygame.image.load(y) # 这是 y 对应 bg playerImg = pygame.image.load(c) # 这是 c 对应 player pygame.display.set_icon(icon) # 修改左上角显示窗口图标 score = 0 #********* 玩家定义 *********** playerX = 370 # 定义角色初始位置 playerY = 500 playerStepX = 0 # 定义玩家移动速度 playerStepY = 0 #********* 距离检测 ********* def distance(bx, by, ex, ey): # 勾股定理 m = bx - ex n = by - ey return sqrt(m * m + n * n) # 开根号 #*************************** #******* 音效 ************ #*************************** # 添加背景音效 pygame.mixer.music.load(d) # 这是 d 对应 beijing pygame.mixer.music.play(-1) # -1 单曲循环 # 添加击中音效 hit_sound = pygame.mixer.Sound(x) # 这是 x 对应 exp #添加发射音效 biu_sound = pygame.mixer.Sound(h) # 这是 h 对应 laser # 定义游戏结束 is_over = False def game_over(): global score if is_over: over_font = pygame.font.Font('freesansbold.ttf', 64) # 由于font(字体)之间相互影响 所以将font 改名为 over_font teat = "Game over" tebt = f"Score: {score}" # f似乎是去掉{} 我的没安装宋体相关插件 tedt = "Boy, you're playing with fire" # -500 之下 teet = "emm, Handicapped party real hammer" # -100分之下 teft = "Weak explosion, don't play" # 0 到 -100 tegt = "Plane vs True Love Party" # 0-20 teht = "It's a pity not to attack the plane" # 20-40 teit = "Big guy, please accept my knees !!!!" game_over_color = over_font.render(teat, True, (0, 255, 255)) # 三原色 0-255 score_colors = font.render(tebt, True, (0, 255, 255)) # 使用font 与上一行对比 tedt_colors = font.render(tedt, True, (0, 255, 255)) # 使用font 与上一行对比 teet_colors = font.render(teet, True, (0, 255, 255)) teft_colors = font.render(teft, True, (0, 255, 255)) tegt_colors = font.render(tegt, True, (0, 255, 255)) teht_colors = font.render(teht, True, (0, 255, 255)) teit_colors = font.render(teit, True, (0, 255, 255)) screen.blit(game_over_color, (250, 200)) screen.blit(score_colors, (330, 280)) if score < -500: screen.blit(tedt_colors, (220, 320)) elif -100 >= score >= -500: screen.blit(teet_colors, (130, 320)) elif 0 >= score >= -100: screen.blit(teft_colors, (220, 320)) elif 20 >= score >= 0: screen.blit(tegt_colors, (230, 320)) elif 60 >= score >= 20: screen.blit(teht_colors, (180, 320)) elif score >= 60: screen.blit(teit_colors, (150, 330)) # score = 0 # 游戏分数分数显示 #font = pygame.font.SysFont("simsunnsimsun", 32) # 使用宋体 font = pygame.font.Font('freesansbold.ttf', 32) def score_show(): tect = f"Score: {score}" # f似乎是去掉{} if t3-t1 <= timer: score_color = font.render(tect, True, (0, 255, 255)) # 三原色 0-255 screen.blit(score_color, (10, 10)) # ******* 计时器 ********** def time_show(): global is_over page = f"Time: {round(t3-t1,2)}" # 相减得出游戏运行时间 if t3-t1 <= timer: time_color = font.render(page, True, (0, 255, 0)) # 三原色 font 是字体 不支持汉字显示 screen.blit(time_color, (10, 50)) if t3-t1 >= timer: # 能大于等于就不要等于,等于容易出bug is_over = True enemy.clear() pygame.mixer.music.play() ''' ************************ **** 敌人初始化 ****** ************************ ''' enemy_number = 6 class Enemy: def __init__(self): self.img = pygame.image.load(f) # 这是 f 对应 enemy self.x = rand.randint(0, 750) self.y = rand.randint(0, 350) self.speed_x = rand.randint(2, 4) self.speed_y = rand.randint(20, 60) def reset(self): # 敌人复活 self.x = rand.randint(0, 750) self.y = rand.randint(0, 500) enemy = [] # 保存现有子d for i in range(enemy_number): enemy.append(Enemy()) def enemy_show(): for e in enemy: screen.blit(e.img, (e.x, e.y)) # 敌人出生地 e.x += e.speed_x if e.x <= 0 or e.x >= 750: e.speed_x *= -1 e.y += e.speed_y if e.y >= 530: e.y -= 30 # 如果不减去30可能会出现值恰好等于530这样会出现e.speed_y反复变化出现bug从而部分敌人溢出界面 e.speed_y *= -1 if e.y <= 0: e.y += 30 e.speed_y *= -1 '''' ************************ *** 子弹初始化 ****** ************************ ''' class Bullet: def __init__(self): self.img = pygame.image.load(g) # 这是 g 对应 bullet self.x = playerX + 15 # 子弹射出位置,与玩家x轴保持一致 self.y = playerY - 18 # 子弹y轴 # self.speed_x = rand.randint(2, 4) # 无需x轴变化,如果后期添加特殊弹可使用 self.speed_y = 3 # 子弹速度 # 击中 def hit(self): # 方法 的使用 global score for e in enemy: # 使用enemy中存储的六名敌人 if distance(self.x, self.y, e.x, e.y) < 20: # 有一个bug同时两个或多个敌人在子弹判定范围内时同时消失有bug hit_sound.play() bullet.remove(self) e.reset() score += 2 bullet = [] # 定义子弹列表 def bullet_show(): for b in bullet: if t3 - t1 <= timer: screen.blit(b.img, (b.x, b.y)) # 敌人出生地 b.hit() # 判断是否击中,击中则调用 hit()函数 子弹消失,敌人重置 b.y -= b.speed_y # 坐标轴相对飞机而言是反向 if b.x <= 0: # 判断是否出界 bullet.remove(b) # 出界 去除数列中该子弹 def process_event(): # 定义进程模块 global playerStepX, running, playerStepY, bullet, score # 函数内部调用全局变量 for event in pygame.event.get(): if event.type == pygame.QUIT: # 点击错误,退出游戏 running = False if event.type == pygame.KEYDOWN: # 判断键盘是否按下 if event.key == pygame.K_RIGHT: # 右 playerStepX = 3 elif event.key == pygame.K_LEFT: # 左 playerStepX = -3 elif event.key == pygame.K_UP: # 下 playerStepY = -3 elif event.key == pygame.K_DOWN: # 上 playerStepY = 3 elif event.key == pygame.K_SPACE: # 空格 if t3 - t1 <= timer: # 时间超过则停止音效 biu_sound.play() bullet.append(Bullet()) # 将子弹添加到数组之中 score -= 1 # 每发射一枚子弹减一分 if event.type == pygame.KEYUP: # 键盘未按下 playerStepX = 0 playerStepY = 0 def player_move(): # 角色移动范围限制 global playerX, playerY, score run = True if run: screen.blit(playerImg, (playerX, playerY)) playerX += playerStepX playerY += playerStepY if playerX >= 740: playerX = 740 elif playerX <= 0: playerX = 0 if playerY <= 0: playerY = 0 elif playerY >= 530: playerY = 530 for e in enemy: # 遍历所有敌人 if distance(playerX, playerY, e.x, e.y) < 25: score -= 3 # screen.blit(playerImg, (370, 500)) #enemy.clear() # 游戏主循环 running = True t1 = time.time() # 记录游戏开始时间 while running: t3 = time.time() # 记录当前时间 timer = 120 screen.blit(bgImg, (0, 0)) # 背景初始化 score_show() # 显示分数 time_show() # 显示时间 enemy_show() # 显示敌人 process_event() # 控制按键 player_move() # 玩家移动 bullet_show() # 显示子弹 game_over() pygame.display.update() # 每一次更新界面 这是游戏的核心 参考bilibili 博主,界面素材取自该博主,后自己加以改动,可以根据自身需求向该博主自己领取素材,后自己加以改动,侵权请联系删除。【Python游戏】1小时开发飞机大战游戏-Pygame版本【课程编号210】_哔哩哔哩_bilibili
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)