《Python从入门到实践》:13-6练习题

import pygame
import sys
from spaceship import Spaceship
from spacebullet import Spacebullet
from spacealien import Spacealien
from time import sleep
from spaceship_stats import GameStats

class SpaceShipMoving:
	def __init__(self):
		pygame.init()
		self.screen=pygame.display.set_mode((1000,600))
		self.bg_color=(170,200,225)
		pygame.display.set_caption("小飞船")
		self.stats=GameStats(self)
		self.spaceship=Spaceship(self)
		self.bullets=pygame.sprite.Group()
		self.aliens=pygame.sprite.Group()
		self._create_fleet()

	def run_game(self):
		while True:
			self._check_event()
			if self.stats.game_active:
				self.spaceship.update()
				self.bullets.update()
				self._update_bullets()
				self._update_screen()
				self.aliens.update()
				self._update_alien()


	def _check_event(self):
		for event in pygame.event.get():
			if event.type==pygame.QUIT:
				sys.exit()
			elif event.type==pygame.KEYDOWN:
				self._check_down_event(event)
			elif event.type==pygame.KEYUP:
				self._check_up_event(event)

	def _check_down_event(self,event):
		if event.key==pygame.K_UP:
			self.spaceship.moving_up=True
		if event.key==pygame.K_DOWN:
			self.spaceship.moving_down=True	
		if event.key==pygame.K_SPACE:
			self._fire_bullet()


	def _check_up_event(self,event):
		if event.key==pygame.K_UP:
			self.spaceship.moving_up=False
		if event.key==pygame.K_DOWN:
			self.spaceship.moving_down=False

	def _fire_bullet(self):
		if len(self.bullets)<4:
			new_bullet=Spacebullet(self)
			self.bullets.add(new_bullet)
	
	def _update_bullets(self):
		for bullet in self.bullets.copy():
			if bullet.rect.right>self.spaceship.screen_rect.right:
				self.bullets.remove(bullet)
				#print(len(self.bullets))
			collisions=pygame.sprite.groupcollide(self.bullets,self.aliens,True,True)

	def _check_alien_left(self):
		screen_rect=self.screen.get_rect()
		for alien in self.aliens.sprites():
			if alien.rect.left<=screen_rect.left:
				self._ship_hit()
				break

	def _ship_hit(self):
		if self.stats.ship_left>0:
			self.stats.ship_left -= 1
			self.bullets.empty()
			self.aliens.empty()
			self._create_fleet()
			self.spaceship.center_ship()
			sleep(0.5)
		else:
			self.stats.game_active=False


	def _create_fleet(self):
		alien=Spacealien(self)
		alien_width,alien_height=alien.rect.size
		ship_width=self.spaceship.rect.width
		space_available_x=1000-ship_width-alien_width*4
		alien_number=space_available_x//(alien_width*2)
		space_available_y=600-alien_height*2
		row_number=space_available_y//(alien_height*2)
		for row in range(row_number):
			for number in range(alien_number):
				self._create_aliens(number,row)

	def _create_aliens(self,number,row):
		alien=Spacealien(self)
		ship_width=self.spaceship.rect.width
		alien_width,alien_height=alien.rect.size
		alien.x=ship_width+alien_width*7+(alien_width*2)*number
		alien.rect.x=alien.x
		alien.y=alien.rect.height+alien.rect.height*2*row
		alien.rect.y=alien.y
		self.aliens.add(alien)

	def _update_alien(self):
		if pygame.sprite.spritecollideany(self.spaceship,self.aliens):
				self._ship_hit()
		self._check_alien_left()
		if not self.aliens:
			self.bullets.empty()
			self._create_fleet()

	def _update_screen(self):
		self.screen.fill(self.bg_color)#先填充颜色再往上面摆东西
		self.spaceship.blitme()
		self.aliens.draw(self.screen)
		for bullet in self.bullets.sprites():
			bullet.draw_bullet()
		pygame.display.flip()



if __name__ == "__main__":
	s=SpaceShipMoving()
	s.run_game()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值