飞机大战(简易版)

一、游戏分析
飞机大战中的主要“角色”有:
1.英雄
2.敌方飞机
3.英雄发射的子弹
我们需要控制的有:
1.绘制屏幕内的角色
2.控制角色的逻辑,比如:敌方飞机与我方飞机的碰撞检测,我方飞机发射的子弹与敌方飞机之间的碰撞检测。
资源:
要完成一个游戏,还要有资源的加载,比如飞机,子弹等图片的加载等。
游戏背景的绘制。

二、如何绘制循环滚动的背景图片
代码如下:

class Background(GameSprite):"""游戏背景精灵"""def update(self):# 1.调用父类的方法实现super().update()# 2.判断是否移出屏幕,如果移出,将图像设置到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.height
def __create_sprites(self):# 创建背景精灵和精灵组bg1 = Background("./images/background.png")bg2 = Background("./images/background.png")bg2.rect.y = -bg2.rect.heightself.back_ground = pygame.sprite.Group(bg1,bg2)

三、如何绘制飞机
绘制敌机:

class Enemy(GameSprite):"""敌机精灵"""def __init__(self):# 1.调用父类方法,创造敌机精灵,同时指定敌机图片super().__init__("./images/enemy.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):super().update()if self.rect.y >= SCREEN_RECT.height:# print("飞出屏幕,需要删除")# 移出精灵组,自动销毁self.kill()def __del__(self):# print("敌机挂了%s" % self.rect)

绘制英雄:

class Hero(GameSprite):"""英雄精灵"""def __init__(self):# 1.调用父类方法super().__init__("./images/hero.png",0)# 2.设置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120# 3.创建子弹的精灵组self.bullets = pygame.sprite.Group()def update(self):# 英雄在水平方向移动self.rect.x += self.speed# 控制英雄不能离开屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.y < 0:self.rect.y = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightelif self.rect.bottom > SCREEN_RECT.bottom:self.rect.bottom = SCREEN_RECT.bottomdef fire(self):print("发射子弹")for i in (0,1,2):# 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/bullet.png",-2)def update(self):# 调用父类方法,让子弹沿垂直方向飞行super().update()# 判断子弹是否飞出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子弹被销毁")

五、如何判断碰撞(子弹与敌机碰撞、英雄与敌机碰撞)

def __check_collide(self):# 1.子弹摧毁敌机pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)# 2.敌机摧毁英雄# pygame.sprite.spritecollide(self.hero, self.enemy_group, True)enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)# 3.判断列表是否有内容if len(enemies) > 0:# 让英雄牺牲self.hero.kill()# 结束游戏
PlaneGame.__game_over()

六、如何控制英雄移动

#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 = -2elif keys_pressed[pygame.K_UP]:self.hero.rect.y -= 2elif keys_pressed[pygame.K_DOWN]:self.hero.rect.y += 2else:self.hero.speed = 0

七、总结
此次完成的小游戏还有很多改进的地方,比如可以加入背景音乐,在子弹击中敌机后有一个飞机爆炸的效果,敌机的移动轨迹可以设计的更复杂一些等。
在这次课程设计中,我学到了很多。让我发现时间的重要性,学到的知识在多次运用后才能融会贯通。

全部代码如下
主程序 :plane_game.py

import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战游戏"""def __init__(self):print("游戏初始化")#     1.创建游戏的窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)# 2.创建游戏的时钟self.clock = pygame.time.Clock()# 3.调用私有方法,精灵和精灵组的创建self.__create_sprites()# 4.设置定时器事件 - 创建敌机 1spygame.time.set_timer(CREATE_ENEMY_EVENT,1000)pygame.time.set_timer(HERO_FIRE_EVENT,500)def __create_sprites(self):# 创建背景精灵和精灵组bg1 = Background("./images/background.png")bg2 = Background("./images/background.png")bg2.rect.y = -bg2.rect.heightself.back_ground = 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:# 1.设置刷新帧率self.clock.tick(FRAME_PER_SEC)# 2.事件监听self.__event_handler()# 3.碰撞检测self.__check_collide()# 4.更新/绘制精灵self.__update_sprites()# 5.更新显示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 = -2elif keys_pressed[pygame.K_UP]:self.hero.rect.y -= 2elif keys_pressed[pygame.K_DOWN]:self.hero.rect.y += 2else:self.hero.speed = 0def __check_collide(self):# 1.子弹摧毁敌机pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)# 2.敌机摧毁英雄# pygame.sprite.spritecollide(self.hero, self.enemy_group, True)enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)# 3.判断列表是否有内容if len(enemies) > 0:# 让英雄牺牲self.hero.kill()# 结束游戏PlaneGame.__game_over()def __update_sprites(self):self.back_ground.update()self.back_ground.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()

精灵 :plane_sprites.py

import random
import pygame# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
# 刷新的帧率
FRAME_PER_SEC = 60
# 创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 英雄发射子弹事件
HERO_FIRE_EVENT = pygame.USEREVENT + 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 __index__(self, is_alt=False):##     super().__init__("./images/background.png")##     if is_alt:#         self.rect.y = -self.rect.heightdef update(self):# 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/enemy.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):super().update()if self.rect.y >= SCREEN_RECT.height:# print("飞出屏幕,需要删除")# 移出精灵组,自动销毁self.kill()def __del__(self):print("敌机挂了%s" % self.rect)class Hero(GameSprite):"""英雄精灵"""def __init__(self):# 1.调用父类方法,设置super().__init__("./images/hero.png",0)# 2.设置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120# 3.创建子弹的精灵组self.bullets = pygame.sprite.Group()def update(self):# 英雄在水平方向移动self.rect.x += self.speed# 控制英雄不能离开屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.y < 0:self.rect.y = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightelif self.rect.bottom > SCREEN_RECT.bottom:self.rect.bottom = SCREEN_RECT.bottomdef fire(self):print("发射子弹")for i in (0,1,2):# 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/bullet.png",-2)def update(self):# 调用父类方法,让子弹沿垂直方向飞行super().update()# 判断子弹是否飞出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子弹被销毁")

飞机大战图片素材
背景图片
子弹图片
敌机图片
英雄图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu上安装Keras深度学习框架

目录 1&#xff09;安装pip 2&#xff09;安装Python科学套件 3&#xff09;安装TensorFlow 4&#xff09;安装keras 5&#xff09;安装Jupyter Notebook 6&#xff09;运行Keras 本文介绍如何在Ubuntu上安装Keras深度学习框架。 1&#xff09;安装pip 安装pip包&#…

【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

题干&#xff1a; Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still…

C++11 FAQ中文版:std::function 和 std::bind

std::function 和 std::bind 标准库函数bind()和function()定义于头文件中&#xff08;该头文件还包括许多其他函数对象&#xff09;&#xff0c;用于处理函数及函数参数。bind()接受一个函数&#xff08;或者函数对象&#xff0c;或者任何你可以通过”(…)”符号调用的事物&am…

Java 习题(面向对象)

1.&#xff08;面向对象基础&#xff09;写一个Worker 类&#xff0c;并创建多个Worker 对象。 为Worker 类添加四个属性&#xff0c; <1>int 类型的id&#xff0c;表示工人的编号&#xff1b; <2>String 类型的name&#xff0c;表示工人的姓名&#xff1b; <3…

机器学习笔记(2):单变量线性回归

目录 1&#xff09;Model representation 2&#xff09;Cost function 3&#xff09;Cost function intuition 1 4&#xff09;Cost function intuition2 5&#xff09;Gradient descent 6&#xff09;Gradient descent intuition 7&#xff09;Gradient descent for li…

指针右左法则----复杂指针解析

其实如果写得出&#xff08;其实不难&#xff09;指针和数组的声明的EBNF的话&#xff0c;那么直接看就可以反应过来了…… 右左法则是一个既著名又常用的方法。不过&#xff0c;右左法则其实并不是C标准里面的内容&#xff0c;它是从C标准的声明规定中归纳出来的方法。C标准的…

【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

题干&#xff1a; 网络管理员管理大型网络。该网络由N台计算机和成对计算机之间的M链路组成。任何一对计算机都通过连续的链接直接或间接连接&#xff0c;因此可以在任何两台计算机之间转换数据。管理员发现某些链接对网络至关重要&#xff0c;因为任何一个链接的故障都可能导…

安装VMware tools

点击“虚拟机” 安装VMware tools提取图中文件到“下载” 提取登入root 进入 cd 下载/vmware-tools-distrib 执行 ./vmware-install-pl 输入yes或者点击“enter”出现图中&#xff0c;即为成功安装

Keras入门实战(1):MNIST手写数字分类

目录 1)首先我们加载Keras中的数据集 2&#xff09;网络架构 3&#xff09;选择编译(compile参数) 4&#xff09;准备图像数据 5) 训练模型 6&#xff09;测试数据 前面的博客中已经介绍了如何在Ubuntu下安装Keras深度学习框架。 现在我们使用 Keras 库来学习手写数字分…

什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF 什么是巴科斯范式&#xff1f;   巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。   现在&…

root 进入ssh 出现问题

用root输入下面命令&#xff0c;一直让输入密码&#xff0c;并提示错误 ssh localhost那是因为系统默认禁止root用户登录ssh 首先&#xff0c;CtrlC退出密码输入界面&#xff1a;然后输入&#xff1a;su - 然后&#xff0c;编辑sshd_config文件&#xff0c;输入&#xff1a;…

【BZOJ - 2574】[Poi1999] Store-Keeper(点双连通分量,求割点,记忆化bfs)

题干&#xff1a; 有一个仓库被分成n*m 个矩形区域&#xff0c;如果两个区域有一条公共边&#xff0c;则被认为这两个区域相邻。包裹都放在一个区域中&#xff0c;剩余的区域或者空闲或者被集装箱占有&#xff0c;这是因为集装箱太重&#xff0c;仓库管理员不能将集装箱搬走。…

机器学习笔记(3):线性代数回顾

目录 1&#xff09;Matrices and vectors 2&#xff09;Addition and scalar multiplication 3&#xff09;Matrix-vector multiplication 4&#xff09;Matrix-matrix multiplication 5&#xff09;Matrix multiplication properties 6&#xff09;Inverse and transpos…

hadoop 安装

Hadoop单机和伪分布式安装 更新apt 用root用户登录 先更新一下 apt apt-get update然后安装vim apt-get install vim安装VMware tools tools 安装 安装SSH、配置SSH无密码登陆 单节点模式都需要用到 SSH 登陆&#xff0c;Ubuntu 默认已安装了 SSH client&#xff0c;此…

机器学习笔记(4):多变量线性回归

目录 1&#xff09;Multiple Features 2&#xff09;Gradient descent for multiple variables 3&#xff09;Gradient descent in practice 1: Feature Scaling 4&#xff09;Gradient descent in pratice2: Learning rate 5&#xff09;Features and polynomial regress…

【POJ - 2942】Knights of the Round Table(点双连通分量,二分图判断奇环奇圈)

题干&#xff1a; Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the other knights are fun things to do. Therefore, it is not very surprising that in recent years the kingdom of King …

zookeeper单节点部署

hadoop 安装 在/install-package目录下查看zookeeper的安装包 本文中安装的是zookeeper-3.4.12.tar.gz 下方为百度云链接 链接&#xff1a;https://pan.baidu.com/s/1bzq4ILH41owtS__3tBCcRQ 提取码&#xff1a;6q4r 把下载好的zookeeper-3.4.12.tar.gz 放到/install-packa…

机器学习笔记(五):逻辑回归

目录 1&#xff09;Classification 2&#xff09;Hypothesis Representation 3&#xff09;Decision boundary 4&#xff09;Cost function 5&#xff09;Simplified cost function and gradient descent 6&#xff09;Multi-class classification:One-vs-all 7&#xf…

xrdp完美实现Windows远程访问Ubuntu 16.04

前言&#xff1a; 在很多场景下&#xff0c;我们需要远程连接到Linux服务器(本文是Ubuntu)&#xff0c;传统的连接主要分为两种。 第一种&#xff1a;通过SSH服务&#xff08;使用xshell等工具&#xff09;来远程访问&#xff0c;编写终端命令&#xff0c;不过这个是无界面的&a…

【HDU - 6203】ping ping ping(lca+贪心思想,对lca排序,树状数组差分)

题干&#xff1a; 给出一个n1个点的树&#xff0c;以及p个点对&#xff0c;需要断开一些点&#xff0c;使得这p个点对路径不连通。输出应该断开的最少点数。 解题报告&#xff1a; 从那p个点对入手的话&#xff1a;首先考虑只有一对点的话&#xff0c;肯定是这条路径上的随便…