说明:这是python编程从入门到实践中255页说明的程序的一个自己的改编。

rain相当于书中的alien(外星人),rains(就是外星人群),spider相当于ship其余的和书中类似。

代码自己改编了一部分。自己瞎写的。

#bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):def __init__(self,screen,spider,settings):super(Bullet,self).__init__()self.screen = screenself.spider = spiderself.rect = pygame.Rect(0,0,settings.bullet_width,settings.bullet_height)self.rect.top = self.spider.rect.topself.rect.centerx = self.spider.rect.centerxself.settings = settingsself.y = float(self.rect.y)def update(self):self.y -= self.settings.bullet_speed_factorself.rect.y = self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.settings.bullet_color,self.rect)#game_functions.py
import pygame
import sys
from rain import Rain
from bullet import Bullet
from time   import sleepdef check_key_events(role,screen,spider,settings,bullets):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event,role,screen,spider,settings,bullets)elif event.type == pygame.KEYUP:check_keyup_events(event,role)def check_keydown_events(event,role,screen,spider,settings,bullets):if event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_LEFT:role.moving_left = Trueelif event.key == pygame.K_RIGHT:role.moving_right = Trueelif event.key == pygame.K_UP:role.moving_up = Trueelif event.key == pygame.K_DOWN:role.moving_down = Trueelif event.key == pygame.K_SPACE:bullet = Bullet(screen,spider,settings)bullets.add(bullet)def check_keyup_events(event,role):if event.key == pygame.K_LEFT:role.moving_left = Falseelif event.key == pygame.K_RIGHT:role.moving_right = Falseelif event.key == pygame.K_UP:role.moving_up = Falseelif event.key == pygame.K_DOWN:role.moving_down = False
def update_bullets(bullets,rains):bullets.update()collision_ = pygame.sprite.groupcollide(bullets,rains,True,True)def update_screen(settings,screen,rains,role,bullets):screen.fill(settings.color)rains.draw(screen)role.blitme()for bullet in bullets.sprites():bullet.draw_bullet()pygame.display.flip()def get_available_space_x(settings,rain):available_space_x = settings.screen_width - 4 * rain.rect.widthreturn available_space_x
def get_rain_numbers_x(settings,rain):available_space_x = get_available_space_x(settings,rain)rain_numbers = int(available_space_x / (2 * rain.rect.width))return rain_numbers
def get_available_space_y(settings,rain):available_space_y = settings.screen_height - (4 * rain.rect.height)return available_space_y
def get_rain_rows(settings,rain):available_space_y = get_available_space_y(settings,rain)rain_rows = int(available_space_y / (2 * rain.rect.height))return rain_rows
def create_rain_drop(screen,settings,row_number,rain_number_x,rain,rains):rain_width = rain.rect.widthrain_height = rain.rect.heightrain_drop =Rain(screen,settings) rain_drop.x = rain_width + 2 * rain_width * rain_number_xrain_drop.y = rain_height + 2 * rain_height * row_numberrain_drop.rect.x = rain_drop.xrain_drop.rect.y = rain_drop.yrains.add(rain_drop)def create_rain_sets(settings,rain,screen,rains):rain_width = rain.rect.widthrain_height = rain.rect.heightrow_numbers = get_rain_rows(settings,rain)rain_numbers_x = get_rain_numbers_x(settings,rain)for row_number in range(row_numbers):for rain_number in range(rain_numbers_x):create_rain_drop(screen,settings,row_number,rain_number,rain,rains)def update_rains(rains,rain,settings,screen,role,stats,bullets):rains.update()if pygame.sprite.spritecollideany(role,rains):    ship_hit(settings,stats,screen,rains,bullets,role,rain)"""for rain in rains.copy():if rain.is_out():rains.remove(rain)       print("spider hit!!!")"""if len(rains) == 0 and stats.ships_left > 0:create_rain_sets(settings,rain,screen,rains)role.center_ship()#暂停sleep(0.5)check_aliens_bottom(settings,stats,screen,role,rains,bullets,rain)#下面这行代码不能缩进,不能依赖for循环的执行,因为#for循环可能不会执行
def ship_hit(settings,stats,screen,rains,bullets,role,rain):if  stats.ships_left > 0: stats.ships_left -= 1rains.empty()bullets.empty()#为何没有下面一句飞机蜘蛛完了还能移动呢?#而且,即时没有下一句,底下的大蜘蛛role碰撞了rains后,rains并不消失,屏幕上#还有许多的rainscreate_rain_sets(settings,rain,screen,rains)role.center_ship()else:stats.game_active = Falsedef check_aliens_bottom(settings,stats,screen,role,rains,bullets,rain):screen_rect = screen.get_rect()for rain in rains.sprites():if rain.rect.bottom >= screen_rect.bottom:ship_hit(settings,stats,screen,rains,bullets,role,rain)break#game.py
from pygame.sprite import Group
import sys
import pygame
from settings import Settings
import game_functions as gf
from rain import Rain
from role import Role
from game_stats import GameStatsdef run_game():pygame.init()my_set = Settings()screen = pygame.display.set_mode((my_set.screen_width,my_set.screen_height))pygame.display.set_caption(my_set.caption)my_rain = Rain(screen,my_set)rains = Group()gf.create_rain_sets(my_set,my_rain,screen,rains)stats = GameStats(my_set)my_role = Role(screen,my_set)bullets = Group()while True:gf.check_key_events(my_role,screen,my_role,my_set,bullets)if stats.game_active:gf.update_rains(rains,my_rain,my_set,screen,my_role,stats,bullets)my_role.update()gf.update_bullets(bullets,rains)gf.update_screen(my_set,screen,rains,my_role,bullets)print(stats.game_active)print(stats.ships_left)
run_game()       #game_stats.py
class GameStats():def __init__(self,settings):"""init the stats information"""self.game_active = Trueself.settings = settingsself.reset_stats()def reset_stats(self):self.ships_left = self.settings.ship_limitfrom pygame.sprite import Sprite
import pygame
import sys
from random import randint
class Rain(Sprite):def __init__(self,screen,settings):super(Rain,self).__init__()self.screen = screenself.image = pygame.image.load("role/1234.bmp")self.rect = self.image.get_rect()self.screen_rect = self.screen.get_rect()self.rect.x = self.rect.widthself.rect.y = self.rect.heightself.y = float(self.rect.y)self.x = float(self.rect.x)self.settings = settingsdef blitme(self):self.screen.blit(self.image,self.rect)def update(self):#上下左右随机运动r = randint(1,4)mod = r % 4if mod == 0:self.y -= self.settings.bullet_speed_factorelif mod == 1:self.y += self.settings.bullet_speed_factorelif mod == 2:self.x -= self.settings.bullet_speed_factorelif mod == 3:self.x += self.settings.bullet_speed_factorself.rect.x = self.xself.rect.y = self.ydef is_out(self):if self.rect.bottom < self.screen_rect.top:return Trueelif self.rect.top > self.screen_rect.bottom:return Trueelif self.rect.right < 0:return Trueelif self.rect.left > self.screen_rect.right:return Trueelse:return False#role.py
import pygame
class Role():def __init__(self,screen,settings):self.image = pygame.image.load("role/spider.bmp")self.rect = self.image.get_rect()self.screen = screenself.screen_rect = self.screen.get_rect()self.rect.bottom = self.screen_rect.bottomself.rect.centerx = self.screen_rect.centerxself.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falseself.x = float(self.rect.x)self.y = float(self.rect.y)self.settings = settingsdef blitme(self):self.screen.blit(self.image,self.rect)def update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.role_speed_factorelif self.moving_left and self.rect.left > 0:self.x -= self.settings.role_speed_factorelif self.moving_up and self.rect.top > self.screen_rect.top:self.y -= self.settings.role_speed_factorelif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.y += self.settings.role_speed_factorself.rect.x = self.xself.rect.y = self.ydef center_ship(self):#以下两句代码不管用#原因在于每次#self.rect.centerx = self.screen_rect.centerx#self.rect.bottom  = self.screen_rect.bottomself.x = self.screen_rect.centerxself.x -= 0.5 * float(self.rect.width)self.y = self.screen_rect.bottom - 40self.rect.x = self.xself.rect.y = self.y#settings.py
class Settings():def __init__(self):self.rain_drop_speed  = 0.2self.screen_width = 1000self.screen_height = 800self.caption   = 'rain_drop'self.color = (255,255,255)self.role_speed_factor = 1.5self.bullet_width = 3self.bullet_height = 15self.bullet_speed_factor = 2#红色子弹self.bullet_color = 255,0,0    self.ship_limit = 5

问题,game_functions.py中的一个问题,已经卸载game_functions.py中了。

pygame的一个小问题,未解决相关推荐

  1. 电脑桌面点击计算机反应迟钝,电脑桌面刷新反应慢?一个小操作即可解决!

    原标题:电脑桌面刷新反应慢?一个小操作即可解决! 我们在使用电脑时,有时候为了电脑反应更加快速,在关闭一些程序进程后都会习惯得刷新几次尽快释放内存.有时候我们点击刷新,电脑桌面图标需要很久才反应刷新出 ...

  2. 商场公园的宣传语音是怎么做的?一个小技巧来解决,还是真人发声

    商场公园的宣传语音是怎么做的?一个小技巧来解决,还是真人发声 在日常的生活当中,我们经常可以听到各种宣传语音,比如商场里面宣传折扣优惠的语音,再比如公园里面宣传爱护环境的语音等等.那么,这种商场公园的 ...

  3. 用python写一个小程序,解决买水果的问题?

    问题: 商店总共有三种水果,香蕉/苹果/葡萄,单价分别为3.5/5.0/3.0元/500克. 写一个小程序实现: 1.输出一个菜单:打印每种水果的价格: 2.寻问客户欲购买水果? 3.客户想购买的克数 ...

  4. 使用pygame开发一个小游戏

    学习了pygame,身为一个IKUN所以,做了一个简单的小游戏.游戏规则是,使用键盘的方向键控制坤坤,当坤坤触碰到篮球,就会爆发出音乐"只因你太美".代码如下: import ra ...

  5. Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决

    最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...

  6. altium designer 出gerber文件时一个小问题的解决

    在用altium designer出gerber文件时提示错误:The film is too small for this PCB. 原因:  设置的Film Size比实际PCB小 解决办法:1. ...

  7. 网红大咖都在用的,视频封面怎么做?一个小工具即可解决你的烦恼

    关于视频封面的制作方法,大周出过好几期的教学. 由于手机的功能有限,让大家都去学ps是很不现实的,大周最近发现了一个非常好用的工具,今天就来分享给大家. 不需要电脑.不用学习ps,一部手机就可搞定,轻 ...

  8. java applet类开始博饼_java学习笔记---第一个applet程序以及一个小问题的解决

    继续学习! 在D:\majava\文件夹下建立了一个helloworld_app.java,写入以下内容: import java.awt.*; import java.applet.*; publi ...

  9. PDF无法复制或图片文字时,用java开发一个小程序来解决,下载jar包直接使用

    目录 1 申请百度AI账号 2 创建AipOcr客户端client对象 3 创建图片操作对象 4 创建OcrServiceApplication对象 5 打jar包方便以后使用 不足之处: 最近在阅读 ...

最新文章

  1. 题解 UVA10298 【Power Strings】
  2. JSON入门之二:org.json的基本用法
  3. 第二十四期:面试问:Kafka为什么速度那么快?该怎么回答
  4. sqlserver 字符串转化数值函数_Excel常见函数用法(TEXT函数)
  5. php判断日期文章变红,DeDecms如何实现当天发表的文章日期以红色显示
  6. Spring4.x(7)---对象的生命周期方法
  7. 11 JVM 垃圾回收(上)
  8. 完美解决html中select的option不能隐藏的问题。
  9. 在用ganglia时出现You don‘t have permission to access ganglia on this server
  10. Android IPC系列(三):Binder概述
  11. 基于opencv的车牌号码识别 必备基础知识
  12. 局域网***原理与防御(网络执法官类)
  13. JS数值类型与字符串类型的内置方法
  14. phython day1
  15. 滚轮每次滚动距离是一致的吗_「超硬核科普」鼠标的发展历史,中国人发明的鼠标滚轮...
  16. 嵌入式系统求职回忆录1
  17. (CVPR 2022 阅读笔记)Residual Local Feature Network for Efficient Super-Resolution
  18. 由开启coredump引起的对shell的深入探究
  19. int,long,long long等类型的范围
  20. BZOJ1123BLO Tarjan割点+乘法原理+dfs

热门文章

  1. linux下eclipse+pdt(PHP集成开发环境安装)
  2. ASM上的备份集如何转移到文件系统中
  3. Silverlight, B/S or C/S?
  4. 如何解决复杂条件下的程序流的控制问题?
  5. ⚡关于Eastmount博客「网络安全自学篇」系列重要通知!!!⚡
  6. C语言API编写窗体界面和按钮
  7. POJ 3981.字符串替换
  8. 2013\National _C_C++_C\1.好好学习
  9. 《算法:C语言实现》—— 第二部分 —— 第3章 —— 基本数据结构
  10. cookie 跨域问题