中国农村建设投资有限公司网站首页,哪里建网站好,遵义软件制作平台,搭配服装网站源码目录
前言 一、删除子弹 二、限制子弹数量 三、继续重构代码
总结 前言 昨天我们已经让子弹飞了起来#xff0c;但是会面临一个和之前小蜜蜂一样的问题#xff0c;小蜜蜂的行动应该限制在窗口内#xff0c;那么子弹也是有相同之处#xff0c;也需要限制一个移动范围…目录
前言 一、删除子弹 二、限制子弹数量 三、继续重构代码
总结 前言 昨天我们已经让子弹飞了起来但是会面临一个和之前小蜜蜂一样的问题小蜜蜂的行动应该限制在窗口内那么子弹也是有相同之处也需要限制一个移动范围当超出范围之后就要将其消灭释放内存因为子弹飞出屏幕外不是真的消失只是不显示而已依然占用内存空间。 一、删除子弹 按照上面的说法我们只需要判断子弹的位置如果子弹已经超出窗口就可以删除。这个判断放在哪里合适呢个人觉得放在刷新窗口前比较合适在显示窗口内容前判断是否需要删除后就不用浪费资源了。这样我们来修改主函数 import pygame
import settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Groupdef run_game():pygame.init()new_settingsettings.Settings()screen pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship Ship(screen,new_setting)pygame.display.set_caption(狂敲代码的橘子)bullets Group()while True:gf.check_events(new_setting,screen,ship,bullets)ship.update()bullets.update()for bullet in bullets:if bullet.rect.bottom0:bullets.remove(bullet)print(len(bullets))gf.update_screen(new_setting,screen,ship,bullets)run_game() 我们再确定了每个子弹的位置后添加循环判断代码之前我们说过窗口的左上角坐标是0.0所以只要子弹的最下边小于0就可以判断该子弹已经出了窗口因为在游戏的显示中通过肉眼是无法判断子弹飞出窗口后有没有删除所以增加了 print(len(bullets))来测试当子弹删除后bullets的长度会减少直至为0经运行确实达到了想要的目的。 这里还有一个问题我们写的for循环是for bullet in bullets:但是“大蟒蛇”上写的是for bullet in bullets.copy():这两者有什么区别呢当我们在遍历一个列表的同时对其进行修改如添加、删除元素可能会导致程序出错或产生意外的结果。这是因为在遍历过程中Python会不断地更新列表的长度和元素的索引从而可能导致索引错误或遗漏某些元素。 而使用bullets.copy()创建了一个副本遍历的是这个副本对原列表的修改不会影响到副本从而避免了上述问题。虽然两种写法都能实现我们想要的目的但是明显第二种更加严谨、稳妥第一种也许不知道什么时候就会发生错误。 二、限制子弹数量 “大蟒蛇”中认为一般的游戏子弹都有限制我不记得我玩的游戏子弹有限制好像都是无限子弹最多对子弹的发射速度有限制我们还是按照书上来实践操作。这个功能应该不难实现只要在创建子弹之前加一个判断如果存在的子弹小于限制数就创建一个子弹并添加到bullets中如果不是就不做任何操作这个判断语句代码写在game_functions模块中但在这之前要先在settings模块设置一下最大子弹数量属性。 class Settings():def __init__(self):self.screen_width 800self.screen_height 600self.bg_color (220,220,220)self.ship_speed_factor 0.1self.bullet_speed_factor 0.3self.bullet_width 2self.bullet_hight 5self.bullet_color 60,60,60self.bullets_allowed 3
import sys
import pygame
from bullet import Bulletdef 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:if len(bullets)new_setting.bullets_allowed:new_bullet Bullet(new_setting,screen,ship)bullets.add(new_bullet)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):for event in pygame.event.get():if event.type pygame.QUIT:sys.exit()elif event.typepygame.KEYDOWN:check_keydown_events(event,new_setting,screen,ship,bullets)elif event.typepygame.KEYUP:check_keyup_events(event, ship)def update_screen(new_setting,screen,ship,bullets):screen.fill(new_setting.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()pygame.display.flip() 通过修改这两处代码每次屏幕上最多只有3发子弹 可以看出我一直在敲击空格键但是窗口内最多只有3发子弹。 三、继续重构代码 现在“大蟒蛇”又觉得主程序内容有点多了决定将判断删除子弹代码转移到game_functions中并创建函数update_bullets这样主函数只要调用update_bullets就行了update_bullets里代码就是照搬过来的没什么好说的。因为我们在判断按键是否为空格里又加了判断子弹数量因此我还需单独写一个函数fire_bullet()来存放判断子弹数量代码需要时直接调用使代码块看起来更简洁。 import sys
import pygame
from bullet import Bulletdef 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)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):for event in pygame.event.get():if event.type pygame.QUIT:sys.exit()elif event.typepygame.KEYDOWN:check_keydown_events(event,new_setting,screen,ship,bullets)elif event.typepygame.KEYUP:check_keyup_events(event, 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(bullets):bullets.update()for bullet in bullets.copy():if bullet.rect.bottom 0:bullets.remove(bullet)def update_screen(new_setting,screen,ship,bullets):screen.fill(new_setting.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()pygame.display.flip()
总结 截至目前玩家操作部分基本完成后面我将添加敌对的虫族以及用子弹消灭他们。