之前写了一个小游戏,飞船发射子弹和外星人做斗争。

现在临近期末考试,可能没空写完这个游戏了。

这样,就当埋个坑,以后有空一定要回来把这个游戏写完。

半成品代码先贴上来:

alien.py:创建alien的类

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):"""表示单个外星人的类。"""def __init__(self,ai_game):"""初始化外星人并设置其起始位置"""super().__init__()self.screen=ai_game.screenself.settings=ai_game.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 or self.rect.left<=0:return Truedef update(self):"""向左或向右移动外星人"""self.x+=(self.settings.alien_speed*self.settings.fleet_direction)self.rect.x=self.x

ship.py:这里是飞船的类

import pygameclass 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):"""根据移动标志调整飞船的位置"""if self.moving_right==True and self.rect.right<self.screen_rect.right:self.x+=self.settings.ship_speedif self.moving_left==True 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)

settings.py:创建环境的类

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.5self.bullet_width=3self.bullet_height=15self.bullet_color=(60,60,60)self.bullets_allowed=3#外星人设置self.alien_speed=1.0self.fleet_drop_speed=10#fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction=1

bullet.py:创建子弹的类

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=ai_game.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)

最后就是游戏的运行:

alien_invasion.py:

import sysimport pygamefrom settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alienclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源"""pygame.init()self.settings=Settings()self.screen=pygame.display.set_mode((1200,800))self.settings.screen_width=self.screen.get_rect().widthself.settings.screen_height=self.screen.get_rect().heightpygame.display.set_caption("Alien Invasion")#设置背景色self.bg_color=(230,230,230)self.ship=Ship(self)self.bullets=pygame.sprite.Group()self.aliens=pygame.sprite.Group()self._create_fleet()def _create_fleet(self):"""创建外星人群"""#创建一个外星人并计算一行可容纳多少个外星人#外星人的间距为外星人宽度alien=Alien(self)alien_width,alien_height=alien.rect.sizeavailable_space_x=self.settings.screen_width-(2*alien_width)number_alien_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_alien_x):self._create_alien(alien_number,row_number)def _create_alien(self,alien_number,row_number):#创建一个外星人并将其加入当前行alien=Alien(self)alien_width,alien_height=alien.rect.sizealien.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 _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 run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self._update_bullets()self._update_aliens()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 _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=Trueelif event.key==pygame.K_q:self.screen=pygame.display.set_mode((1200,800))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 _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中"""if len(self.bullets)<self.settings.bullets_allowed:new_bullet=Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):"""更新子弹的位置并删除消失的子弹"""#更新子弹的位置self.bullets.update()#检查是否有子弹击中了外星人#如果是,就删除相应的子弹和外星人collisions=pygame.sprite.groupcollide(self.bullets,self.aliens,True,True)#删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom<=0:self.bullets.remove(bullet)if not self.aliens:#删除现有的子弹并新建一群外星人self.bullets.empty()self._create_fleet()def _update_aliens(self):"""更新外星人群中所有外星人的位置"""self._check_fleet_edges()self.aliens.update()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()if __name__=='__main__':#创建游戏实例并运行游戏。ai=AlienInvasion()ai.run_game()

还有游戏目前涉及的两张图片:

将这两张图片保存在images文件夹内,依次对每一个文件编译过后,最后对alien_invasion编译就可以运行游戏了。注意几个文件要放在同一个目录底下,就像这样:

_pycache_里面是编译产生的类。

最后展示一下这个弱智小游戏的效果。。。。。

飞船打外星人(python)相关推荐

  1. Python外星人入侵游戏——添加飞船和外星人图片

    Python外星人入侵游戏是自己在<Python编程从入门到实践>在本书里学到的.本篇主要介绍该游戏中所需要的两个图片.分别为飞船和外星人图片. 1.首先去到 http://www.itu ...

  2. Python外星人入侵中存放飞船和外星人的文件夹

    上篇介绍了Python外星人入侵游戏--添加飞船和外星人图片.可以先把这两张图片先下载到此工程下的一个images文件夹下,如图

  3. python游戏飞船与外星人代码

    第一个游戏,菜鸡的我按教程来的,成功运行了,打包遇到点问题,还在摸索. 模块: 主程序:game1_main.py """ 对象screen是一个surface,每经过一 ...

  4. python随机出现外星人飞船_《外星人入侵》项目飞船和外星人相撞后飞船不返回屏幕底部,依然在外星人中间的问题解决方法...

    再写外星人入侵项目的时候发现了这个bug,找了很多帖子,也没有效果,现在改正过来了,希望有所帮助,代码如下: class Ship(Sprite): def __init__(self, ai_set ...

  5. 外星人python项目详解7.10

    1,关于其他模块:在本项目中,pygame模块需要被下载引入.今天为了复习巩固python基本语法知识从而从较高层面来使用Pygame模块.其中使用了如下函数: pygame.init初始化函数 py ...

  6. 《Python编程从入门到实践》外星人入侵游戏——添加 飞船 图片和外星人 图片,素材

    <Python编程从入门到实践>在本书里学到的.本篇主要介绍该游戏中所需要的两个图片.分别为飞船和外星人图片. 1.首先去到 http://www.ituring.com.cn/book/ ...

  7. Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果

    外星人入侵 本篇博客紧接上一篇博客:设置飞船发出子弹https://blog.csdn.net/Ace_bb/article/details/104845723 本篇博客实现在游戏窗口中添加动态的外星 ...

  8. 外星人入侵 python 飞船位置_《python从入门到实践》项目一:外星人入侵

    游戏编程思维导图 游戏思路 函数编写 第一次做思维导图,做的有点乱 解释:跟着<python编程从入门到实践>写完游戏程序后,写一下自己的心得体会.可以把这个游戏分为几块来理解.如果想要设 ...

  9. Python 外星人入侵游戏(一):武装飞船(上)

    从这周开始Python的实践学习,首先来开发一个外星人入侵游戏,这样可以对之前的概念有更深入的理解,对交互式项目有更深入的认识 来源:<Python编程:从入门到实践> 注意:游戏< ...

最新文章

  1. YUM安装多个(多实例) Mysql
  2. linux修改时间指令,Linux 修改时间的指令
  3. 解读谷歌事件中的失语症现象
  4. Django - ORM - 事务, 乐观锁, 悲观锁
  5. Node.js异步库async
  6. 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】
  7. 创建新的option
  8. php implode key,PHP Implode关联数组
  9. 【华为云技术分享】iSulad轻量化容器实践解析
  10. “每天AI资讯这么多!该看哪些?”推荐一份优质资料清单
  11. java 字符串连接_为什么 Java 要把字符串设计成不可变的
  12. Linux C - symlink 和 readlink - 符号链接
  13. 如何制做计算机病毒,电脑病毒制作-怎么制作电脑病毒请教高手,怎么做病毒? – 手机爱问...
  14. 【CCF】小中大(C++)
  15. (matlab)地震数据频谱分析-频谱图代码
  16. kubernetes中容器(pod)间的通信及环境变量设置
  17. ARP欺骗——断网攻击
  18. android手表怎样刷机,碉堡了!智能手表也能一键刷机
  19. mysql中问号传参_问号传值有以下三种方法:
  20. android x86_646,雷电模拟器4.0x86_64位版本即android 7.1 xposed安装

热门文章

  1. 腾讯微博 - QQ微博
  2. 【POJ3237】【树链剖分】Tree
  3. 软件开发工程师最重要的4项技能
  4. 2023款MacBook Pro M2参数配置怎么样 性能怎么样 尺寸重量多少?
  5. 电动力学专题:电磁波传播时的色散效应
  6. Mysql安装路径设置
  7. height:100%和height:inherit比较
  8. vue项目中使用element-ui中的el-calendar日历制作考勤
  9. Symbian前景展望
  10. 华为最近面试后要等多久才有消息?(有经验进)