python基础实践之飞机大战(纯代码)
python 打飞机代码
以下是一个简单的Python 打飞机游戏的代码示例:```pythonimport pygameimport random# 初始化Pygamepygame.init()# 设置窗口大小screen_width = 800screen_height = 600screen = pygame.display.set_mode((screen_width, screen_height))# 设置颜色white = (255, 255, 255)blue = (0, 0, 255)red = (255, 0, 0)# 加载飞机和子弹图片plane_image = pygame.image.load("plane.png").convert_alpha()bullet_image = pygame.image.load("bullet.png").convert_alpha()bullet_speed = 5# 设置飞机和子弹的位置和速度plane_x = screen_width // 2plane_y = screen_height // 2bullets = []for i in range(10):bullet_x = random.randint(0, screen_width - bullet_image.get_width())bullet_y = random.randint(0, screen_height)bullets.append((bullet_x, bullet_y))bullet_speed *= 1.1# 游戏主循环while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:bullet_x = plane_x + plane_width // 2 - bullet_image.get_width() // 2bullet_y = plane_y - bullet_image.get_height()bullets[-1] = (bullet_x, bullet_y)bullets.append(None)bullets[len(bullets) - 1].direction = random.choice([-1, 1])keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:plane_x -= bullet_speed * keys[pygame.K_LEFT] * 1.1 * -1if keys[pygame.K_RIGHT]:plane_x += bullet_speed * keys[pygame.K_RIGHT] * 1.1 * 1if keys[pygame.K_UP]:plane_y -= bullet_speed * keys[pygame.K_UP] * 1.1 * -1 * -1 / bullet_image.get_height() / 3 # 这行代码用于计算飞机的上升速度,根据图片的高度计算。
python飞机大战代码
python飞机大战代码以下是一个简单的 python 飞机大战游戏的代码示例:```python。
import pygame。
import random。
# 初始化 Pygame。
pygame.init()。
#设置游戏窗口大小和标题。
WINDOW_WIDTH=640。
WINDOW_HEIGHT=480。
screen = pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))。
pygame.display.set_caption("飞机大战")。
#加载背景图片。
background_img =pygame.image.load("background.jpg").convert()。
#加载玩家飞机图片和音效。
player_img = pygame.image.load("player.png").convert_alpha()。
player_explosion_sound = pygame.mixer.Sound("explosion.wav")。
#加载敌机图片和音效。
enemy_img = pygame.image.load("enemy.png").convert_alpha()。
enemy_explosion_sound = pygame.mixer.Sound("explosion.wav")。
#加载子弹图片和音效。
bullet_img = pygame.image.load("bullet.png").convert_alpha()。
bullet_sound = pygame.mixer.Sound("bullet.wav")。
#定义玩家飞机和敌机的初始位置和速度。
player_x = 300。
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)运⾏程序就可以了!。
python飞机大战程序设计报告
一、概述飞机大战是一款经典的射击游戏,玩家控制飞机在屏幕上不断向上飞行,同时射击敌机,躲避敌机的攻击。
Python作为一种广泛应用于软件开发的高级编程语言,可以用来开发各种类型的游戏。
本报告将详细介绍使用Python语言设计飞机大战程序的过程和实现方法。
二、程序设计目标1. 实现一个具有玩家飞机和敌机的基本射击游戏;2. 能够控制玩家飞机的移动和发射子弹;3. 敌机能够不断向下移动,并且发射子弹攻击玩家飞机;4. 实现游戏得分的计算和显示;5. 添加背景音乐和游戏音效。
三、程序设计思路1. 确定游戏窗口大小和背景图片;2. 创建玩家飞机和敌机的类,并实现它们的移动和碰撞检测;3. 实现玩家飞机的发射子弹和敌机的发射子弹;4. 添加得分和生命值的显示;5. 引入背景音乐和游戏音效。
四、程序设计过程1. 导入pygame模块,并初始化pygame;2. 设置游戏窗口大小和标题,并加载背景图片;3. 创建玩家飞机和敌机的类,实现它们的移动和碰撞检测;4. 实现玩家飞机的发射子弹和敌机的发射子弹;5. 添加得分和生命值的显示;6. 引入背景音乐和游戏音效。
五、程序设计实现1. 导入pygame模块,并初始化pygame:import pygamepygame.init()2. 设置游戏窗口大小和标题,并加载背景图片:SCREEN_WIDTH = 480SCREEN_HEIGHT = 600screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption('飞机大战')background = pygame.image.load('background.jpg').convert()3. 创建玩家飞机和敌机的类,实现它们的移动和碰撞检测:class Plane(pygame.sprite.Sprite):def __init__(self, image, speed):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image)self.rect = self.image.get_rect()self.speed = speeddef move(self):passdef shoot(self):passdef collide(self):pass4. 实现玩家飞机的发射子弹和敌机的发射子弹:class Bullet(pygame.sprite.Sprite):def __init__(self, image, speed, position): pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image) self.rect = self.image.get_rect()self.speed = speedself.rect.midbottom = positiondef move(self):pass5. 添加得分和生命值的显示:class Score(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.score = 0self.font = pygame.font.Font(None, 36)def update(self):self.text = 'Score: d' self.scoreself.image = self.font.render(self.text, 1, (255, 0, 0))self.rect = self.image.get_rect()self.rect.topleft = [10, 10]6. 引入背景音乐和游戏音效:pygame.mixer.init()pygame.mixer.music.load('background_music.mp3') pygame.mixer.music.play(-1, 0.0)bullet_sound = pygame.mixer.Sound('bullet.wav')enemy_sound = pygame.mixer.Sound('enemy.wav')六、程序设计实现结果1. 程序设计完成后,玩家可以通过键盘控制飞机的移动和发射子弹;2. 敌机会不断向下移动,并发射子弹攻击玩家飞机;3. 游戏窗口中显示玩家的得分和生命值;4. 背景音乐和游戏音效能够正常播放。
python课程设计飞机大战
python课程设计飞机大战一、教学目标本章节的教学目标是使学生掌握Python编程基础,学会使用Python语言编写简单的游戏程序。
具体分为以下三个部分:1.知识目标:使学生掌握Python基本语法、数据类型、控制结构、函数等编程基础。
2.技能目标:培养学生运用Python语言解决实际问题的能力,如编写简单的游戏程序。
3.情感态度价值观目标:激发学生对编程和计算机科学的兴趣,培养学生的创新精神和团队合作意识。
二、教学内容本章节的教学内容主要包括以下几个部分:1.Python基本语法和数据类型。
2.控制结构,如条件判断、循环等。
3.函数的定义和调用。
4.面向对象编程基础。
5.游戏开发实战,以“飞机大战”为例,让学生动手编写游戏程序。
三、教学方法本章节的教学方法采用讲授法、案例分析法和实验法相结合的方式。
具体如下:1.讲授法:用于讲解Python基本语法、数据类型、控制结构、函数等编程基础。
2.案例分析法:通过分析实际的编程案例,如“飞机大战”游戏,让学生理解并掌握面向对象编程思想。
3.实验法:让学生动手编写“飞机大战”游戏程序,巩固所学知识,提高实际编程能力。
四、教学资源本章节的教学资源包括以下几个部分:1.教材:《Python编程:从入门到实践》。
2.参考书:《Python核心编程》。
3.多媒体资料:教学PPT、视频教程等。
4.实验设备:计算机、网络等。
5.在线编程平台:如LeetCode、牛客网等,用于学生练习和交流。
五、教学评估本章节的教学评估主要包括以下几个方面:1.平时表现:评估学生在课堂上的参与度、提问回答等情况,以考察学生的学习态度和积极性。
2.作业:评估学生完成作业的质量、创新性和实践能力,以检验学生对知识点的掌握程度。
3.考试:设置期中、期末考试,全面考察学生的Python编程能力和应用水平。
4.项目实践:评估学生在课程项目中的表现,如“飞机大战”游戏的编写,以检验学生的实际编程能力和团队协作能力。
飞机大战小游戏编程实现
飞机大战小游戏编程实现飞机大战是一款经典的射击游戏,它的快节奏和刺激的战斗场景吸引了无数玩家。
如果你对编程有一定了解,那么你也可以尝试自己编写一个飞机大战小游戏。
本文将为你介绍如何使用Python语言实现一个简单的飞机大战小游戏。
一、游戏背景设置在开始编程之前,我们需要对游戏背景进行设置。
首先,我们需要导入所需的Python库,如pygame库,它是一个专门用于游戏开发的库。
接下来,我们需要创建游戏窗口,并设置窗口的标题和大小。
为了让游戏更加流畅,我们还需要设置游戏时钟的刷新频率。
二、玩家飞机的控制在游戏中,玩家将扮演一名飞行员,操控着自己的战机进行战斗。
为了实现飞机的控制,我们需要定义一个飞机类,并在类中实现飞机的移动、射击等功能。
在游戏中,我们可以通过监听键盘事件来实现对飞机的控制,例如W键用于向上移动,S键用于向下移动,以及空格键用于射击。
三、敌机的生成和移动在游戏中,敌机将会以一定的速度从顶部出现,并向下移动。
我们可以使用一个敌机类来实现敌机的生成和移动功能。
为了使游戏更有挑战性,我们可以设置敌机的数量和速度,并在敌机被击中或者飞出屏幕范围时进行重新生成。
四、碰撞检测和得分统计在飞机大战游戏中,当玩家的飞机与敌机发生碰撞时,游戏结束。
为了实现碰撞检测功能,我们需要定义一个碰撞检测函数,并在游戏循环中调用该函数。
除了碰撞检测之外,我们还需要实现得分统计功能。
例如,当玩家击落一个敌机时,玩家的得分将会增加。
五、游戏结束和重新开始在游戏中,当玩家的飞机与敌机发生碰撞时,游戏结束。
为了实现游戏结束功能,我们可以创建一个结束界面,并在游戏循环中判断是否游戏结束。
当游戏结束时,玩家可以选择重新开始游戏或退出游戏。
六、总结通过本文的介绍,你已经了解了使用Python语言实现一个简单的飞机大战小游戏的基本步骤。
当然,这只是一个简单的示例,你可以根据自己的想法和编程知识进行扩展和优化。
编写一个自己的飞机大战小游戏不仅可以提升你的编程技能,还可以给你带来快乐和满足感。
python--python语言实现飞机大战,附完整代码,可直接运行~
python--python语⾔实现飞机⼤战,附完整代码,可直接运⾏~前不久因为疫情的原因在家⼏个⽉,闲着⽆聊便开始学习python编程⼊门了python这门语⾔,在学习到⾯向对象的时候,最后的案例是开发⼀个飞机⼤战的项⽬游戏因此试着开发了⼀下还不错,故献上源代码和所需要的图⽚素材,想要试试开发的朋友可以直接下载到IDE上运⾏即可。
配置要求1. 安装 python的游戏包 pygame 包2. python版本为3.0以上(安装介绍:)⽂件要求1. 先新建⼀个⽂件夹命名:py_飞机⼤战2. 命名2个⽂件:plane_main.py(主控程序⽂件) 和plane_sprites.py(辅助⼯具⽂件)代码如下:(plane_main.py⽂件)1import pygame2from plane_sprites import *345class PlaneGame(object):6"""飞机⼤战主游戏"""78def__init__(self):9print("游戏初始化..")1011# 1.创建游戏窗⼝12 self.screen = pygame.display.set_mode(SCREEN_RECT.size)13# 2.创建游戏的时钟14 self.clock = pygame.time.Clock()15# 3.调⽤私有⽅法,精灵和精灵组的创建16 self.__create_sprites()17# 4.设置定时器--创建敌机出现 1s18 pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)1920def__create_sprites(self):21"""创建精灵和精灵组"""22# 1.创建背景精灵和精灵组23 bg1 = Background()24 bg2 = Background(True)25 bg2.rect.y = -bg2.rect.height26 self.back_group = pygame.sprite.Group(bg1, bg2)27# 2.创建敌机精灵组28 self.enemy_group = pygame.sprite.Group()29# 3.创建英雄精灵组30 self.hero = Hero()31 self.hero_group = pygame.sprite.Group(self.hero)3233def start_game(self):34print("游戏开始...")35while True:36# 1.设置刷新帧率37 self.clock.tick(FRAME_PER_SEC)38# 2.事件监听39 self.__event_handle()40# 3.碰撞检测41 self.__check_collide()42# 4.更新精灵组43 self.__update_sprites()44# 5.更新屏幕显⽰45 pygame.display.update()4647def__event_handle(self):48"""事件监听"""4950for event in pygame.event.get():51# 监听游戏是否退出52if event.type == pygame.QUIT:53 PlaneGame.__game_over()54# 监听敌机的出现55elif event.type == CREATE_ENEMY_EVENT:56print("敌机出场...")57# 创建敌机精灵58 enemy = Enemy()59 self.enemy_group.add(Enemy())60# 让英雄发射⼦弹61elif event.type == Hero_FIRE_EVENT:62 self.hero.fire()63# 获取⽤户按键64 keys_pressed = pygame.key.get_pressed()65if keys_pressed[pygame.K_RIGHT]:66 self.hero.speed = 267elif keys_pressed[pygame.K_LEFT]:68 self.hero.speed = -269else:70 self.hero.speed = 07172def__check_collide(self):73"""碰撞检测"""74# 1.设置⼦弹摧毁敌机75 pygame.sprite.groupcollide(self.hero.bullets,76 self.enemy_group, True, True) 77# 2.敌机摧毁英雄78 enemies = pygame.sprite.spritecollide(self.hero,79 self.enemy_group, True) 80# 2.1判断列表是否有内容81if len(enemies) > 0:82# 让英雄牺牲83 self.hero.kill()84# 结束游戏85 PlaneGame.__game_over()8687def__update_sprites(self):88"""更新精灵组"""89# 1.背景更新渲染显⽰90 self.back_group.update()91 self.back_group.draw(self.screen)92# 2.敌机渲染更新显⽰93 self.enemy_group.update()94 self.enemy_group.draw(self.screen)95# 3.英雄渲染更新显⽰96 self.hero_group.update()97 self.hero_group.draw(self.screen)98# 4.⼦弹渲染更新显⽰99 self.hero.bullets.update()100 self.hero.bullets.draw(self.screen)101102 @staticmethod103def__game_over():104"""游戏结束"""105print("游戏结束")106 pygame.quit()107 exit()108109if__name__ == '__main__':110# 创建游戏对象111 game = PlaneGame()112# 开始游戏113 game.start_game()(plane_sprites.py⽂件)import 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, *args):# 默认在垂直⽅向移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def__init__(self, is_alt=False):# 1.调⽤⽗类⽅法实现精灵的创建(image/rect/speed)image_name = "./images/background.png"super().__init__(image_name)# 2.判断是否交替图⽚,如果是,将图⽚设置到屏幕顶部if is_alt:self.rect.y = -self.rect.heightdef update(self, *args):# 1.调⽤⽗类⽅法实现super().update()# 2.判断是否移出屏幕,如移出,将图像设置到屏幕上⽅if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敌机精灵"""def__init__(self):# 1.调⽤⽗类⽅法创建敌机精灵,并指定敌机图像super().__init__("./images/enemy1.png")# 2.设置敌机的随机速度(初始) 1~3self.speed = random.randint(1, 3)# 3.设置敌机的随机位置(初始)⽔平⽅向self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self, *args):# 1.调⽤⽗类让敌机在垂直⽅向移动super().update()# 2.判断是否飞出屏幕,如果是,需将敌机删除if self.rect.y >= SCREEN_RECT.height:print("敌机飞出屏幕...")# 3.将精灵从所有组中删除self.kill()def__del__(self):print("敌机挂了 %s" % self.rect)class Hero(GameSprite):"""英雄精灵"""def__init__(self):super().__init__("./images/me1.png", 0)# 设置初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120 # 每隔 0.5s 发射⼀次⼦弹pygame.time.set_timer(Hero_FIRE_EVENT, 500) # 1.创建⼦弹的精灵组self.bullets = pygame.sprite.Group()def update(self, *args):# 英雄飞机在⽔平⽅向运动self.rect.x += self.speed# 判断屏幕边界if self.rect.left < 0:self.rect.left = 0if self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("发射⼦弹...")# 实现⼀次发射三枚⼦弹for i in (1, 2, 3):# 1.创建⼦弹精灵bullet = Bullet()# 2.设置⼦弹精灵位置bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerx# 3.将⼦弹精灵添加到精灵组self.bullets.add(bullet)class Bullet(GameSprite):"""⼦弹精灵"""def__init__(self):super().__init__("./images/bullet1.png", -2) def update(self, *args):super().update()# 判断是否飞出屏幕,飞出删除if self.rect.bottom < 0:self.kill()涉及的素材图1.背景2.敌机3.主飞机4.⼦弹运⾏图可以试着运⾏玩⼀下效果,感受⼀下⽤python完成⼀次⾯向对象的⼩案例把~。
Python基础知识飞机大战——飞机大战游戏框架
Python基础知识飞机大战——飞机大战游戏框架您所在的位置:首页 > IT干货资料 > python > 【Python基础知识】飞机大战——飞机大战游戏框架【Python基础知识】飞机大战——飞机大战游戏框架来源:优就业2022-09-28 09:57:45 阅读() 分享手机端入口1、游戏窗口经过安装Pygame,以及了解Pygame的核心功能之后,可以开始编写一个小的游戏案例了。
下面将制作一个飞机大战游戏,游戏内容是敌对的两架飞机互相射击。
游戏开始前需要调用初始化函数,代码如下:pygame.init()否则,在本案例中输出汉字时,会提示错误,字体没有初始化。
创建一个游戏窗口,加载背景,设置窗口标题和图标等,代码如下:# 创建一个游戏窗口surface = ode((480, 652)) # 加载背景图片background = pygame.image.load('./img/background.png') # 调整连续按键事件生成时间pygame.key.set_repeat(50, 50) # 设置窗口标题pygame.display.set_caption('飞机大战') # 设置窗口图标pygame.display.set_icon(pygame.image.load('./img/icon72某72.png'))2、游戏循环飞机大战中设计了游戏循环,还设计了玩家飞机、敌机、玩家子弹和敌人子弹四个类,以及碰撞和控制两个功能函数。
另外,还有游戏启动界面和结束界面等函数。
整个游戏的游戏循环如下:①绘制背景图片。
②控制玩家飞机,主要响应玩家的操作。
例如,玩家点击关闭按钮,则退出游戏;玩家按下左箭头键,则飞机向左移动;玩家按下右箭头键,则飞机向右移动;玩家按下空格键,则飞机发射子弹。
③绘制玩家飞机,包括正常状态和被击毁状态;绘制玩家飞机发射的子弹。
python开发飞机大战游戏
python开发飞机⼤战游戏本⽂实例为⼤家分享了python开发飞机⼤战游戏的具体代码,供⼤家参考,具体内容如下import pygameimport randomimport math # 数学模块# 初始化界⾯pygame.init()# 设置窗⼝⼤⼩windows = pygame.display.set_mode((800, 600))# 设置窗⼝标题pygame.display.set_caption("⼩赵同学")# 引⼊图⽚ logoicon = pygame.image.load('logo.jpg')pygame.display.set_icon(icon)# 4.游戏获取背景bgcolor = pygame.image.load('bj.png')# 5.设置玩家飞机playerimg = pygame.image.load('fj.png')X = 350 # 设置玩家X轴Y = 480 # 设置玩家Y轴# 停⽌移动就可以将palyerStep改为0。
控制⼀个变量来指定飞机指定移动playerStep = 0# 添加背景⾳乐pygame.mixer.music.load('bj.mp3')pygame.mixer.music.play(-1)# 添加射中的⾳效# bao_music = pygame.mixer.Sound('bj.mp3')# 分数score = 0# 添加字体和⼤⼩font = pygame.font.Font('freesansbold.ttf', 32)# 字体类def show_score():# 显⽰的⽂字text = f"Score:{score}"# 渲染然后显⽰显⽰text True表⽰24位的字score_render = font.render(text, True, (0, 255, 0))# 指定字体放到那个位置windows.blit(score_render, (10, 10))# 游戏结束的变量over = Falseover_font = pygame.font.Font('freesansbold.ttf', 64)# 结束的提⽰语def check_over():if over:text = "Game Over"render = font.render(text, True, (255, 0, 0))windows.blit(render, (320, 200))# 8.添加敌⼈.# 11.添加多个敌⼈number_enemy = 6# 敌⼈类class Enemy:def __init__(self):#self.img = pygame.image.load('enemy.png')self.x = random.randint(200, 600) # 随机产⽣Xself.y = random.randint(50, 250) # 随机产⽣Yself.step = random.randint(2, 4) # 随机产⽣速度# 当被射中时恢复位置def reset(self):self.x = random.randint(200, 600)self.y = random.randint(50, 180)def distance(bx, by, ex, ey):a = bx - exb = by - eyreturn math.sqrt(a * a + b * b) # 开根号# 保存所有的敌⼈enemis = []for i in range(number_enemy): # 每次循环都都在class Enemy中过⼀边,所以随机产⽣⼀个敌⼈的参数并且保存到列表中 enemis.append(Enemy())# 显⽰敌⼈并且实现敌⼈的移动下沉def enemy(): # 循环保存敌⼈的列表,每个敌⼈都过在这个for循环⾥被限制了移动的轨迹global overfor e in enemis:windows.blit(e.img, (e.x, e.y))e.x += e.stepif e.x > 750 or e.x < 0: # 判断敌⼈是否到了边界e.step *= -1 # 敌⼈碰到界⾯往返e.y += 40 # 设置敌⼈往下沉# 判断敌⼈的位置如果到达指定的地⽅则游戏结束if e.y > 436:over = Trueprint("游戏结束啦")enemis.clear()# 设置飞机及飞机移动范围的函数 == 飞机类型def fiji_type(): # 设置飞机的坐标和飞机X Y轴最⼤的移动位置global X, Y# 5. 设置飞机windows.blit(playerimg, (X, Y))# 6.飞机移动X += plagerStep# 预防飞机出界if X > 680:X = 680if X < 0:X = 0# ⼦弹的类class Bullet:def __init__(self):self.img = pygame.image.load('bullet.png')self.x = X + 55 # 设置⼦弹的X轴self.y = Y + 5 # ⼦弹出现在玩家的上⽅self.step = 2 # ⼦弹移动的速度# 击中敌⼈def hit(self):global scorefor e in enemis:if distance(self.x, self.y, e.x, e.y) < 30:# 射中了bullets.remove(self)e.reset() # 重置敌⼈# 没击中加10分score += 10bullets = [] # 保存现有的⼦弹# 显⽰⼦弹移动def show_bullets():for b in bullets:windows.blit(b.img, (b.x, b.y))b.hit() # 查看是否击中了敌⼈b.y -= b.step # 往上移动# 判断⼦弹是否出了界⾯if b.y < 0:bullets.remove(b)# 3.游戏主循环running = Truewhile running:# 4.背景# 每个循环是画⼀张画组成的# 画出来bgcolorwindows.blit(bgcolor, (0, 0))# 调⽤这个字体show_score()# event.get操作事件for event in pygame.event.get():# 判断操作类型是不是QUITif event.type == pygame.QUIT:# 如果程序为False就会停⽌则关闭running = False# 7.控制飞机的移动# 通过控制键盘的事件来控制(playerStep值)飞机的移动 if event.type == pygame.KEYDOWN:# 判断按下键盘右键,按下则移动if event.key == pygame.K_RIGHT:plagerStep = 3# 判断按下左键elif event.key == pygame.K_LEFT:plagerStep = -3# 判断按下空格健的反应elif event.key == pygame.K_SPACE:# 创建⼀个⼦弹b = Bullet()bullets.append(b)# 判断松来按键停⽌,if event.type == pygame.KEYUP:plagerStep = 0# 调⽤飞机的类型的函数fiji_type()# 调⽤敌⼈这个函数enemy()show_bullets() # 显⽰⼦弹# 游戏结束语check_over()# 刷新更新数据pygame.display.update()# global 设置全局变量''' 游戏结构1.设置窗⼝⼤⼩2.背景图3.显⽰飞机4.移动飞机5.控制出界6.获取键盘事件7.显⽰敌⼈8.敌⼈移动9.下沉和随机位置10.显⽰多个敌⼈11.响应空格键12.添加⼦弹13.发射⼦弹14.射中检测之距离15.射中检测16.添加⾳效17.添加并显⽰分数18.游戏结束19.结束提⽰'''以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
基于Python的飞机大战游戏开发
基于Python的飞机大战游戏开发引言飞机大战游戏自问世以来,一直受到宽广玩家的喜爱。
随着计算机技术的不息进步和普及,也成为了一项具有挑战性和创新性的任务。
本文将介绍过程中的关键步骤和技术,以及其中涉及的基于Python编程语言的特点和优势。
一、飞机大战游戏概述飞机大战游戏是一种射击游戏,玩家需要操控一个战斗飞机,与敌机进行空中对抗。
通过射击敌机并躲避敌机的攻击,玩家可以获得积分和能力提升道具,逐渐完成游戏目标。
二、Python编程语言简介Python是一种高级编程语言,被广泛应用于各种领域。
它具有简洁而优雅的语法,易学易用的特点,适合初学者入门。
此外,Python还具有丰富的第三方库和强大的生态系统,为开发飞机大战游戏提供了良好的基础。
三、游戏开发前期筹办在进行游戏开发之前,我们需要对游戏进行详尽的需求分析和规划。
主要包括:1.确定游戏的基本功能和玩法,例如玩家的控制方式、敌机的种类和行为等。
2.设计游戏的界面和图形风格,选择合适的美术资源。
3.搭建游戏开发环境,确保Python及相关开发库的安装和配置完成。
四、游戏主要功能实现1.游戏主循环游戏主循环是游戏的核心部分,它负责监听用户的输入和更新游戏的状态。
在这个循环中,我们需要实现游戏界面的绘制、用户输入的响应以及游戏逻辑的计算等功能。
2.玩家飞机玩家飞机是游戏中最基本的角色之一,玩家将通过操控飞机进行战斗。
我们可以利用Python的图形库来实现玩家飞机的绘制和挪动控制。
同时,还可以设计不同类型的子弹和加速道具等来提升飞机的战斗能力。
3.敌机敌机是游戏中的主要敌人,玩家需要通过射击和躲避来与敌机进行战斗。
我们可以设计多种类型的敌机,每种敌机具有不同的行为和攻击方式。
在敌机的挪动和攻击过程中,我们可以利用Python的物理引擎库来实现更加真实的效果。
4.碰撞检测碰撞检测是游戏开发中的关键技术之一,它用于裁定游戏中的角色或物体是否发生碰撞。
在飞机大战游戏中,我们需要实现玩家飞机与敌机、子弹与敌机之间的碰撞检测。
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的飞机大战游戏开发
基于Python的飞机大战游戏开发基于Python的飞机大战游戏开发一、游戏开发背景随着互联网的普及和技术的不断进步,游戏开发行业也持续蓬勃发展。
飞机大战游戏作为一种经典的射击游戏类型,在游戏玩家中依然很受欢迎。
本文将基于Python编程语言,介绍如何开发一款简单的飞机大战游戏。
通过本次开发,读者可以了解到游戏开发的基本流程和技术点,也可以在此基础上进行更复杂的游戏开发。
二、游戏开发流程1. 游戏概念设定:在游戏开发之前,首先需要对游戏的概念进行设定。
比如,本游戏是一款经典的2D飞机大战游戏,玩家控制一个飞机进行射击击败敌人、拾取道具等游戏操作。
设定游戏的主题和目标,这样可以更好地引导游戏的开发进程。
2. 游戏界面设计:游戏界面是玩家和游戏交互的重要环节。
在这一步中,我们需要设计游戏的背景、角色、道具等元素,以及各种界面效果,比如游戏开始、暂停、结束等。
Python的Pygame库提供了丰富的图形库和工具,可以帮助我们实现这些设计。
3. 游戏逻辑编码:在游戏逻辑编码阶段,我们需要根据游戏的规则和设定,编写游戏的各种功能和行为。
比如,玩家飞机的移动、射击,敌人的生成和移动,道具的产生和效果等。
可以通过Python语言的条件判断、循环等程序结构,实现游戏的逻辑功能。
4. 游戏测试和调试:在整个开发过程中,我们需要不断地进行测试和调试,确保游戏的各项功能正常运行。
这里可以先从单一功能进行测试,再逐渐整合各个模块进行整体测试。
通过测试和调试,可以及时发现和解决游戏中的bug和问题,提高游戏的质量和稳定性。
5. 游戏优化和美化:在游戏开发的最后阶段,我们需要对游戏进行优化和美化,使其更加流畅、漂亮和具有吸引力。
优化方面可以从游戏性能、代码的简洁性等方面考虑,优化游戏的加载速度和运行效率;美化方面可以加入一些音效、背景音乐,还可以通过更加精美的图形、动画效果等,提升游戏的表现力和用户体验。
三、Python的游戏开发库在Python的游戏开发中,Pygame库是非常流行的开发工具。
python飞机大战的核心语句
python飞机大战的核心语句Python飞机大战是一款非常经典的游戏,其核心语句包括以下几个方面:1. 导入必要的模块在Python飞机大战游戏中,需要导入Pygame模块来完成游戏的绘制、音效等功能。
通常使用以下语句进行导入:```pythonimport pygame```2. 初始化Pygame在导入Pygame模块后,需要初始化Pygame来设置窗口、音效等参数。
通常使用以下语句进行初始化:```pythonpygame.init()```3. 创建游戏窗口在Pygame中,使用display模块来创建游戏窗口。
通常使用以下语句创建大小为800x600的窗口:```pythonscreen = pygame.display.set_mode((800, 600))```4. 加载游戏资源在游戏中需要使用到音效、图片等资源,可以使用以下语句来加载:```pythonbg_img = pygame.image.load('bg.png')```5. 监听事件在游戏中需要监听玩家的键盘输入等事件,可以使用以下语句来监听:```pythonfor event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:# 玩家按下了空格键```6. 绘制游戏界面在游戏中需要绘制背景、敌机、玩家飞机等游戏元素,可以使用以下语句来绘制:```pythonscreen.blit(bg_img, (0, 0))```7. 更新游戏界面在每次绘制完游戏界面后,需要使用以下语句来更新:```pythonpygame.display.update()```上述是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()⽅法是利⽤⾯向对象的思想,写了基本的敌机类、英雄类、武器类等,利⽤继承关系产⽣多架敌机。
500行python代码实现飞机大战
500⾏python代码实现飞机⼤战本⽂实例为⼤家分享了python代码实现飞机⼤战的具体代码,供⼤家参考,具体内容如下import pygameimport sysfrom pygame.sprite import Spritefrom pygame.sprite import Groupfrom time import sleepimport pygame.font# 修改游戏的⼀些新设置class Settings():"""存储《外星⼈⼊侵》的所有设置的类"""def __init__(self):"""初始化游戏的设置"""# 屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230) # 浅灰⾊# 飞船的设置,移动1.5像素self.ship_limit = 3# ⼦弹设置---创建宽3像素、⾼15像素的深灰⾊⼦弹self.bullet_speed_factor = 3self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60self.bullets_allowed = 3# 外星⼈设置self.fleet_drop_speed = 10# 以什么样的速度加快游戏节奏self.speedup_scale = 1.1# 外星⼈点数的提⾼速度self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""初始化随游戏进⾏⽽变化的设置"""self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 1# fleet_direcction为1表⽰向右,为-1表⽰向左self.fleet_direction = 1# 计分self.alien_points = 50def increase_speed(self):"""提⾼速度设置和外星⼈点数"""self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)# 创建⼀个ship类class Ship(Sprite):def __init__(self, ai_settings, screen):"""初始化飞船并设置其起始位置"""super(Ship, self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载飞船图像并获取其外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect() # 以矩形形式来获取相应的surface属性self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 在飞船的属性center中存储⼩数值----在后⾯加快游戏节奏时更细致地控制飞船的速度self.center = float(self.rect.centerx)# 移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船的center值,⽽不是rectif self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factor# 根据self.center更新rect对象self.rect.centerx = self.centerdef center_ship(self):"""将飞船在屏幕居中"""self.center = self.screen_rect.centerxdef blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image, self.rect)# 创建⼀个Alien类class Alien(Sprite):"""表⽰单个外星⼈的类"""def __init__(self, ai_settings, screen):"""初始化外星⼈并设置其起始位置"""super(Alien, self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载外星⼈图像,并设置其rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个外星⼈最初都在屏幕左上⾓附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星⼈的准确位置self.x = float(self.rect.x)def check_edges(self):"""如果外星⼈位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truedef update(self):"""向左或向右移动外星⼈"""self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.xdef blitme(self):"""在指定位置绘制外星⼈"""self.screen.blit(self.image, self.rect)def get_number_aliens_x(ai_settings, alien_width):"""计算每⾏可容纳多少个外星⼈"""available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef get_number_rows(ai_settings, ship_height, alien_height):"""计算屏幕可容纳多少⾏外星⼈"""available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height) number_rows = int(available_space_y / (2 * alien_height))return number_rowsdef create_alien(ai_settings, screen, aliens, alien_number, row_number):"""创建⼀个外星⼈并将其放在当前⾏"""alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)def create_fleet(ai_settings, screen, ship, aliens):"""创建外星⼈群"""# 创建⼀个外星⼈,并计算⼀⾏可容纳多少个外星⼈# 外星⼈间距为外星⼈宽度alien = Alien(ai_settings, screen)number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height) # 创建外星⼈群for row_number in range(number_rows):for alien_number in range(number_aliens_x):# 创建⼀个外星⼈并将其加⼊当前⾏create_alien(ai_settings, screen, aliens, alien_number, row_number)class Bullet(Sprite):"""⼀个对飞船发射的⼦弹进⾏管理的类"""def __init__(self, ai_settings, screen, ship):"""在飞船所处的位置创建⼀个⼦弹对象"""super(Bullet, self).__init__()self.screen = screen# 在(0, 0)处创建⼀个表⽰⼦弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top# 存储⽤⼩数表⽰的⼦弹位置self.y = float(self.rect.y)# 设置⼦弹射出的颜⾊和速度self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):"""向上移动⼦弹"""# 更新表⽰⼦弹位置的⼩数值self.y -= self.speed_factor# 更新表⽰⼦弹的rect位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制⼦弹"""pygame.draw.rect(self.screen, self.color, self.rect)# 管理事件,设置两个函数,⼀个处理KEYDOWN事件,⼀个处理KEYUP事件def check_keydown_events(event, ai_settings, screen, ship, bullets):"""响应按键"""if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullets(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:sys.exit()def check_keyup_events(event, ship):"""响应松开"""if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):"""响应按键和⿏标事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y) def check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, mouse_x, mouse_y): """在玩家单击Play按钮时开始新游戏"""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:# 重置游戏设置ai_settings.initialize_dynamic_settings()# 隐藏光标pygame.mouse.set_visible(False)# 重置游戏统计信息stats.game_active = True# 重置记分牌图像sb.prep_score()sb.prep_high_score()sb.prep_level()sb.prep_ships()# 清空外星⼈列表和⼦弹列表aliens.empty()bullets.empty()# 创建⼀群新的外星⼈,并让飞船居中create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()def fire_bullets(ai_settings, screen, ship, bullets):"""如果还没有到达限制,就发射⼀颗⼦弹"""# 创建⼀颗⼦弹,并将其加⼊到编组bullets中if len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets): """响应⼦弹和外星⼈的碰撞"""# 如果是这样,就删除相应的⼦弹和外星⼈collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if len(aliens) == 0:# 消除已有的⼦弹,加快游戏节奏,并创建⼀群新的外星⼈# 如wan果整群外星⼈都被消灭,就提⾼⼀个等级bullets.empty()ai_settings.increase_speed()# 提⾼等级stats.level += 1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)if collisions:for aliens in collisions.values():stats.score += ai_settings.alien_points * len(aliens)sb.prep_score()check_high_score(stats, sb)def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):"""更新⼦弹位置,并删除已消失的⼦弹"""# 更新⼦弹位置bullets.update()# 删除已消失的⼦弹for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets) def change_fleet_direction(ai_settings, aliens):"""将整群外星⼈向下移,并改变它们的⽅向"""for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def check_fleet_edges(ai_settings, aliens):"""有外星⼈到达边缘时采取响应的措施"""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):"""响应被外星⼈撞到的飞船"""if stats.ships_left > 0:# 将ships_left减1stats.ships_left -= 1# 更新记分牌# 清空外星⼈列表和⼦弹列表aliens.empty()bullets.empty()# 创建⼀群新的外星⼈,并将飞船放到屏幕底端中央create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()# 暂停sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)def check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets):"""检查是否有外星⼈到达了屏幕底端"""screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 像飞船被撞到⼀样进⾏处理ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)breakdef update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):"""检查是否有外星⼈位于屏幕边缘,并更新整群外星⼈的位置"""check_fleet_edges(ai_settings, aliens)aliens.update()# 检测外星⼈和飞船之间的碰撞if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)# 检查是否有外星⼈到达屏幕底端check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)class GameStats():"""跟踪游戏的统计信息"""def __init__(self, ai_settings):"""初始化统计信息"""self.ai_settings = ai_settingsself.reset_stats()# 游戏刚启动时处于⾮活跃状态,为了添加Play按钮self.game_active = False# 在任何情况下都不应重置最⾼得分self.high_score = 0def reset_stats(self):"""初始化在游戏运⾏期间可能变化的统计信息"""self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1class Scoreboard():"""显⽰得分信息的类"""def __init__(self, ai_settings, screen, stats):"""初始化显⽰得分涉及的属性"""self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = stats# 显⽰得分信息时使⽤的字体设置self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)# 准备包含最⾼得分和当前得分的图像self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):"""将得分转换为⼀幅渲染的图像"""rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color) # 将得分放在屏幕右上⾓self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def prep_high_score(self):"""将最⾼得分转换为渲染的图像"""high_score = int(round(self.stats.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_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.stats.level), True, self.text_color, self.ai_settings.bg_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_ships(self):"""显⽰还余下多少艘飞船"""self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)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.ships.draw(self.screen)def check_high_score(stats, sb):"""检查是否诞⽣了新的最⾼得分"""if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()class Button():def __init__(self, ai_settings, screen, msg):"""初始化按钮的属性"""self.screen = screenself.screen_rect = screen.get_rect()# 设置按钮的尺⼨和其他属性self.width, self.height = 200, 50self.button_color = (0, 255, 0) # 亮绿⾊self.text_color = (255, 255, 255) # ⽩⾊self.font = pygame.font.SysFont(None, 48) # 使⽤默认、48号字体# 创建按钮的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)# 更新屏幕上的图像,并切换到新屏幕def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button):"""更新屏幕上的图像,并切换到新屏幕"""# 每次循环时都重新绘制屏幕screen.fill(ai_settings.bg_color)# 在飞船和外星⼈后⾯重新绘制所有⼦弹for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)# 显⽰得分sb.show_score()# 如果游戏处于⾮活跃状态,就绘制Play按钮if not stats.game_active:play_button.draw_button()# 让最近绘制的屏幕可见pygame.display.flip()def run_game():# 初始化游戏并创建⼀个屏幕对象pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invation")# 创建⼀艘飞船ship = Ship(ai_settings, screen)# 创建⼀个外星⼈alien = Alien(ai_settings, screen)# 创建⼀个⽤于存储⼦弹的编组bullets = Group()# 创建⼀个外星⼈编组aliens = Group()# 创建⼀个外星⼈群create_fleet(ai_settings, screen, ship, aliens)# 创建存储游戏统计信息的实例,并创建记分牌stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)# 创建Play按钮play_button = Button(ai_settings, screen, "Play")# 开始游戏的主循环while True:check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)if stats.game_active:ship.update()update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets)update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)run_game()结果如下图所⽰:更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
python学习日记第五天(飞机大战)
#
if self.y<0:
#
return True
#
else:
#
return False
# class EnemyBullet(object):
# def __init__(self,x,y,screen):
#
self.x=x+30
#
self.y=y+30
#
self.screen=screen
#
self.image=pygame.image.load("./11/1 (8).png").convert()
def judge(self): if self.y<0: return True else: return False
# class Bullet(object):
# def __init__(self,x,y,screen):
#
self.x=x+40
#
self.y=y-20
#
self.screen=screen
bullet.display() bullet.move() def move_left(self): self.x-=10 def move_right(self): self.x+=10 def move_up(self): self.y-=10 def move_down(self): self.y+=10 def launch_bullet(self): new_bullet=PublicBullet(self.x,self.y,self.screen,) self.bullet_list.append(new_bullet) class HeroPlane(Plane): def __init__(self,screen,name): #设 置 飞 机 的 默 认 位 置 self.x=230 self.y=600 self.image_name = "./11/1 (13).png" super().__init__(screen,name) class EnemyPlane(Plane): def __init__(self,screen,name): self.x=0 self.y=0 self.image_name = "./11/1 (6).png" super().__init__(screen,name) self.direction="right" def move(self): if self.direction == "right": self.x+=2 elif self.direction=="left": self.x-=2 if self.x>480-50: self.direction="left" elif self.x<0: self.direction="right" def launch_bullet(self): number=random.randint(1,100) if number == 88: super().launch_bullet()
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("敌机出现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
飞机大战代码汇总
import pygame
from pygame.locals import *
import random
pygame.init()
size = (375,667)
screen = pygame.display.set_mode(size)
backgroud = pygame.image.load('images2/bg1.jpg')
clock = pygame.time.Clock()
class Airplane(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('images2/8.png')
self.boom = pygame.image.load('images2/enemy0_down3.png')
self.rect = self.image.get_rect()
self.rect.left = (375-self.rect.width)/2
self.rect.top = 667-self.rect.height
self.speed = 8
self.active = True
self.mask = pygame.mask.from_surface(self.image)
def show(self):
screen.blit(self.image,(self.rect.left,self.rect.top))
def boom(self):
screen.blit(self.boom,(self.rect.left,self.rect.top))
def up(self):
if self.rect.top >=0 :
self.rect.top = self.rect.top - self.speed
def down(self):
if self.rect.top <= size[1]-self.rect.height:
self.rect.top = self.rect.top + self.speed
def left(self):
if self.rect.left >= 0:
self.rect.left = self.rect.left - self.speed
def right(self):
if self.rect.left <= size[0] - self.rect.width:
self.rect.left = self.rect.left + self.speed
class EnemyPlane(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('images2/enemy0.png')
self.boom = pygame.image.load('images2/enemy0_down2.png')
self.rect = self.image.get_rect()
self.rect.left = random.randint(0,size[0] - self.rect.width)
self.rect.top = -self.rect.height
self.speed = 3
self.active = True
self.mask = pygame.mask.from_surface(self.image)
self.blood = 1
def show(self):
screen.blit(self.image, (self.rect.left, self.rect.top))
def boom(self):
screen.blit(self.boom, (self.rect.left, self.rect.top))
def down(self):
self.rect.top = self.rect.top + self.speed
if self.rect.top <= size[1]-self.rect.top:
screen.blit(self.image,(self.rect.left, self.rect.top))
class Zidan(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('images2/5.png')
self.rect = self.image.get_rect()
self.rect.left = airplane.rect.left + airplane.rect.width/2
self.rect.top = airplane.rect.top - self.rect.height
self.speed = 16
self.active = True
self.mask = pygame.mask.from_surface(self.image)
self.attack = 1
def show(self):
screen.blit(self.image, (self.rect.left, self.rect.top))
def up(self):
self.rect.top = self.rect.top - self.speed
if self.rect.top >= 0:
screen.blit(self.image,(self.rect.left, self.rect.top))
count = 0
score = 0
myfont = pygame.font.SysFont('华文宋体',30)
airplane = Airplane()
group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
while 1 :
for i in pygame.event.get():
if i.type == 12:
exit()
if i.type == KEYDOWN:
if i.key == 13 and airplane.active == False:
airplane.active = True
group.empty()
bullet_group.empty()
score = 0
airplane.rect.left = (size[0] - airplane.rect.width) / 2
airplane.rect.top = size[1] - airplane.rect.height
screen.blit(backgroud, (0, 0))
if airplane.active == True:
key = pygame.key.get_pressed()
if key[K_UP] == 1:
airplane.up()
if key[K_DOWN] == 1:
airplane.down()
if key[K_LEFT] == 1:
airplane.left()
if key[K_RIGHT] == 1:
airplane.right()
airplane.show()
if count % 10 == 0:
bullet = Zidan()
bullet_group.add(bullet)
for i in bullet_group:
i.show()
i.up()
die_list1 = pygame.sprite.spritecollide(i, group, True,
pygame.sprite.collide_mask)
if len(die_list1) > 0:
bullet_group.remove(i)
for j in die_list1:
j.blood = j.blood - i.attack
if j.blood == 0:
i.active = False
score += 10
if count % 20 == 0 :
enemy = EnemyPlane()
group.add(enemy)
for i in group:
if i.active == True:
i.show()
i.down()
else:
i.boom()
group.remove(i)
else:
airplane.boom()
die_list =
pygame.sprite.spritecollide(airplane,group,False,pygame.sprite.collid e_mask)
if len(die_list) > 0:
airplane.active = False
test = myfont.render('分数:%s'%(score),True,(120,30,45))
screen.blit(test,(0,0))
pygame.display.update()
clock.tick(45)
count = count + 1。