python小游戏,飞机大战外星人,主要是面向对象编程,看一看我的代码和感悟与总结,发表出你的意见建议吧!

本文主要是介绍python小游戏,飞机大战外星人,主要是面向对象编程,看一看我的代码和感悟与总结,发表出你的意见建议吧!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天是2月21日,我开始去跟着书本去写一个python小游戏,没想到一个小游戏,我每天大概看两个小时左右,没想到我写到了今天。

没想到一个小游戏,对我来说信息量竟然这么多

飞机大战外星人

  • 前言
  • 飞机大战外星人的历程
  • 最终代码(五个模块)
    • 飞机大战主程序模块[alien_invasion]
    • 飞机大战子弹模块[bullet]
    • 飞船模块[ship]
    • 游戏状态模块[game_stats]
    • 外星人模块[alien]
    • 游戏整体设置模块[settings]
      • 项目源代码
        • 最后一点点想说的

前言

我写的这个游戏主要是想对于我学习面向对象编程的一种复习和知识再现,里面主要是,类(类方法,类属性,多态)的使用,如果对面向编程比较模糊不如试着去分析一下代码。飞机大战外星人的历程过于长,大部分都是我个人的总结和感悟,可以不看,直接点击上方蓝色字体(代码)即可传送到最终代码处进行分析代码!

这是我第二篇文章,非常非常感谢我博客第一篇文章《大一的第一篇文章》中各位前辈的支持
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也许没有他们的支持,我可能没有坚持去写博客的动力!我真的很谢谢你们。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有这些前辈的建议,正是因为有你们的建议,我才能成长。CSDN里的氛围真的很好,是一个很好的学习分享平台!

3月2日补充
截止今天
在这里插入图片描述
在这里插入图片描述
谢谢大家的支持,有你们的支持,坚定了我要坚持下去的理由,真的很谢谢大家!

飞机大战外星人的历程

首先学完面向对象编程后,我和大部分刚学完面向对象编程的一样,对于面向对象编程有点懵,这玩意儿是在是有点抽象,在程序中就行上帝一样去创造一类东西,就比如说女娲造人,我们写程序就像女娲在造人一样,去创造 人这一类东西,人就是一类东西的总称,人有眼睛和鼻子,这就是人的属性,人会生火,人会制造工具,那么生火和制造工具不就是类的方法,我目前来说是这么浅显的理解,如果哪里有错误或者不足欢迎大佬前辈斧正,非常感谢。
正是因为我学习的时候理解的比较浅显,再加上我正好看到了这个项目,所以我就跟着书本的思路去写这个游戏代码,带着疑问去项目当中,去进行一个知识的复现。在这里插入图片描述
刚一开始就遇到了困难 ,我因为pip没有更新一直在转圈在这里插入图片描述
,所以一直导入不了pygame这个库,又没有发现问题的所在,因为pycharm是一个比较成熟的软件,所以问题出在我本身在这里插入图片描述
如果你的pycharm没有出现红框这个版本号,可能的原因是pip需要更新了,更新了就可以加入库了。
解决好问题后我开始跟着代码去编写程序,因为pycharm自动补写功能过于强大,有一些缩进总是过了或忘了,这里建议刚学语法的时候先别用一写集成编译软件,黑窗口命令行python就好。

——————————————————分割线——————————————————
2.28日

因为最近是开学季,明天要去送朋友去车站,因为我是河北学生,开学延期了,3月1号要开始网课生活,所以从今天以后可能写不了太多

在这里插入图片描述
已经从飞机的实例的创建到飞机的武装了,我已经把我的飞机装上了子弹,但是为了外星人的公平和建议玩家有效攻击,限制了子弹为3发子弹。
在这里插入图片描述
在这里插入图片描述
先把第一步代码分享一下,这是游戏的运行代码

import pygame
import sys
from settings import Settings
from ship import Ship
from bullet import Bulletclass AlienInvasion(object):'''管理游戏资源和行为的类'''def __init__(self):'''初始化游戏并创建游戏资源'''pygame.init()self.settings = Settings()# 设置背景色self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption('Alin Invasion')self.ship = Ship(self)self.bullets = pygame.sprite.Group()def run_game(self):'''开始游戏的主循环'''while True:# 监视键盘和鼠标事件self._check_events()self._update_bullets()self.bullets.update()self._updata_screen()# 每次循环时都重绘屏幕self.screen.fill(self.settings.bg_color)self.ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()def _check_events(self):'''响应按键和鼠标事件'''for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _updata_screen(self):'''更新屏幕上的图像,并切换到新屏幕'''self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()pygame.display.flip()def _fire_bullet(self):'''创建一颗子弹,并将其加入编组bullets中'''if len(self.bullets) < self.settings.bullet_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _check_keydown_events(self,event):'''响应按键'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = True#     按q关闭界面elif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self,event):'''响应松开'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _update_bullets(self):'''更新的子弹位置并删除消失的子弹'''
#         更新子弹位置self.ship.update()
#         删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)if __name__ == '__main__':# 创建实例并运行游戏ai = AlienInvasion()ai.run_game()

下面这个是游戏的设置代码,其中的方法名字定义顾名思义,英语有点硬伤的可以有道翻译一下

class Settings():'''存储《外星人入侵》所有设置的类'''def __init__(self):'''初始化游戏的设置'''# 屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)# 飞船设置self.ship_speed = 1.5# 子弹设置self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)#allowed 允许   允许子弹发射的数目self.bullet_allowed = 3

这个下面的代码是飞船的设置,可以根据自己喜好改变飞船的绘制

import pygame
class Ship():'''管理飞船的类'''def __init__(self,ai_game):'''初始化飞船并设置其初始位置'''self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()# 加载飞船图像并获取其外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部中央self.rect.midbottom = self.screen_rect.midbottom#     在飞船的属性x中存小数值self.x = float(self.rect.x)#     移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):'''根据移动标志调整飞船的位置'''# 更新飞船而不是rect对象的x值if self.moving_right and self.rect.right <self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed# 根据self.x更新rect对象self.rect.x = self.xdef blitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image,self.rect)

这段代码是飞船图像的文件,可以根据自己喜好改变飞船的样子
在这里插入图片描述
接下来就是子弹的绘制代码

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):'''管理所有发射的子弹'''def __init__(self,ai_game):# 在飞船当前位置创建一个子弹对象super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# 在(0,0)处创建一个表示字典的矩形,再设置正确的位置self.rect = pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtop# 存储用小数表示的子弹位置self.y =  float(self.rect.y)def update(self):'''向上移动子弹'''# 更新表示子弹位置的小数值self.y -= self.settings.bullet_speed# 更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):'''在屏幕上绘制子弹'''pygame.draw.rect(self.screen,self.color,self.rect)

截止到这段代码,你写完之后就可以把飞船和发射子弹的行为做出来。
3.1

在这里插入图片描述

成功吧外星人创建出来了

下一步就是把外星人写出来

截止2021年3月3日23:30分在这里插入图片描述
我终于吧基本配置完毕,合张影留个纪念吧!!!
在这里插入图片描述

最终代码(五个模块)

飞机大战主程序模块[alien_invasion]

import pygame
import sys
from time import sleepimport alien
from settings import Settings
from game_stats import GameStats
from ship import Ship
from bullet import Bullet
from alien import Alienclass AlienInvasion(object):'''管理游戏资源和行为的类'''def __init__(self):'''初始化游戏并创建游戏资源'''pygame.init()self.settings = Settings()# 设置背景色self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption('Alin Invasion')# 创建一个用于存储游戏统计信息的实例self.stats = GameStats(self)self.ship = Ship(self)self.bullets = pygame.sprite.Group()self.aliens = pygame.sprite.Group()self._create_fleet()def run_game(self):'''开始游戏的主循环'''while True:# 监视键盘和鼠标事件self._check_events()if self.stats.game_active:self.ship.update()self._update_bullets()self._update_aliens()self.bullets.update()# 每次循环时都重绘屏幕# self.screen.fill(self.settings.bg_color)self.ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()self._update_screen()def _check_events(self):'''响应按键和鼠标事件'''for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _update_screen(self):'''更新屏幕上的图像,并切换到新屏幕'''self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)pygame.display.flip()def _fire_bullet(self):'''创建一颗子弹,并将其加入编组bullets中'''if len(self.bullets) < self.settings.bullet_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _check_keydown_events(self, event):'''响应按键'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = True#     按q关闭界面elif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self, event):'''响应松开'''if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _update_bullets(self):'''更新的子弹位置并删除消失的子弹'''#         更新子弹位置self.ship.update()#         删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_allien_collisions()def _check_bullet_allien_collisions(self):'''响应子弹和外星人碰撞'''# 删除发生碰撞的子弹和外星人collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if not self.aliens:#         删除现有的子弹并新建一群外星人self.bullets.empty()self._create_fleet()def _create_fleet(self):'''创建外星人群'''#         创建一个外星人#         创建一个外星人并计算一行可容纳多少外星人#         外星人间距为外星人宽度alien = Alien(self)alien_width, alien_height = alien.rect.sizealien_width = alien.rect.widthavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)# 计算屏幕可容纳多少外星人ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)# 创建外星人群for row_number in range(number_rows):#         创建第一行外星人for alien_number in range(number_aliens_x):#         创建一个外星人并将其加入当前行self._create_alien(alien_number, row_number)def _create_alien(self, alien_number, row_number):'''创建一个外星人并将其放在当前行'''alien = Alien(self)alien_width, alien_heidth = alien.rect.sizealien_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_numberself.aliens.add(alien)def _update_aliens(self):'''更新外星人群中所有外星人的位置'''self.aliens.update()'''检查是否有外星人位于屏幕边缘并更新整群外星人的位置'''self._check_fleet_edges()#     检测外星人和飞船之间的碰撞if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()#     检查是否有外星人到达了屏幕底端self._check_aliens_bottom()def _check_fleet_edges(self):'''有外星人到达边缘时采取响应措施'''for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):'''将整群外星人下移,并改变它们的方向'''for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _ship_hit(self):'''响应飞船被外星人撞到'''#         将ship_left减1if self.stats.ship_left > 0:self.stats.ship_left -= 1#         清空余下的外星人和子弹self.aliens.empty()self.bullets.empty()#         创建一群新的外星人,并将飞船放到屏幕底端或中央self._create_fleet()self.ship.center_ship()#         暂停sleep(0.5)else:self.stats.game_active = Falsedef _check_aliens_bottom(self):'''检查是否有外星人到达了屏幕底端'''screen_rect = self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 像飞船被撞到一样处理self._ship_hit()breakif __name__ == '__main__':# 创建实例并运行游戏ai = AlienInvasion()ai.run_game()

飞机大战子弹模块[bullet]

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):'''管理所有发射的子弹'''def __init__(self, ai_game):# 在飞船当前位置创建一个子弹对象super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# 在(0,0)处创建一个表示字典的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtop# 存储用小数表示的子弹位置self.y = float(self.rect.y)def update(self):'''向上移动子弹'''# 更新表示子弹位置的小数值self.y -= self.settings.bullet_speed# 更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):'''在屏幕上绘制子弹'''pygame.draw.rect(self.screen, self.color, self.rect)

飞船模块[ship]

import pygame
class Ship():'''管理飞船的类'''def __init__(self,ai_game):'''初始化飞船并设置其初始位置'''self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()# 加载飞船图像并获取其外接矩形self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部中央self.rect.midbottom = self.screen_rect.midbottom#     在飞船的属性x中存小数值self.x = float(self.rect.x)#     移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):'''根据移动标志调整飞船的位置'''# 更新飞船而不是rect对象的x值if self.moving_right and self.rect.right <self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed# 根据self.x更新rect对象self.rect.x = self.xdef blitme(self):'''在指定位置绘制飞船'''self.screen.blit(self.image,self.rect)def center_ship(self):'''让飞船在屏幕底端居中'''self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)

游戏状态模块[game_stats]

class GameStats:'''跟踪游戏的统计信息'''def __init__(self, ai_game):'''初始化统计信息'''self.settings = ai_game.settingsself.reset_stats()#     游戏刚启动处于活动状态self.game_active = Truedef reset_stats(self):'''初始化在游戏运行期间可能变化的统计信息'''self.ship_left = self.settings.ship_limit

外星人模块[alien]

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):'''表示外星人的类'''def __init__(self, ai_game):'''初始化外星人并设置起始位置'''super().__init__()self.settings = ai_game.settingsself.screen = ai_game.screen# 加载外星人图像并设置其screen属性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 update(self):'''向左或右移动外星人'''self.x += (self.settings.alien_speed*self.settings.fleet_direction)self.rect.x = self.xdef check_edges(self):'''如果外星人位于屏幕边缘,就返回Ture'''screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left < 0:return True

游戏整体设置模块[settings]

class Settings():'''存储《外星人入侵》所有设置的类'''def __init__(self):'''初始化游戏的设置'''# 屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# 飞船设置self.ship_speed = 1.5self.ship_limit = 3# 子弹设置self.bullet_speed = 1.5self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)# allowed 允许   允许子弹发射的数目self.bullet_allowed = 3# 外星人设置self.alien_speed = 0.5self.fleet_drop_speed = 10# fleet_direction 为1表示向右移,为-1表示向左移self.fleet_direction = 1

项目源代码

文章过长,需要项目源代码的,我已经打包好了,直接下载即可
百度云:
链接:https://pan.baidu.com/s/1iRRaUhWOj1321XRrTbp4VQ
提取码:0oo8
复制这段内容后打开百度网盘手机App,操作更方便哦

最后一点点想说的

写了这么多,最后真的是写不动了,我刚开始写这篇文章还想着最后说点什么总结一下,但是真的到这天了,我却一点也写不动了,我做这个项目对我来说真的很辛苦,但是提升也很大,我发表出来记录一下自己的成长过程!
如果您觉得我写的不错(就算写的不好,也挺辛苦的),麻烦您动动小手,点赞评论关注,您的支持就我坚持写下去,坚持记录自己成长的最大动力谢谢您的支持。

这篇关于python小游戏,飞机大战外星人,主要是面向对象编程,看一看我的代码和感悟与总结,发表出你的意见建议吧!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238605

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍:   主要特点   高精度与多功能:便携式气象仪器能够采集多种气象参数,包括但不限于风速、风向、温度、湿度、气压等,部分高级型号还能监测雨量和辐射等。数据采集与存储:配备微电脑气象数据采集仪,具有实时时钟、数据存

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的