星际争霸之小霸王之小蜜蜂(十五)--剧将终场

系列文章目录

星际争霸之小霸王之小蜜蜂(十四)--资本家的眼泪

星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞

星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

 星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

 星际争霸之小霸王之小蜜蜂(十)--鼠道

星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾

 星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

  星际争霸之小霸王之小蜜蜂(七)--消失的子弹

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

 星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

 星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来


目录

系列文章目录

文章目录

前言

二、整体分析

 alien_invasion.py

 game_functions.py

 alien.py

 bullet.py

 settings.py

 button.py

 game_stats.py

 scoreboard.py

 ship.py

总结


前言

我们已经基本完成了书上的所有操作,共用了14天学习,今天我们进行整理,将完整代码整理出来,供大家学习,也为今后我自己调阅。


一、心得体会

经过这段时间的学习,可以说浅显了解了pygame这个模块的一些函数使用,确实针对游戏的设计方面提供了很便利的支持。初步掌握了这些方法,我们可以很方便的作出一些其他的游戏。比如扫雷游戏,通过鼠标点击判断,再比如说贪食蛇,主要核心应该是碰撞的监测。至于纸牌或是其他的游戏目前还没有想好。

 除了接触到一些新的函数,还学习了面对对象编程的方法,虽然不在公司上班,只是个人的小打小闹,但是先进的编程理念学起来肯定没有错。同时还感受到了规范的命名规则,对于我来说有点困难,因为英语不行,所以这个命名会大大降低我的编写速度,在调用函数时,要反复的看单词怎么写,太浪费时间了。

二、整体分析

这次我们总共写了9个类,其实还是有规律的,不同的对象各自建一个类,比如说小花猫、小老鼠和子弹。然后需要修改的参数放在一个类,事件监听放在一个类等等,现在将所有的类代码整理如下:

 alien_invasion.py

import pygame
import settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboarddef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen,new_setting)alien = Alien(new_setting,screen)pygame.display.set_caption("狂敲代码的橘子")bullets = Group()aliens = Group()gf.create_fleet(new_setting,screen,aliens)stats = GameStats(new_setting)play_button = Button(new_setting,screen,'Play')sb = Scoreboard(new_setting,screen,stats)while True:gf.check_events(new_setting,screen,ship,bullets,stats,play_button,aliens,sb)if stats.game_active:ship.update()gf.update_bullets(new_setting,screen,bullets,aliens,stats,sb)gf.update_aliens(new_setting,stats,screen,ship,aliens,bullets)gf.update_screen(new_setting,screen,stats,ship,bullets,aliens,play_button,sb)run_game()

 game_functions.py

import sys
import pygame
import time
from bullet import Bullet
from alien import Aliendef check_keydown_events(event,new_setting,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_bullet(new_setting, 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 = Falseif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(new_setting,screen,ship,bullets,stats,play_button,aliens,sb):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:check_keydown_events(event,new_setting,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(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen,sb)def check_play_button(stats,play_button,mouse_x,mouse_y,new_setting,aliens,bullets,ship,screen,sb):if play_button.rect.collidepoint(mouse_x,mouse_y) and not stats.game_active:pygame.mouse.set_visible(False)stats.reset_stats()stats.game_active = Truealiens.empty()bullets.empty()sb.prep_score()new_setting.initialize_dynamic_settings()create_fleet(new_setting,screen,aliens)ship.center_ship()def fire_bullet(new_setting,screen,ship,bullets):if len(bullets) < new_setting.bullets_allowed:new_bullet = Bullet(new_setting, screen, ship)bullets.add(new_bullet)def update_bullets(new_setting,screen,bullets,aliens,stats,sb):check_bullet_alien_collisions(new_setting,screen,bullets,aliens,stats,sb)bullets.update()for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)def check_bullet_alien_collisions(new_setting,screen,bullets,aliens,stats,sb):collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if collisions:for aliens in collisions.values():stats.score += len(aliens)sb.prep_score()if len(aliens) == 0:bullets.empty()new_setting.increase_speed()create_fleet(new_setting, screen, aliens)def create_fleet(new_setting,screen,aliens):for row_number in range(3):for alien_number in range(6):alien = Alien(new_setting,screen)alien.x = alien.rect.width+2*alien.rect.width*alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height+2*alien.rect.height*row_numberaliens.add(alien)def update_screen(new_setting,screen,stats,ship,bullets,aliens,play_button,sb):screen.fill(new_setting.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)sb.show_score()if not stats.game_active:play_button.draw_button()pygame.display.flip()def ship_hit(new_setting,stats,screen,ship,aliens,bullets):stats.ships_left -= 1aliens.empty()bullets.empty()create_fleet(new_setting, screen, aliens)ship.center_ship()if stats.ships_left > 0:stats.ships_left -= 1time.sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)def check_aliens_bottom(new_setting,stats,screen,ship,aliens,bullets):screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:ship_hit(new_setting,stats,screen,ship,aliens,bullets)breakdef update_aliens(new_setting,stats,screen,ship,aliens,bullets):check_fleet_edges(new_setting,aliens)aliens.update()if pygame.sprite.spritecollideany(ship,aliens):ship_hit(new_setting, stats, screen, ship, aliens, bullets)check_aliens_bottom(new_setting, stats, screen, ship, aliens, bullets)def change_fleet_direction(new_setting,aliens):for alien in aliens.sprites():alien.rect.y += new_setting.fleet_drop_speednew_setting.fleet_direction *=-1def check_fleet_edges(new_setting,aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(new_setting,aliens)break

 alien.py

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):def __init__(self,new_setting,screen):super(Alien,self).__init__()self.screen = screenself.new_setting = new_settingself.image = pygame.image.load('mouse.jpg')self.rect = self.image.get_rect()self.rect.x = self.rect.widthself.rect.y = self.rect.heightself.x = float(self.rect.x)def blitme(self):self.screen.blit(self.image,self.rect)def update(self):self.x += (self.new_setting.alien_speed_factor*self.new_setting.fleet_direction)self.rect.x = self.xdef check_edges(self):screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left<=0:return True

 bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self,new_setting,screen,ship):super(Bullet,self).__init__()self.screen = screenself.rect = pygame.Rect(0,0,new_setting.bullet_width,new_setting.bullet_hight)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.topself.y = float(self.rect.y)self.color =  new_setting.bullet_colorself.speed_factor = new_setting.bullet_speed_factordef update(self):self.y -=self.speed_factorself.rect.y =self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)

 settings.py

class Settings():def __init__(self):self.screen_width = 800self.screen_height = 600self.bg_color = (255,255,255)self.ship_limit = 2self.bullet_width = 2self.bullet_hight = 5self.bullet_color = 60,60,60self.bullets_allowed = 20self.fleet_drop_speed = 30self.speedup_scale = 1.2self.initialize_dynamic_settings()def initialize_dynamic_settings(self):self.ship_speed_factor = 0.1self.bullet_speed_factor = 0.5self.alien_speed_factor = 0.5self.fleet_direction = 1def increase_speed(self):self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scale

 button.py

import pygame.fontclass Button():def __init__(self,new_setting,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)#创建按钮的rect对象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.centerself.prep_msg(msg)def prep_msg(self,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)

 game_stats.py

class GameStats():def __init__(self,new_setting):self.new_setting = new_settingself.reset_stats()self.game_active = Falsedef reset_stats(self):self.ships_left = self.new_setting.ship_limitself.score = 0

 scoreboard.py

import pygame.fontclass Scoreboard():def __init__(self,new_setting,screen,stats):self.screen = screenself.screen_rect = screen.get_rect()self.new_setting  = new_settingself.stats = statsself.text_color = (30,30,30)self.font = pygame.font.SysFont(None,48)self.prep_score()def prep_score(self):score_str = str(self.stats.score)self.score_image =  self.font.render(score_str,True,self.text_color,self.new_setting.bg_color)self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right-20self.score_rect.top = 20def show_score(self):self.screen.blit(self.score_image,self.score_rect)

 ship.py

import pygameclass Ship():def __init__(self,screen,new_settings):self.screen = screenself.image = pygame.image.load('cat.png')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom=self.screen_rect.bottomself.new_settings = new_settingsself.moving_right = Falseself.moving_left = Falseself.center = float(self.rect.centerx)def update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.new_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.new_settings.ship_speed_factorself.rect.centerx = self.centerdef blitme(self):self.screen.blit(self.image,self.rect)def center_ship(self):self.center = self.screen_rect.centerx

总结

后面我准备将游戏在改一改,时代在进步,游戏画面我是无能为力,但是游戏机制可以改一改,这种老土的游戏机制我实在玩不下去,不符合我们现在玩的飞机大战,将小花猫的行动轨迹改一改,可以全屏移动,然后将小老鼠也改成不规则的,而不是集体向下 向右,如果有可能的话,改成躲避类,最后小老鼠也可以放子弹。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

sentinel-dashboard-1.8.0.jar开机自启动脚本

启动阿里巴巴的流控组件控制面板需要运行一个jar包&#xff0c;通常需要运行如下命令&#xff1a; java -server -Xms4G -Xmx4G -Dserver.port8080 -Dcsp.sentinel.dashboard.server127.0.0.1:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.0.jar &…

HTML - input type=file 允许用户选择多个文件

效果 示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><!-- When the multiple Boolean attribute is specified, the file input allows the user to select more than o…

再生之术:遗忘 Root 密码的 CentOS8 Stream 解决方案

文章目录 大魔头 RootGRUB 引导界面BootLoaderGRUB主要功能选择启动的操作系统编辑内核启动参数 进入GRUB 引导界面编辑内核启动参数单用户模式 进入内核编辑界面rd.break进入单用户模式 大魔头 Root 哈哈&#xff0c;你好&#xff01;今天&#xff0c;让我们来聊聊 Linux 系统…

Linux 端口

查看端口占用 1、使用nmap命令查看端口的占用情况 安装nmap&#xff1a;yum -y install nmap 语法&#xff1a;nmap 被查看的IP地址 可以看到&#xff0c;本机&#xff08;127.0.0.1&#xff09;上有7个端口现在被程序占用了。 2、使用netstat命令查看指定端口的占用情况 语…

小程序如何设置余额充值

在小程序中设置余额充值是一种非常有效的方式&#xff0c;可以帮助商家吸引更多的会员并提高用户的消费频率。下面将介绍如何在小程序中设置余额充值并使用。 第一步&#xff1a;创建充值方案 在小程序管理员后台->营销管理->余额充值页面&#xff0c;添加充值方案。可…

Python爬虫实战案例——第六例

文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff01;严禁将文中内容用于任何商业与非法用途&#xff0c;由此产生的一切后果与作者无关。若有侵权&#xff0c;请联系删除。 目标&#xff1a;去哪儿网指定城市人气值最高的15个景点评论数据采集 地址&a…

ThreeJS-3D教学二:基础形状展示

three中提供了22 个基础模型&#xff0c;此案例除了 EdgesGeometry、ExtrudeGeometry、TextGeometry、WireframeGeometry&#xff0c;涵盖 17 个形状。 Fog 雾化设置&#xff0c;这是scene场景效果EdgesGeometry , WireframeGeometry 更多地可能作为辅助功能去查看几何体的边和…

学校安全用电管理系统解决方案

随着科技的发展和进步&#xff0c;电力已成为我们日常生活和学习的重要支柱。然而&#xff0c;电力的使用也带来了一定的安全风险。特别是对于学校这个复杂而又活跃的环境&#xff0c;安全用电管理系统的角色显得尤为重要。 一、学校用电管理系统的现状 目前&#xff0…

26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法

声明 本文是学习GB-T 26593-2011 无损检测仪器 工业用X射线CT装置性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用X 射线CT 装置(以下简称CT 装置)性能测试的术语、定义、缩略语以及空间 分辨力、密度分辨率…

linux 防火墙iptables

iptables 是 Linux 中比较底层的网络服务&#xff0c;它控制了 Linux 系统中的网络操作&#xff0c;CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的&#xff0c;只为了简化 iptables 的操作。同时&#xff0c;iptables 不仅仅是防火墙这么简单&#xff…

Mysql8安装+重装的数据备份方法【提供Mysql8.0.27版本的压缩包】

文章目录 Mysql8压缩安装包下载安装流程压缩包解压配置环境变量 初始化数据库连接数据库修改密码Mysql重装/重装系统 的数据库备份方法数据备份数据还原 Mysql8压缩安装包下载 压缩包下载路径 安装流程 压缩包解压 首先将压缩包解压&#xff0c;下图是解压之后的文件目录&a…

Swift SwiftUI 修改 List 背景颜色

Preview: Code: .listRowBackground(Color(.yellow)).scrollContentBackground(.hidden) .background(.linearGradient(colors: [.white, .accentColor], startPoint: .top, endPoint: .bottom))喜欢或对你有帮助&#xff0c;点个赞吧&#xff0c;自己先点个嘿嘿。 有错误或者…

eNSP网络学习-v05

IP容量 ip地址一共是32位&#xff0c;/24就表示他的网络号是24位。 也就是说共有 2^&#xff08;32-24&#xff09;-2 个主机&#xff08;因为主机为全0和1的保留不用&#xff0c;所以需要减2&#xff09;&#xff0c;共254个ip。 /24&#xff1a;2的8次方-2 &#xff1a;254 …

Oracle 11g_FusionOS_安装文档

同事让安装数据库&#xff0c;查询服务器信息发现操作系统是超聚变根据华为openEuler操作系统更改的自研操作系统&#xff0c;安装过程中踩坑不少&#xff0c;最后在超聚变厂商的技术支持下安装成功&#xff0c;步骤可参数该文。 一、 安装环境准备 1.1 软件下载 下载地址:…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

从零开始之了解电机及其控制(11)实现空间矢量调制

广泛地说&#xff0c;空间矢量调制只是将电压矢量以及磁场矢量在空间中调制到任意角度&#xff0c;通常同时最大限度地利用整个电压范围。 其他空间矢量调制模式确实存在&#xff0c;并且根据您最关心的内容&#xff0c;它们可能值得研究。 如何实际执行这种所谓的交替反向序列…

【小余送书第一期】《数据要素安全流通》参与活动,即有机会中奖哦!!

目录 1、背景介绍 2、本书编撰背景 3、本书亮点 4、本书主要内容 5、活动须知 1、背景介绍 随着大数据、云计算、人工智能等新兴技术的迅猛发展&#xff0c;数据已经成为我国经济社会发展的五大生产要素之一&#xff0c;《网络安全法》《个人信息保护法》《数据安全法》的…

如何将图片转为ico格式

这里主要是记录一个网站&#xff0c;如果你有更好的办法欢迎留言~ ico简介 ICO&#xff08;Icon&#xff09;是一种用于表示图标的文件格式&#xff0c;常用于Windows操作系统中。ICO格式的图片通常用于表示应用程序、文件夹、网站等的图标。 ICO文件可以包含多个图标&#x…

LINUX|ubuntu常用指令

文章目录 查看IP显示当前路径下所有文件安装编译工具GCC、调试工具GDB、连接工具SSHmkdir 创建目录export命令显示当前系统定义的所有环境变量echo $PATH命令输出当前的PATH环境变量的值当前命令行添加环境变量&#xff0c;关闭失效&#xff0c;防止多版本库冲突时使用sudo su打…

Python函数:chr()和ord()

两个函数是基于Unicode编码表进行进行字符与字码之间的转换。 chr()函数是通过字码转换成字符: 如图,坐标(1,4e10)丑 使用chr需要线将坐标相加得到&#xff1a;4e11 chr默认传入10进制的字码. 如图是各进制的字码。 也可以传入其他进制&#xff0c;不过需要在前面传入的参数最前…