少儿编程分享:手把手教你用Python编写战斗机游戏(一)

合集下载

python实例:利用pygame实现小游戏“飞机大战”

python实例:利用pygame实现小游戏“飞机大战”

python实例:利⽤pygame实现⼩游戏“飞机⼤战”0、程序代码代码1:1import random2import pygame34# 屏幕⼤⼩的常量5 SCREEN_RECT = pygame.Rect(0, 0, 480, 700)6# 刷新的帧率7 FRAME_PER_SEC = 608# 创建敌机的定时器常量9 CREATE_ENEMY_EVENT = EREVENT10# 英雄发射⼦弹事件11 HERO_FIRE_EVENT = EREVENT+112#⼦弹速度13 BULLET_SPEED = -2.5141516class GameSprite(pygame.sprite.Sprite):17""""飞机⼤战游戏精灵"""1819def__init__(self, image_name, speed = 1):20# 调⽤⽗亲的初始化⽅法21 super().__init__()22# 定义对象的属性23 self.image = pygame.image.load(image_name)24 self.rect = self.image.get_rect()25 self.speed = speed2627def update(self):28#在屏幕的垂直⽅向上移动29 self.rect.y += self.speed303132class Background(GameSprite):33""""游戏背景精灵"""3435def__init__(self, is_alt = False):36# 1.调⽤⽗类构造⽅法37 super().__init__("./images/background.png")38# 2.判断是否与前图像循环重合,若否,则需重新设置初始位置39if is_alt:40 self.rect.y = -self.rect.height414243def update(self):44# 1.调⽤⽗类的⽅法,,,注意super后⾯要加括号!!!45 super().update()46# 2.判断是否移出屏幕47if self.rect.y >= SCREEN_RECT.height:48 self.rect.y = -self.rect.height495051class Enemy(GameSprite):52""""敌机精灵"""5354def__init__(self):55# 1.调⽤⽗类⽅法,创建敌机精灵56 super().__init__("./images/enemy1.png")57# 2. 指定敌机的初始随机速度 1-2-358 self.speed = random.randint(1,3)59# 3.指定敌机的初始随机位置60 self.rect.bottom = 06162 max_x = SCREEN_RECT.width - self.rect.width63 self.rect.x = random.randint(0, max_x)646566def update(self):6768# 1.调⽤⽗类⽅法,保持垂直⽅向的飞⾏69 super().update()70# 2.判断是否⾮出屏幕,如果是,需要从精灵组删除敌机71if self.rect.y >= SCREEN_RECT.height:72#print("飞出屏幕,需要从精灵组删除...")73# kill⽅法可以将精灵从精灵组中移除74 self.kill()7576def__del__(self):77#print("敌机挂了%s" %self.rect)78pass798081class Hero(GameSprite):82"""英雄精灵"""8384def__init__(self):85# 1.调⽤⽗类⽅法,设置image和speed86 super().__init__("./images/me1.png", speed = 0)87 self.speed1 = 088# 2.设置英雄的初始位置89 self.rect.centerx = SCREEN_RECT.centerx90 self.rect.bottom = SCREEN_RECT.bottom - 10091# 3.创建⼦弹精灵组92 self.bullets = pygame.sprite.Group()9394def update(self):95#(错误的判断句,会导致⼀旦出界就很难再恢复回来)if 0 <= self.rect.x <= SCREEN_RECT.width - self.rect.width: 96 self.rect.x += self.speed97if self.rect.x < 0:98 self.rect.x = 099elif self.rect.right > SCREEN_RECT.width:100 self.rect.right = SCREEN_RECT.width101102 self.rect.y += self.speed1103if self.rect.y < 0:104 self.rect.y = 0105elif self.rect.bottom > SCREEN_RECT.height:106 self.rect.bottom = SCREEN_RECT.height107108109def fire(self):110#print("发射⼦弹")111# 1.创建⼦弹精灵112 bullet = Bullet()113# 2.设置精灵位置114 bullet.rect.bottom = self.rect.y115 bullet.rect.centerx = self.rect.centerx116# 3.将精灵添加到精灵组117 self.bullets.add(bullet)118119120class Bullet(GameSprite):121""""⼦弹精灵"""122123def__init__(self):124# 调⽤⽗类⽅法125 super().__init__("./images/bullet1.png", BULLET_SPEED)126127def update(self):128 super().update()129if self.rect.bottom < 0:130 self.kill()131132def__del__(self):133#print("⼦弹被销毁")134passView Code代码2:1from plane_sprites import *2# 游戏主程序34class PlaneGame(object):5""""飞机⼤战主游戏"""67def__init__(self):8print("游戏初始化")910# 1.创建游戏的窗⼝11 self.screen = pygame.display.set_mode(SCREEN_RECT.size)12# 2.创建游戏的时钟13 self.clock = pygame.time.Clock()14# 3.调⽤私有⽅法,精灵和精灵组的创建15 self.__create_sprites()16# 4.设置定时器事件——创建敌机 1s17 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)18 pygame.time.set_timer(HERO_FIRE_EVENT, 300)1920def__create_sprites(self):21# 创建背景精灵和精灵组22 bg1 = Background()23 bg2 = Background(True)24 self.back_group = pygame.sprite.Group(bg1, bg2)25# 创建敌机精灵26 self.enemy_group = pygame.sprite.Group()27# 创建英雄精灵28 self.hero = Hero()29 self.hero_group = pygame.sprite.Group(self.hero)303132def start_game(self):33print("游戏开始...")3435while True:36# 1.设置刷新帧率37 self.clock.tick(FRAME_PER_SEC)38# 2.事件监听39 self.__event_handler()40# 3.碰撞检测41 self.__check_collide()42# 4.更新/绘制精灵组43 self.__update_sprites()44# 5.更新显⽰45 pygame.display.update()464748def__event_handler(self):49for event in pygame.event.get():50#判断是否退出游戏51if event.type == pygame.QUIT:52 PlaneGame.__game_over()53elif event.type == CREATE_ENEMY_EVENT:54#print("敌机出现。

python版飞机大战代码分享

python版飞机大战代码分享

python版飞机⼤战代码分享利⽤pygame实现了简易版飞机⼤战。

源代码如下:# -*- coding:utf-8 -*-import pygameimport sysfrom pygame.locals import *from pygame.font import *import timeimport randomclass Hero(object):#玩家英雄类def __init__(self, screen_temp):self.x = 210self.y = 700self.life = 21# self.life = 100self.image = pygame.image.load("./feiji/hero1.png")self.screen = screen_tempself.bullet_list = []#⽤来存储⼦弹对象的引⽤#爆炸效果⽤的如下属性self.hit = False #表⽰是否要爆炸self.bomb_list = [] #⽤来存储爆炸时需要的图⽚self.__create_images() #调⽤这个⽅法向bomb_list中添加图⽚self.image_num = 0 #⽤来记录while True的次数,当次数达到⼀定值时才显⽰⼀张爆炸的图,然后清空,,当这个次数再次达到时,再显⽰下⼀个爆炸效果的图⽚ self.image_index = 0#⽤来记录当前要显⽰的爆炸效果的图⽚的序号def __create_images(self):#添加爆炸图⽚self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n1.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n2.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n3.png"))self.bomb_list.append(pygame.image.load("./feiji/hero_blowup_n4.png"))def display(self):#显⽰玩家的飞机#如果被击中,就显⽰爆炸效果,否则显⽰普通的飞机效果if self.hit == True:self.screen.blit(self.bomb_list[self.image_index], (self.x, self.y))#(self.x, self.y)是指当前英雄的位置#blit⽅法(⼀个对象,左上⾓位置)self.image_num += 1print(self.image_num)if self.image_num == 7:self.image_num = 0self.image_index += 1print(self.image_index) #这⾥⼦弹打住英雄时没有被清除掉,所以打⼀下,就死了if self.image_index > 3:time.sleep(1)exit()#调⽤exit让游戏退出#self.image_index = 0else:if self.x< 0: #控制英雄,不让它跑出界⾯self.x = 0elif self.x > 382:self.x = 382if self.y < 0:self.y = 0elif self.y > 750:self.y = 750self.screen.blit(self.image,(self.x, self.y))#z这⾥是只要没有被打中,就⼀直是刚开始的样⼦#不管玩家飞机是否被击中,都要显⽰发射出去的⼦弹for bullet in self.bullet_list:bullet.display()bullet.move()def move(self, move_x,move_y):self.x += move_xself.y += move_ydef fire(self):#通过创建⼀个⼦弹对象,完成发射⼦弹bullet = Bullet(self.screen, self.x, self.y)#创建⼀个⼦弹对象self.bullet_list.append(bullet)def bomb(self):self.hit = Truedef judge(self):global lifeif life <= 0:self.bomb()class Bullet(object):#玩家⼦弹类def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 40self.y = y_temp - 20self.image = pygame.image.load("./feiji/bullet.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self):self.y -= 10class Bullet_Enemy(object):#敌机⼦弹类def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 25self.y = y_temp + 30self.image = pygame.image.load("./feiji/bullet1.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image,(self.x,self.y))def move(self, hero):self.y += 10global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 10#self.bullet_list.remove()print("---judge_enemy---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss(object):#boss⼦弹类1def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6self.x += 2global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss1(object):#boss⼦弹类2def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6self.x -= 2global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Bullet_Boss2(object):#boss⼦弹类3def __init__(self, screen_temp, x_temp, y_temp):self.x = x_temp + 80self.y = y_temp + 230self.image = pygame.image.load("./feiji/bullet2.png")self.screen = screen_tempdef display(self):self.screen.blit(self.image, (self.x, self.y))def move(self, hero):self.y += 6global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): #if self.y in range(hero.y, hero.y + 40) and self.x in range(hero.x, hero.x + 40):life -= 20#self.bullet_list.remove()print("---judge_boss---")return Trueif life<=0:hero.bomb()return Falseclass Base(object):#基类类似于抽象类def __init__(self, screen_temp, x, y, image_name):self.x = xself.y = yself.screen = screen_tempself.image = pygame.image.load(image_name)self.alive = Truedef display(self):if self.alive == True:self.screen.blit(self.image, (self.x, self.y))def move(self):self.y += 5class bomb_bullet(Base):#炸弹类def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb.png")def judge(self, hero):if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falsehero.bomb()if self.y >= 850:#self.alive = Falseself.y = 0self.x = random.randint(45, 400)#print("bomb.y = %d"%self.y)class supply(Base):#补给类def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), -300, "./feiji/bomb-1.gif")def judge(self, hero):global lifeif (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falselife += 10if self.y >= 1500:self.y = 0self.x = random.randint(45, 400)self.alive = Trueclass clear_bullet(Base):def __init__(self, screen_temp):Base.__init__(self, screen_temp, random.randint(45, 400), 0, "./feiji/bomb-2.gif")self.alive = Falsedef judge(self, hero, enemies):global qq += 1#self.move()if q == 20:#self.move()self.alive = Trueq = 0if (hero.y <= self.y and self.y <= hero.y + 40) and (hero.x <= self.x and self.x <= hero.x + 100): self.alive = Falsefor enemy in enemies:enemy.hit == Trueclass EnemyPlane(object):#敌机类def __init__(self, screen_temp):self.x = random.randint(15, 480)self.y = 0self.image = pygame.image.load("./feiji/enemy0.png")self.screen = screen_tempself.bullet_list = []#⽤来存储⼦弹对象的引⽤#self.direction = "right"#⽤来设置这个飞机默认的移动⽅向self.hit = Falseself.bomb_list = []self.__create_images()self.image_num = 0self.image_index = 0#利⽤产⽣的随机数,随机确定飞机初始移动⽅向self.k = random.randint(1, 20)if self.k <= 10:self.direction = "right"elif self.k > 10:self.direction = "left"def display(self, hero):#显⽰敌⼈的飞机if not self.hit:self.screen.blit(self.image, (self.x,self.y))else:self.screen.blit(self.bomb_list[self.image_index], (self.x,self.y))self.image_num += 1if self.image_num == 3 and self.image_index < 3:self.image_num = 0self.image_index += 1#print(self.image_index)# if self.image_index > 2:# time.sleep(0.1)for bullet in self.bullet_list:bullet.display()if(bullet.move(hero)):self.bullet_list.remove(bullet)def move(self):#利⽤随机数来控制飞机移动距离,以及移动范围d1 = random.uniform(1,3)d2 = random.uniform(0.2,3)p1 = random.uniform(50,100)p2 = random.uniform(-200,0)if self.direction == "right":self.x += d1elif self.direction == "left":self.x -= d1if self.x > 480 - p1:#480 - 50self.direction="left"elif self.x < p2:self.direction = "right"self.y += d2def bomb(self):self.hit = Truedef __create_images(self):self.bomb_list.append(pygame.image.load("./feiji/enemy0_down1.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down2.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down3.png")) self.bomb_list.append(pygame.image.load("./feiji/enemy0_down4.png")) def fire(self):#利⽤随机数来控制敌机的开⽕,1/80的概率s = random.randint(0,800)bullet1 = Bullet_Enemy(self.screen, self.x, self.y)if s < 10:self.bullet_list.append(bullet1)class EnemyPlanes(EnemyPlane):#敌机群类继承⾃EnemyPlane类def __init__(self, screen_temp):EnemyPlane.__init__(self, screen_temp)self.num = 0self.enemy_list = [] #⽤列表存储产⽣的多架敌机self.screen = screen_tempdef add_enemy(self, num):#产⽣多架敌机的函数self.num = numfor i in range(num):enemy = EnemyPlane(self.screen)self.enemy_list.append(enemy)def display(self, hero):for i in range(self.num):self.enemy_list[i].display(hero)def move(self):for i in range(self.num):self.enemy_list[i].move()def fire(self):#s = random.randint(0,1000)for i in range(self.num):self.enemy_list[i].fire()class Boss(EnemyPlane):#boss敌机类继承⾃EnemyPlane类def __init__(self,screen_temp):EnemyPlane.__init__(self,screen_temp)self.x = 150self.y = 0self.bomb_list = []self.__create_images()self.image = pygame.image.load("./feiji/enemy2.png")self.screen = screen_tempself.bullet_list = []def __create_images(self):#self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down1.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down2.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down3.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down4.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down5.png"))self.bomb_list.append(pygame.image.load("./feiji/enemy2_down6.png"))def display(self, hero):#显⽰敌⼈的飞机global g#print(g)self.screen.blit(self.bomb_list[g], (self.x,self.y))for bullet in self.bullet_list:bullet.display()if(bullet.move(hero)):self.bullet_list.remove(bullet)def move(self):d1 = 0self.y += 0def fire(self):global ss += 1bullet1 = Bullet_Boss(self.screen, self.x, self.y)bullet2 = Bullet_Boss1(self.screen, self.x, self.y)bullet3 = Bullet_Boss2(self.screen, self.x, self.y)if s == 20:s = 0self.bullet_list.append(bullet1)self.bullet_list.append(bullet2)self.bullet_list.append(bullet3)def judge1(hero,enemy):#判断敌机的炸毁for bullet1 in hero.bullet_list:if bullet1.y in range(int(enemy.y),int(enemy.y + 30)) and bullet1.x in range(int(enemy.x-10),int(enemy.x + 50)): hero.bullet_list.remove(bullet1)enemy.bomb()if bullet1.y < 0 or bullet1.x < 0 or bullet1.x > 480: #删除越界的玩家⼦弹hero.bullet_list.remove(bullet1)def judge3(hero,boss):#判断boss的炸毁global goal, g, goal0for bullet3 in hero.bullet_list:if bullet3.y in range(int(boss.y), int(boss.y + 60)) and bullet3.x in range(int(boss.x), int(boss.x + 100)):hero.bullet_list.remove(bullet3)g += 1boss.image = boss.bomb_list[g]print("g = %d"%g)if g >= 6:boss.y, g, goal = 0, 0, 0boss.bomb()goal0 += 10def clear_enemy(enemies):#清除敌机群类中被炸毁的敌机global goal, goal0for enemy in enemies.enemy_list:if enemy.hit == True and enemy.image_index == 3:enemies.enemy_list.remove(enemy)enemies.num -= 1goal += 1goal0 += 5print("goal = %d"%goal)if enemy.y >= 850:enemies.enemy_list.remove(enemy)enemies.num -= 1def judge_num(enemies):#判断频幕上敌⼈的数量,如果为零,继续添加敌⼈n = random.randint(1,5)if len(enemies.enemy_list) == 0:enemies.add_enemy(n)def show_text(screen_temp):#在屏幕上显⽰⽂字text = "GOAL:" + str(goal0) + "Life:" + str(life)font_size = 50pos = (0,0)color = (0,255,0)cur_font = pygame.font.SysFont("宋体",font_size)text_fmt = cur_font.render(text, 1, color)screen_temp.blit(text_fmt, pos)def creat_bomb(screen_temp):bomb = bomb_bullet(screen_temp)bomb_list = []bomb_list.apend(bomb)#定义的全局变量goal = 0 #玩家得分goal0 = 0g = 0 #击中boss的次数life = 100#⽣命值s = 0 #判断⼤boss是否发射⼦弹q = 0def main():#主函数执⾏#获取事件,⽐如按键等bb = Falsemove_x = 0move_y = 0pygame.init()screen = pygame.display.set_mode((480,852),0,32)# 210,400background = pygame.image.load("./feiji/background.png") pygame.display.set_caption("飞机⼤战")atlas = pygame.image.load("./feiji/New Atlas.png")#创建玩家飞机hero = Hero(screen)#创建敌机群enemis = EnemyPlanes(screen)enemis.add_enemy(5)#创建boss对象boss = Boss(screen)#创建炸弹对象bomb = bomb_bullet(screen)#创建补给对象supply0 = supply(screen)clear = clear_bullet(screen)left_key, right_key, up_key, down_key, done = 0, 0, 0, 0, 0 # mark = 0#⽤来判断boss发射⼦弹while True:if done:if done % 8 == 0:done = 1hero.fire()else:done += 1for event in pygame.event.get():#判断是否是点击了退出按钮if event.type == QUIT:print("exit")exit()#判断是否是按下了键if event.type == KEYDOWN :#down#检测按键是否是a或者leftif event.key == K_a or event.key == K_LEFT:#print('left')move_x = -5left_key += 1#检测按键是否是d或者rightelif event.key == K_d or event.key == K_RIGHT:#print('right')elif event.key == K_w or event.key == K_UP:move_y = -5up_key += 1elif event.key == K_s or event.key == K_DOWN: move_y = 5down_key += 1#检测按键是否是空格键elif event.key == K_SPACE:#print('space')hero.fire()done = 1#enemis.fire()elif event.key == K_b:print('b')hero.bomb()if event.type == KEYUP:if event.key == K_a or event.key == K_LEFT: left_key -= 1if right_key == 0:move_x = 0else:move_x = 5if event.key == K_d or event.key == K_RIGHT: right_key -= 1if left_key == 0:move_x = 0else:move_x = -5if event.key == K_w or event.key == K_UP:up_key -= 1if down_key == 0:move_y = 0else:move_y = 5if event.key == K_s or event.key == K_DOWN: down_key -= 1if up_key == 0:move_y = 0else:move_y = -5if event.key == K_SPACE:done = 0screen.blit(background, (0, 0))hero.move(move_x, move_y)hero.display()hero.judge()enemis.display(hero)enemis.move()enemis.fire()bomb.display()bomb.judge(hero)bomb.move()supply0.display()supply0.judge(hero)supply0.move()#clear.display()#clear.judge(hero, enemis)#clear.move()for i in range(enemis.num):judge1(hero, enemis.enemy_list[i])#enemis.enemy_list[i].judge(hero)clear_enemy(enemis)judge_num(enemis)show_text(screen)boss.move()# mark+=1# if mark==8:boss.fire()# mark = 0#boss.judgejudge3(hero, boss)pygame.display.update()if __name__ == "__main__":main()⽅法是利⽤⾯向对象的思想,写了基本的敌机类、英雄类、武器类等,利⽤继承关系产⽣多架敌机。

【python】10分钟教你用Python做个打飞机小游戏超详细教程

【python】10分钟教你用Python做个打飞机小游戏超详细教程

【python】10分钟教你⽤Python做个打飞机⼩游戏超详细教程整体框架开始之前-精灵类Sprite⼦弹类class Bullet玩家飞机类class Player敌机类class Enemy游戏主体循环以及帧率设置让⼦弹飞刷出敌机 打怪把飞机敌机⼦弹都画出来处理键盘事件分数显⽰ 和 GameOver最终代码这次还是⽤python的pygame库来做的游戏。

关于这个库的内容,读者可以上⽹了解⼀下。

本⽂只讲解⽤到的知识。

代码参考⾃⽹上,⾃⼰也做了⼀点代码简化。

尽量把最核⼼的⽅⾯⽤最简单的⽅式呈现给⼤家,让⼤家尽快掌握这个游戏的框架。

⾄于那些华丽的功能,⼤家在弄懂了核⼼知识以后,再去添加也是⾮常easy的。

这个游戏设计⽤到了⾯向对象的编程思想。

游戏主体划分为三个主要的类:⼦弹类class Bullet玩家类class Player敌机类class Enemy在屏幕上可见的也就是这三个东西了。

⾃⼰的飞机、敌⼈的飞机、⼦弹。

因此整个游戏的核⼼就是:把这三个东西的图像呈现在屏幕上。

判断和处理⼦弹撞击敌机和敌机撞击玩家这两种情况。

下⾯我们会展开为⼤家⼀⼀讲解。

在下⾯的代码中,你们会⼤量见到这个pygame.sprite模块。

这⾥就给⼤家介绍⼀下。

“sprite”,中⽂翻译“精灵”,在游戏动画⼀般是指⼀个独⽴运动的画⾯元素,在pygame中,就可以是⼀个带有图像(Surface)和⼤⼩位置(Rect)的对象。

简单来说是⼀个会动图⽚。

它的两个成员变量self.image=要显⽰图⽚的Surfaceself.rect = 显⽰Surface的区域对于self.rect,常⽤的设置rect的⽅法:self.rect = self.image.get_rect()。

然后设定self.rect.topleft=(0,0)来设定左上⾓的位置,从⽽设定这个精灵在屏幕上的显⽰位置。

精灵特别适合⽤在OO语⾔中,⽐如Python。

python实现飞机大战游戏

python实现飞机大战游戏

python实现飞机⼤战游戏飞机⼤战(Python)代码分为两个python⽂件,⼯具类和主类,需要安装pygame模块,能完美运⾏(⽹上好多不完整的,调试得⼼累。

实现出来,成就感还是满满的),如图所⽰:完整代码如下:1.⼯具类plane_sprites.pyimport randomimport pygame# 屏幕⼤⼩的常量SCREEN_RECT = pygame.Rect(0, 0, 480, 700)# 刷新的帧率FRAME_PER_SEC = 60# 创建敌机的定时器常量CREATE_ENEMY_EVENT = EREVENT# 英雄发射⼦弹事件HERO_FIRE_EVENT = EREVENT + 1class GameSprite(pygame.sprite.Sprite):"""飞机⼤战游戏精灵"""def __init__(self, image_name, speed=1):super().__init__()# 调⽤⽗类的初始化⽅法self.image = pygame.image.load(image_name)# 定义对象的属性self.rect = self.image.get_rect()self.speed = speeddef update(self):# 在屏幕的垂直⽅向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def __init__(self, is_alt=False):super().__init__("C:/Users/Administrator/Desktop/background.png")# 1. 调⽤⽗类⽅法实现精灵的创建(image/rect/speed) if is_alt:# 2. 判断是否是交替图像,如果是,需要设置初始位置self.rect.y = -self.rect.heightdef update(self):super().update()# 1. 调⽤⽗类的⽅法实现if self.rect.y >= SCREEN_RECT.height:# 2. 判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上⽅self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敌机精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/enemy1.png")# 1. 调⽤⽗类⽅法,创建敌机精灵,同时指定敌机图⽚ self.speed = random.randint(1, 3)# 2. 指定敌机的初始随机速度 1 ~ 3self.rect.bottom = 0# 3. 指定敌机的初始随机位置max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self):super().update()# 1. 调⽤⽗类⽅法,保持垂直⽅向的飞⾏# 2. 判断是否飞出屏幕,如果是,需要从精灵组删除敌机if self.rect.y >= SCREEN_RECT.height:self.kill()# print("飞出屏幕,需要从精灵组删除...")# kill⽅法可以将精灵从所有精灵组中移出,精灵就会被⾃动销毁def __del__(self):# print("敌机挂了 %s" % self.rect)passclass Hero(GameSprite):"""英雄精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/me1.png", 0)self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120self.bullets = pygame.sprite.Group()def update(self):self.rect.x += self.speedif self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("发射⼦弹...")for i in (0, 1, 2):bullet = Bullet()bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerxself.bullets.add(bullet)class Bullet(GameSprite):"""⼦弹精灵"""def __init__(self):super().__init__("C:/Users/Administrator/Desktop/bullet1.png", -2)def update(self):super().update()if self.rect.bottom < 0:self.kill()def __del__(self):print("⼦弹被销毁...")2.主类plane_main.pyimport pygamefrom plane_sprites import *class PlaneGame(object):"""飞机⼤战主游戏"""def __init__(self):print("游戏初始化")self.screen = pygame.display.set_mode(SCREEN_RECT.size)self.clock = pygame.time.Clock()self.__create_sprites()pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)def __create_sprites(self):bg1 = Background()bg2 = Background(True)self.back_group = pygame.sprite.Group(bg1, bg2)self.enemy_group = pygame.sprite.Group()self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("游戏开始...")while True:self.clock.tick(FRAME_PER_SEC)self.__event_handler()self.__check_collide()self.__update_sprites()pygame.display.update()def __event_handler(self):for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:# print("敌机出场...")# 创建敌机精灵enemy = Enemy()self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:# print("向右移动...")keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:enemy = Enemy()self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)if len(enemies) > 0:self.hero.kill()PlaneGame.__game_over()def __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)self.hero.bullets.update()self.hero.bullets.draw(self.screen)@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':game = PlaneGame()game.start_game()更多关于python游戏的精彩⽂章请点击查看以下专题:更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

python打飞机代码

python打飞机代码

python打飞机代码Python打飞机游戏开发:从零开始,一步一步教你制作一个简单的飞机射击游戏摘要:本文将以Python编程语言为基础,一步一步教你如何制作一个简单的飞机射击游戏。

我们将使用Pygame库来实现游戏的图形界面和交互功能,通过编写游戏的关键代码,如飞机的移动、敌机的生成和碰撞检测等,最终实现一个完整的飞机射击游戏。

第一步:准备工作在开始编写代码之前,我们需要先安装Pygame库。

在命令行中输入以下命令:pip install pygamePygame是专门用于游戏开发的Python库,它提供了丰富的函数和方法,方便我们进行游戏开发。

第二步:创建游戏窗口在创建游戏窗口之前,我们需要先导入Pygame库,并初始化它。

在代码的开头添加以下代码:pythonimport pygame# 初始化Pygame库pygame.init()# 设置游戏窗口大小screen_width = 480screen_height = 600screen = pygame.display.set_mode((screen_width, screen_height)) 第三步:加载游戏图片和音效在游戏中,我们需要使用一些图片和音效来呈现游戏的效果。

在创建游戏窗口的代码后面,我们可以添加以下代码来加载游戏需要的资源:python# 加载背景图片background = pygame.image.load("background.png")# 加载飞机图片player = pygame.image.load("player.png")# 加载敌机图片enemy = pygame.image.load("enemy.png")# 加载爆炸图片和音效explosion_img = pygame.image.load("explosion.png") explosion_sound = pygame.mixer.Sound("explosion.wav")第四步:绘制游戏界面我们使用一个循环来更新游戏界面,并获取玩家的输入。

python打飞机代码

python打飞机代码

python打飞机代码飞机游戏一直以来都是人们喜欢的一种小型休闲游戏。

通过控制飞机的移动和开火,玩家可以享受到刺激和乐趣。

在这篇文章中,我将为你介绍如何使用Python编写一个简单的打飞机游戏。

首先,我们需要安装Pygame库。

Pygame是一个专门用于开发游戏的Python 库,提供了许多有用的功能。

你可以使用以下命令来安装Pygame:```pip install pygame```安装完成后,我们可以开始编写游戏代码了。

让我们首先导入所需的库:```pythonimport pygameimport randomimport time```接下来,我们需要初始化Pygame并创建游戏窗口:```pythonpygame.init()width = 800height = 600screen = pygame.display.set_mode((width, height))pygame.display.set_caption("打飞机游戏")```在游戏窗口中,我们可以使用pygame.draw模块绘制游戏元素,比如敌机、子弹和玩家飞机:```pythonplayer_image = pygame.image.load("player.png")player_rect = player_image.get_rect()player_rect.centerx = width // 2player_rect.bottom = height - 10bullet_image = pygame.image.load("bullet.png")bullet_rect = bullet_image.get_rect()enemy_image = pygame.image.load("enemy.png")enemy_rect = enemy_image.get_rect()enemy_rect.centerx = random.randint(0, width)enemy_rect.top = 0```在游戏中,我们需要不断地获取用户输入来控制飞机的移动和开火。

python实现飞机大战游戏(pygame版)

python实现飞机大战游戏(pygame版)

python实现飞机⼤战游戏(pygame版)简介使⽤python实现pygame版的飞机⼤战游戏;环境:Windows系统+python3.8.0游戏规则:1.点击“PLAY”或者按键“P”开始游戏;2.敌机根据设置频率从顶部随机位置⽣成,⽣成后向下移动;3.飞船在底部中间⽣成,玩家使⽤上下左右键控制飞船移动,敲击空格键发射⼦弹;4.⼦弹打到敌机,该敌机产⽣爆炸效果并累计分数到右上⾓;5.消灭10只飞机后,等级升⾼,敌机⽣成频率变快,下落速度也变快;6.当三条命都消失了,游戏结束。

游戏运⾏效果如下:实现过程1.新建⽂件“file.py”,⽤来存储信息到⽂件和读取⽂件的信息,本例⽤来存储和读取最⾼分;import pickle# filename = 'file/stats.pkl'# 存储信息到⽂件def save_file(obj, filename):statsObj = load_file(filename)if statsObj == 0:# 不存在⽂件时,直接保存字典with open(filename, 'wb') as f:pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)else:# 存在⽂件时,只修改⽂件中的最⾼分for key, val in statsObj.items():# 获取⽂件最⾼分的值(当⽂件字段不⽌⼀个时候使⽤)if key == 'highScore':statsObj[key] = obj['highScore']obj = statsObjwith open(filename, 'wb') as f:pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)# 读取信息def load_file(filename):try:with open(filename, 'rb') as f:return pickle.load(f)except FileNotFoundError:# 不存在⽂件则输⼊错误信息msg = "Sorry, the file " + filename + " does not exist."print(msg)return 0# obj = {'highScore': 20, 'points': 5}# obj = {'highScore': 50}# save_file(obj, filename)# filedata = load_file(filename)# print(filedata)2.k新建⽂件settings.py,⽤来定义⼀些必须的基本属性和初始值;import file as fclass Settings():def __init__(self):self.screen_width = 480self.screen_height = 660self.bg_color = (230, 230, 230)# ⼦弹设置(宽、⾼、颜⾊、最⼤数量)self.bullet_width = 5self.bullet_height = 15self.bullet_color = 255, 255, 255# 敌机移动频率self.enemy_frequency = 0# 加快游戏节奏的速度self.speedup_scale = 1.1# 分数的提⾼速度self.score_scale = 1.5self.initialize_settings()# 初始化统计信息self.reset_stats()# 统计信息⽂件路径self.filename = 'file/stats.pkl'# 游戏刚启动时处于⾮活动状态self.game_active = False# 读取⽂件的最⾼分,在任何情况下都不应重置最⾼得分statsObj = f.load_file(self.filename)if statsObj == 0:# 不存在⽂件则显⽰最⾼分0highScore = 0else:for key, val in statsObj.items():# 获取⽂件最⾼分的值(当⽂件字段不⽌⼀个时候使⽤)if key == 'highScore':highScore = valself.high_score = highScoredef initialize_settings(self):"""初始化随游戏进⾏⽽变化的设置"""self.player_move_speed = 2.5self.bullet_speed = 3self.enemy_move_speed = 1# 记分self.one_points = 50def increase_speed(self):"""提⾼速度设置"""# self.player_move_speed *= self.speedup_scaleself.bullet_speed *= self.speedup_scaleself.enemy_move_speed *= self.speedup_scaleself.one_points = int(self.one_points * self.score_scale)def reset_stats(self):"""初始化在游戏运⾏期间可能变化的统计信息"""# 可射失的数量self.player_limit = 3# 射击分数self.score = 0# 等级self.level = 1# 打中多少矩形升⼀级self.level_number = 10# ⽣成敌机频率间隔self.enemy_frequency_space = 503.新建⽂件enemy.py,⽤来定义敌机类(位置topleft随机⽣成)和声明⽅法move;import pygameimport randomfrom pygame.sprite import Spriteclass Enemy(Sprite):def __init__(self, enemy_down_imgs, settings):super(Enemy, self).__init__()self.image = pygame.image.load('images/enemy1.png')self.rect = self.image.get_rect()self.rect.topleft = [random.randint(0, settings.screen_width - self.rect.width), 0]self.down_imgs = enemy_down_imgsself.speed = settings.enemy_move_speedself.down_index = 0# 敌机移动,边界判断及删除在游戏主循环⾥处理def move(self):self.rect.top += self.speed4.新建⽂件player.py,⽤来定义玩家类(可上下左右移动)和相应的⽅法;import pygamefrom pygame.sprite import Spriteclass Player(Sprite):def __init__(self, settings, screen):super(Player, self).__init__()self.settings = settingsself.screen = screenself.screen_rect = self.screen.get_rect()# 引⼊飞船图⽚并定位self.image = pygame.image.load('images/player.png')self.rect = self.image.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 移动标志self.move_left = Falseself.move_right = Falseself.move_down = Falseself.move_up = Falsedef rotate(self, angle):# 图⽚旋转self.image = pygame.transform.rotate(self.image, angle)def scale(self, multiple):# 图⽚缩放self.image = pygame.transform.smoothscale(self.image, (multiple, multiple))def update(self):if self.move_left and self.rect.left > self.screen_rect.left:self.rect.centerx -= self.settings.player_move_speedif self.move_right and self.rect.right < self.screen_rect.right:self.rect.centerx += self.settings.player_move_speedif self.move_down and self.rect.bottom < self.screen_rect.bottom:self.rect.centery += self.settings.player_move_speedif self.move_up and self.rect.top > 0:self.rect.centery -= self.settings.player_move_speeddef draw_player(self):"""绘制飞船到屏幕"""self.screen.blit(self.image, self.rect)5.新建⽂件“bullet.py”,⽤来定义⼦弹类(位置在飞船的顶部,并往上移动)和相应的⽅法;import pygamefrom pygame.sprite import Spriteclass Bullet(Sprite):""" ⼀个对飞船发射的⼦弹进⾏管理的类 """def __init__(self, settings, screen, player):""" 在飞船所处的位置创建⼀个⼦弹对象 """super(Bullet, self).__init__()self.screen = screen# 在 (0,0) 处创建⼀个表⽰⼦弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, settings.bullet_width, settings.bullet_height)self.rect.centerx = player.rect.centerx# 飞船顶部self.rect.bottom = player.rect.top# 存储⽤⼩数表⽰的⼦弹位置self.y = float(self.rect.y)self.color = settings.bullet_colorself.speed = settings.bullet_speeddef update(self):"""向上移动⼦弹"""# 更新表⽰⼦弹位置的⼩数值(⼦弹往右)self.y -= self.speed# 更新表⽰⼦弹的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制⼦弹"""pygame.draw.rect(self.screen, self.color, self.rect)6.新建⽂件“button.py”,⽤来定义按钮类和相应⽅法,本例使⽤于绘制“PLAY”按钮;import pygame.fontclass Button():def __init__(self, screen, msg):"""初始化按钮的属性"""self.screen = screenself.screen_rect = screen.get_rect()# 设置按钮的尺⼨和其他属性self.width, self.height = 100, 30self.button_color = (216, 30, 6)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 36)# 创建按钮的rect对象,并使其居中self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.center# 按钮的标签只需创建⼀次self.prep_msg(msg)def prep_msg(self, msg):"""将msg渲染为图像,并使其在按钮上居中"""self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):# 绘制⼀个⽤颜⾊填充的按钮,再绘制⽂本self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)7.新建⽂件“scoreboard.py”,⽤来定义记分板,本例使⽤于绘制左上⾓飞船(⽣命数)、顶部中间的“最⾼分”、右上⾓的“积分”和“等级”;import pygame.fontfrom pygame.sprite import Groupfrom player import Playerclass Scoreboard():"""显⽰得分信息的类"""def __init__(self, settings, screen):"""初始化显⽰得分涉及的属性"""self.screen = screenself.screen_rect = screen.get_rect()self.settings = settings# 显⽰得分信息时使⽤的字体设置self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 30)# 飞船缩放值self.scaleValue = 20# 准备初始得分图像\最⾼得分\等级self.prep_score()self.prep_high_score()self.prep_level()self.prep_players()def prep_score(self):"""将得分转换为渲染的图像"""rounded_score = int(round(self.settings.score, -1))score_str = '{:,}'.format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color)# 将得分放在屏幕右上⾓self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right -20self.score_rect.top = 10def prep_high_score(self):""" 将最⾼得分转换为渲染的图像 """high_score = int(round(self.settings.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True, self.text_color)# 将最⾼得分放在屏幕顶部中央self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef prep_level(self):"""将等级转换为渲染的图像"""self.level_image = self.font.render(str(self.settings.level), True, self.text_color)# 将等级放在得分下⽅self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom + 10def prep_players(self):""" 显⽰还余下多少艘飞船 """self.players = Group()for player_number in range(self.settings.player_limit):player = Player(self.settings, self.screen)# 缩放球⼤⼩并赋值位置player.scale(self.scaleValue)player.rect.x = 10 + player.rect.width * player_number * 0.5player.rect.y = self.score_rect.topself.players.add(player)def show_score(self):"""在屏幕上显⽰得分"""self.screen.blit(self.score_image, self.score_rect)self.screen.blit(self.high_score_image, self.high_score_rect)self.screen.blit(self.level_image, self.level_rect)# 绘制飞船self.players.draw(self.screen)8.新建⽂件“game_functions.py”,存放跟游戏有关的所有业务逻辑函数(代码有详细的注释信息);import sysimport pygamefrom bullet import Bulletfrom enemy import Enemyimport file as f# 事件def check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound):""" 响应按键和⿏标事件 """for event in pygame.event.get():if event.type == pygame.QUIT:save_file(settings)sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound)elif event.type == pygame.KEYUP:check_keyup_events(event, player)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y)def check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound):""" 响应按键 """if event.key == pygame.K_DOWN:player.move_down = Trueelif event.key == pygame.K_UP:player.move_up = Trueelif event.key == pygame.K_LEFT:player.move_left = Trueelif event.key == pygame.K_RIGHT:player.move_right = Trueelif event.key == pygame.K_SPACE:fireSound.play()# 点击空格键创建⼀颗⼦弹fire_bullet(settings, screen, player, bullets)elif event.key == pygame.K_p:start_game(settings, scoreboard)elif event.key == pygame.K_q:save_file(settings)sys.exit()def check_keyup_events(event, player):""" 响应松开 """if event.key == pygame.K_DOWN:player.move_down = Falseelif event.key == pygame.K_UP:player.move_up = Falseelif event.key == pygame.K_LEFT:player.move_left = Falseelif event.key == pygame.K_RIGHT:player.move_right = Falsedef check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y):"""在玩家单击Play按钮时开始新游戏"""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not settings.game_active:start_game(settings, scoreboard)def start_game(settings, scoreboard):"""开始游戏"""# 重置游戏设置settings.initialize_settings()# 隐藏光标pygame.mouse.set_visible(False)# 重置游戏统计信息settings.reset_stats()settings.game_active = True# 重置记分牌图像scoreboard.prep_score()scoreboard.prep_high_score()scoreboard.prep_level()scoreboard.prep_players()def save_file(settings):# 保持⽂件obj = {'highScore': settings.high_score}f.save_file(obj, settings.filename)# 敌机def update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound): # ⽣成敌机,需要控制⽣成频率if settings.enemy_frequency % settings.enemy_frequency_space == 0:enemy1 = Enemy(enemy_down_imgs, settings)enemies.add(enemy1)settings.enemy_frequency += 1if settings.enemy_frequency >= 100:settings.enemy_frequency = 0for enemy in enemies:# 移动敌机enemy.move()# 敌机与玩家飞机碰撞效果处理两个精灵之间的圆检测if pygame.sprite.collide_circle(enemy, player):enemies_down.add(enemy)enemies.remove(enemy)settings.player_limit -= 1scoreboard.prep_players()break# 移动出屏幕后删除飞机if enemy.rect.top < 0:enemies.remove(enemy)# 敌机被⼦弹击中效果处理# 将被击中的敌机对象添加到击毁敌机 Group 中,⽤来渲染击毁动画# ⽅法groupcollide()是检测两个精灵组中精灵们的矩形冲突enemies1_down = pygame.sprite.groupcollide(enemies, bullets, True, True)if enemies1_down:explosiveSound.play()# 计算分数并渲染for enemys in enemies1_down.values():settings.score += settings.one_points * len(enemys)scoreboard.prep_score()# 渲染最⾼分check_high_score(settings, scoreboard)# 等达到等级数量升级并渲染新等级settings.level_number -= 1if settings.level_number == 0:settings.increase_speed()settings.level += 1scoreboard.prep_level()# 还原为4(同settings⼀致)settings.level_number = 10# 加快⽣成敌机if settings.enemy_frequency_space > 10:settings.enemy_frequency_space -= 10# 遍历key值返回的碰撞敌机for enemy_down in enemies1_down:# 点击销毁的敌机到列表enemies_down.add(enemy_down)# 敌机被⼦弹击中效果显⽰for enemy_down in enemies_down:if enemy_down.down_index == 0:passif enemy_down.down_index > 7:enemies_down.remove(enemy_down)continue#显⽰碰撞图⽚screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect) enemy_down.down_index += 1# 显⽰精灵enemies.draw(screen)# ⼦弹def fire_bullet(settings, screen, player, bullets):"""创建⼦弹"""new_bullet = Bullet(settings, screen, player)bullets.add(new_bullet)def update_bullets(screen, bullets):"""更新⼦弹的位置,并删除已消失的⼦弹"""# 更新⼦弹的位置bullets.update()# 删除已消失的⼦弹并同时更新飞船的⽣命for bullet in bullets.copy():if bullet.rect.top < screen.get_rect().top:bullets.remove(bullet)# 分数def check_high_score(settings, scoreboard):"""检查是否诞⽣了新的最⾼得分"""if settings.score > settings.high_score:settings.high_score = settings.scorescoreboard.prep_high_score()# 屏幕def update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets): """ 更新屏幕上的图像,并切换到新屏幕 """# 绘制飞船到屏幕player.draw_player()# 绘制⼦弹到屏幕for bullet in bullets.sprites():bullet.draw_bullet()# 渲染记分牌信息scoreboard.show_score()#if settings.player_limit == 0:settings.game_active = Falsesettings.reset_stats()# 清空矩形列表和⼦弹列表enemies.empty()bullets.empty()screen_rect = screen.get_rect()player.rect.centerx = screen_rect.centerxplayer.rect.bottom = screen_rect.bottom# 如果游戏处于⾮活动状态,就绘制 Play 按钮if not settings.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()9.新建⽂件shootingenemy.py,主函数⽤来初始化程序,并同步更新程序的信息;import pygamefrom pygame.sprite import Groupfrom settings import Settingsfrom button import Buttonfrom player import Playerimport game_functions as gffrom scoreboard import Scoreboarddef run_game():pygame.init()# 初始化全部⾳频,并加载爆炸声⾳乐pygame.mixer.init()# 等待1spygame.time.delay(1000)pygame.mixer.music.load('file/bgsound.mp3')# -1代表⽆限循环(背景⾳乐)pygame.mixer.music.play(-1)# 爆炸声explosiveSound = pygame.mixer.Sound('file/explosiveSound.wav')# 枪声fireSound = pygame.mixer.Sound('file/fireSound.wav')# 游戏循环帧率设置clock = pygame.time.Clock()settings = Settings()screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))# 全屏显⽰# screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)pygame.display.set_caption('飞机⼤战')# 左上⾓图标ic_launcher = pygame.image.load('images/ic_launcher.png').convert_alpha()pygame.display.set_icon(ic_launcher)# 背景图background = pygame.image.load('images/background.png').convert_alpha()# 敌机图⽚enemy_img1= pygame.image.load('images/enemy1.png')enemy_img2= pygame.image.load('images/enemy2.png')enemy_img3= pygame.image.load('images/enemy3.png')enemy_img4= pygame.image.load('images/enemy4.png')# 敌机不同状态的图⽚列表,多张图⽚展⽰为动画效果enemy_down_imgs = []enemy_down_imgs.append(enemy_img1)enemy_down_imgs.append(enemy_img2)enemy_down_imgs.append(enemy_img3)enemy_down_imgs.append(enemy_img4)# 储存敌机enemies = Group()# 存储被击毁的飞机,⽤来渲染击毁动画enemies_down = Group()# 创建Play按钮play_button = Button(screen, 'Play')# 创建飞船player = Player(settings, screen)# 创建⼦弹的编组bullets = Group()# 创建记分牌scoreboard = Scoreboard(settings, screen)while True:# 绘制背景screen.blit(background, (0, 0))# 控制游戏最⼤频率clock.tick(60)# 检查玩家输⼊(不加会导致⼀直加载)gf.check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound)if settings.game_active:# 更新飞船位置player.update()# 更新敌机gf.update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound)# 更新⼦弹位置gf.update_bullets(screen, bullets)# 更新屏幕信息gf.update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets)run_game(),10.在⽂件shootingenemy.py⽬录路径下,执⾏命令“python shootingenemy.py”弹出窗⼝,即可对其操作游玩。

Python小游戏代码:飞机大战(超详细)

Python小游戏代码:飞机大战(超详细)

Python⼩游戏代码:飞机⼤战(超详细)我⽤的是pycharm,⼤家可以⽤别的Python编辑器。

创建⼀个新的⽂件夹,把图⽚的⽂件夹导⼊,图⽚的链接我放下⾯了,⼤家⾃取。

提取码:Leo1在刚才的⽂件夹⾥新建Python⽂件,输⼊以下代码# coding:utf-8import pygame, sys, random, time, easyguifrom pygame.locals import *# 初始化pygame环境pygame.init()# 创建⼀个长宽分别为480/650窗⼝canvas = pygame.display.set_mode((480, 650))canvas.fill((255, 255, 255))# 设置窗⼝标题pygame.display.set_caption("飞机⼤战")bg = pygame.image.load("images/bg1.png")enemy1 = pygame.image.load("images/enemy1.png")enemy2 = pygame.image.load("images/enemy2.png")enemy3 = pygame.image.load("images/enemy3.png")b = pygame.image.load("images/bullet1.png")h = pygame.image.load("images/hero.png")#开始游戏图⽚startgame=pygame.image.load("images/startGame.png")#logo图⽚logo=pygame.image.load("images/LOGO.png")#暂停图⽚pause = pygame.image.load("images/game_pause_nor.png")# 添加时间间隔的⽅法def isActionTime(lastTime, interval):if lastTime == 0:return TruecurrentTime = time.time()return currentTime - lastTime >= interval# 定义Sky类class Sky():def __init__(self):self.width = 480self.height = 852self.img = bgself.x1 = 0self.y1 = 0self.x2 = 0self.y2 = -self.height# 创建paint⽅法def paint(self):canvas.blit(self.img, (self.x1, self.y1))canvas.blit(self.img, (self.x2, self.y2))# 创建step⽅法def step(self):self.y1 = self.y1 + 1self.y2 = self.y2 + 1if self.y1 > self.height:self.y1 = -self.heightif self.y2 > self.height:self.y2 = -self.height# 定义⽗类FlyingObjectclass FlyingObject(object):def __init__(self, x, y, width, height, life, img):self.x = xself.y = yself.width = widthself.height = heightself.life = lifeself.img = img# 敌飞机移动的时间间隔stTime = 0self.interval = 0.01# 添加删除属性self.canDelete = False# 定义paint⽅法def paint(self):canvas.blit(self.img, (self.x, self.y))# 定义step⽅法def step(self):# 判断是否到了移动的时间间隔if not isActionTime(stTime, self.interval):returnstTime = time.time()# 控制移动速度self.y = self.y + 2# 定义hit⽅法判断两个对象之间是否发⽣碰撞def hit(self, component):c = componentreturn c.x > self.x - c.width and c.x < self.x + self.width and \ c.y > self.y - c.height and c.y < self.y + self.height# 定义bang⽅法处理对象之间碰撞后的处理def bang(self, bangsign):# 敌机和英雄机碰撞之后的处理if bangsign:if hasattr(self, 'score'):GameVar.score += self.scoreif bangsign == 2:self.life -= 1# 设置删除属性为Trueself.canDelete = True# 敌机和⼦弹碰撞之后的处理else:self.life -= 1if self.life == 0:# 设置删除属性为Trueself.canDelete = Trueif hasattr(self, 'score'):GameVar.score += self.score# 定义outOfBounds⽅法判断对象是否越界def outOfBounds(self):return self.y > 650# 重构Enemy类class Enemy(FlyingObject):def __init__(self, x, y, width, height, type, life, score, img):FlyingObject.__init__(self, x, y, width, height, life, img)self.type = typeself.score = score# 重构Hero类class Hero(FlyingObject):def __init__(self, x, y, width, height, life, img):FlyingObject.__init__(self, x, y, width, height, life, img)self.x = 480 / 2 - self.width / 2self.y = 650 - self.height - 30self.shootLastTime = 0self.shootInterval = 0.3def shoot(self):if not isActionTime(self.shootLastTime, self.shootInterval):returnself.shootLastTime = time.time()GameVar.bullets.append(Bullet(self.x + self.width / 2 - 5, self.y - 10, 10, 10, 1, b))# 重构Bullet类class Bullet(FlyingObject):def __init__(self, x, y, width, height, life, img):FlyingObject.__init__(self, x, y, width, height, life, img)def step(self):self.y = self.y - 2# 重写outOfBounds⽅法判断⼦弹是否越界def outOfBounds(self):return self.y < -self.height# 创建componentEnter⽅法def componentEnter():# 随机⽣成坐标x = random.randint(0, 480 - 57)x1 = random.randint(0, 480 - 50)x2 = random.randint(0, 480 - 100)# 根据随机整数的值⽣成不同的敌飞机n = random.randint(0, 9)# 判断是否到了产⽣敌飞机的时间if not isActionTime(stTime, GameVar.interval):returnstTime = time.time()if n <= 7:GameVar.enemies.append(Enemy(x, 0, 57, 45, 1, 1, 1, enemy1))elif n == 8:GameVar.enemies.append(Enemy(x1, 0, 50, 68, 2, 3, 5, enemy2))elif n == 9:if len(GameVar.enemies) == 0 or GameVar.enemies[0].type != 3:GameVar.enemies.insert(0, Enemy(x2, 0, 100, 153, 3, 10, 20, enemy3))# 创建画组件⽅法def componentPaint():# 判断是否到了飞⾏物重绘的时间if not isActionTime(GameVar.paintLastTime, GameVar.paintInterval):returnGameVar.paintLastTime = time.time()# 调⽤sky对象的paint⽅法GameVar.sky.paint()for enemy in GameVar.enemies:enemy.paint()# 画出英雄机GameVar.hero.paint()# 画出⼦弹对象for bullet in GameVar.bullets:bullet.paint()# 写出分数和⽣命值renderText('SCORE:' + str(GameVar.score), (0, 0))renderText('LIFE:' + str(GameVar.heroes), (380, 0))# 创建组件移动的⽅法def componentStep():# 调⽤sky对象的step⽅法GameVar.sky.step()for enemy in GameVar.enemies:enemy.step()# 使⼦弹移动for bullet in GameVar.bullets:bullet.step()# 创建删除组件的⽅法def componentDelete():for enemy in GameVar.enemies:if enemy.canDelete or enemy.outOfBounds():GameVar.enemies.remove(enemy)for bullet in GameVar.bullets:if bullet.canDelete or bullet.outOfBounds():GameVar.bullets.remove(bullet)# 从列表中删除英雄机if GameVar.hero.canDelete == True:GameVar.heroes -= 1if GameVar.heroes == 0:#easygui.msgbox('游戏结束')GameVar.state = GameVar.STATES['GAME_OVER']else:GameVar.hero = Hero(0, 0, 60, 75, 1, h)# 定义GameVar类class GameVar():sky = Sky()enemies = []# 产⽣敌飞机的时间间隔lastTime = 0interval = 1.5# 重绘飞⾏物的时间间隔paintLastTime = 0paintInterval = 0.04# 创建英雄机对象hero = Hero(0, 0, 60, 75, 1, h)# 创建列表存储⼦弹对象bullets = []# 添加分数和⽣命值score = 0heroes = 3#创建字典存储游戏状态STATES = {'START':1,'RUNNING':2,'PAUSE':3,'GAME_OVER':4}state = STATES['START']print(GameVar.state)# 定义renderText⽅法def renderText(text, position):my_font = pygame.font.SysFont("微软雅⿊", 40)newText = my_font.render(text, True, (255, 255, 255))canvas.blit(newText, position)# 创建游戏退出事件处理⽅法def handleEvent():for event in pygame.event.get():if event.type == pygame.QUIT or event.type == KEYDOWN and event.key == K_ESCAPE: pygame.quit()sys.exit()#点击⿏标开始游戏if event.type == MOUSEBUTTONDOWN and event.button == 1:if GameVar.state == GameVar.STATES['START']:GameVar.state = GameVar.STATES['RUNNING']# 英雄机跟随⿏标移动if event.type == MOUSEMOTION:if GameVar.state == GameVar.STATES['RUNNING']:GameVar.hero.x = event.pos[0] - GameVar.hero.width / 2GameVar.hero.x = event.pos[0] - GameVar.hero.width / 2 GameVar.hero.y = event.pos[1] - GameVar.hero.height / 2# 调⽤⽅法判断⿏标移⼊画布if isMouseOver(event.pos[0], event.pos[1]):#print('⿏标移⼊事件')if GameVar.state == GameVar.STATES['PAUSE']:GameVar.state = GameVar.STATES['RUNNING']# 调⽤⽅法判断⿏标移出画布if isMouseOut(event.pos[0], event.pos[1]):#print('⿏标移出事件')if GameVar.state == GameVar.STATES['RUNNING']:GameVar.state = GameVar.STATES['PAUSE']# 创建⽅法判断⿏标移出画布def isMouseOut(x, y):if x >= 479 or x <= 0 or y >= 649 or y <= 0:return Trueelse:return False# 创建⽅法判断⿏标移⼊画布def isMouseOver(x, y):if x > 1 and x < 479 and y > 1 and y < 649:return Trueelse:return False# 创建checkHit⽅法def checkHit():# 判断英雄机是否与每⼀架敌飞机发⽣碰撞for enemy in GameVar.enemies:if GameVar.hero.hit(enemy):# 敌机和英雄机调⽤bang⽅法enemy.bang(1)GameVar.hero.bang(2)# 判断每⼀架敌飞机是否与每⼀颗⼦弹发⽣碰撞for bullet in GameVar.bullets:if enemy.hit(bullet):# 敌机和⼦弹调⽤bang⽅法enemy.bang(0)bullet.bang(0)#创建controlState⽅法控制游戏状态def controlState():#游戏开始状态if GameVar.state == GameVar.STATES['START']:GameVar.sky.paint()GameVar.sky.step()canvas.blit(logo,(-40,200))canvas.blit(startgame,(150,400))#游戏运⾏状态elif GameVar.state == GameVar.STATES['RUNNING']:componentEnter()componentPaint()componentStep()checkHit()GameVar.hero.shoot()componentDelete()#游戏暂停状态elif GameVar.state == GameVar.STATES['PAUSE']:componentPaint()componentPaint()GameVar.sky.step()canvas.blit(pause,(0,0))#游戏结束状态elif GameVar.state == GameVar.STATES['GAME_OVER']: componentPaint()GameVar.sky.step()renderText('gameOver',(180,320))while True:#调⽤控制游戏状态的⽅法controlState()# 刷新屏幕pygame.display.update()# 调⽤handleEvent⽅法handleEvent()# 延迟处理pygame.time.delay(15)运⾏程序就可以了!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

游戏分享:手把手教你用Python编写
战斗机游戏
2018.1.23
游戏制作
今天我们要分享的是战斗机游戏!在这个游戏中,飞机(游戏主角)需要躲避迎面飞来的炮弹(敌人)。

下面让我们一起来看一下如何编写这个小游戏吧!
初始设置
首先,创建一个新的.py文件然后置入下面的代码:
import pygame
from pygame.locals import*
pygame.init()
和其他所有python程序一样,我们要首先导入(import)我们所要使用的模块(module)。

在今天这个例子里,我们要导入pygame以及pygame.locals,以用于后面的内容。

最后一行pygame.init()将所有的PyGame模块初始化,在我们正式开始写PyGame的“正文内容”之前,都要先加上这一行。

屏幕对象
首先,我们需要为所有的物体创建一个画布窗口,我们把这个变量叫做screen。

为了创建这个变量,我们需要调用pygame.display下的set_mode()方法(method),并向set_mode()传递一个元组(tuple)来表示窗口的高和宽(在这里我们设置一个高800宽600的窗口)。

import pygame
from pygame.locals import*
pygame.init()
screen=pygame.display.set_mode((800,600))
现在,如果你运行程序,你将会看到一个窗口突然出现,并在我们退出程序时马上消失。

看来我们已经成功创建了画布!在下一部分,我们将加入游戏的main循环,这样我们就能确保只有我们输入正确的退出命令时,程序才会退出。

游戏循环
游戏的主循环内包含了所有要发生的事件。

当我们玩游戏时,这段程序一直在运行。

它能够不断更新游戏的状态,渲染游戏屏幕效果,并且收集玩家输入的指令。

除了让主循环在游戏进行中不断执行,我们也需要让循环在我们退出程序时停止。

因而,我们需要引入一些相应的指令,让程序能够在这些指令输入(input)时作出相应的反应。

所有输入的指令(以及之后一些其他的事件)都会进入PyGame 的事件队列中,我们可以通过pygame.event.get()来得到这些事件。

这个命令会返回队列中的事件列表,在游戏中,程序将对这些事件进行循环,并且根据事件的类别作出相应的反应。

在下一段代码中,我们要处理的是KEYDOWN和QUIT事件:
#用于让主循环不断运行的变量
running=True
#主循环
while running:
#针对事件队列的for循环
for event in pygame.event.get():
#检测是否有KEYDOWN事件,KEYDOWN是一个在pygame.locals中定义了的事件常量,这个库我们之前导入过
if event.type==KEYDOWN:
#如果按了ESC键,把running的值设为False,并退出主循环
if event.key==K_ESCAPE:
running=False
#检测是否有QUIT事件,如果有的话,把running的值设为Flase elif event.type==QUIT:
running=False
把这几行代码加到之前的代码之后,然后执行程序。

你应该会看到一个空白的窗口。

这个窗口只会在你按下ESC键以激活QUIT事件的时候才会关闭。

Surface和Rect对象
Surface和Rect是PyGame里的基础模块。

我们可以把surface理解为一张白纸,我们可以在这张白纸上画任何想画的东西。

我们的screen变量也是一个“surface“,因为它也是用于承载图像的。

Rect代表surface内的一个矩形区域。

现在,让我们创建一个50像素x50像素的surface,用surf变量来代表这个surface,然后给这个surface对象填充颜色。

由于窗口的默认背景色是黑色,我们将把这个surface对象填充为白色,这样在颜色对比之下就更明显一些。

然后我们要对这个surface调用get_rect()方法,然后得到这个surface代表的矩形区域以及surface的x、y坐标。

#创建surface对象,将长和宽以元组的形式传递
surf=pygame.Surface((50,50))
#用白色填充surface对象,让它与背景有所区别
surf.fill((255,255,255))
rect=surf.get_rect()
Blit和Flip
要使我们创建的surface显示在屏幕上,仅仅创建它是不够的,我们还需要用blit 把这个surface放到另一个surface(screen)上。

在PyGame中,我们可以把blit理解为“画”。

我们可以用blit把一个surface画在另一个surface上,在这里,我们的另一个surface就是我们的大画布screen。

下面的代码显示如何将surface变量surf画在screen上:
#这行的意思是“在画布screen横坐标400纵坐标300的地方画一个surf”
screen.blit(surf,(400,300))
pygame.display.flip()
blit()带有两个参数:一个是我们要画上去的surface,另一个是我们要画的位置的坐标。

在这里,(400,300)代表了screen画布的中心,但是当你真正执行程序的时候你会发现,surf并没有出现在屏幕的正中央。

这是因为blit()都是从左上角开始画图的,(400,300)代表了surface的左上角。

需要注意的是,我们在blit后调用了pygame.display.flip()。

Flip会在每一次循环时刷新屏幕,从而显示在上一次循环后屏幕更新后的状态。

如果不调用flip()的话,这些更新是不会显示的。

(未完待续)。

相关文档
最新文档