外星人大戰-----------------------------課後習題(從入門到實踐)第十三章

1.找一幅星星的圖像,並在屏幕上顯示一系列整齊排列的星星dom

先建立一個star類;ide

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#星星類
import pygame
from pygame.sprite import Sprite

class Star(Sprite):
    def __init__(self,ai_settings,screen):
        super().__init__()
        self.screen=screen
        self.ai_settings=ai_settings
        self.image=pygame.image.load('images/star.bmp')
        self.rect=self.image.get_rect()
        self.rect.x=self.rect.width
        self.rect.y=self.rect.height
        #存儲星星的準確位置
        self.x=float(self.rect.x)
    
    def blitme(self):
        self.screen.blit(self.image,self.rect)

設置類:idea

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#存儲做業例子的設置類

class Setting():
    def __init__(self):
        self.screen_width=800      #設置屏幕高度寬度,背景顏色
        self.screen_height=600
        self.bg_color=(230,230,230)

功能模塊:spa

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from star import Star

#檢測鼠標鍵盤事件
def check_events(screen):
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
       
#計算每行能夠放入多少個星星
def star_number_x(ai_settings,star_width):
    available_space_x=ai_settings.screen_width-2*star_width
    number_stars=int(available_space_x/(2*star_width))
    return number_stars

#計算能夠放入多少行
def star_number_rows(ai_settings,star_height):
    available_space_y=ai_settings.screen_height-2*star_height
    rows_number=int(available_space_y/(2*star_height))
    return rows_number

#建立一個星星
def creat_star(ai_settings,screen,stars,star_number,row_number):
    star=Star(ai_settings,screen)
    star_width=star.rect.width
    star.x=star_width+2*star_width*star_number
    star.rect.x=star.x
    star.rect.y=star.rect.height+2*star.rect.height*row_number
    stars.add(star)

#建立一羣星星
def creat_star_group(ai_settings,screen,stars):
    star=Star(ai_settings,screen)
    number_stars_x=star_number_x(ai_settings,star.rect.width)
    rows_number=star_number_rows(ai_settings,star.rect.height)
    for row_number in range(rows_number):
        for star_number in range(number_stars_x):
            creat_star(ai_settings,screen,stars,star_number,row_number)

#更新屏幕:
def update_screen(ai_settings,screen,stars):
    screen.fill(ai_settings.bg_color)
    stars.draw(screen)
    pygame.display.flip()

主程序:3d

#-*-coding:GBK-*-
#-*-coding:utf-8-*-

import sys     #退出時須要這個模塊
import pygame  #導入遊戲模塊
from setting import Setting    #導入設置類
from star import Star   #導入圖片類
from pygame.sprite import Group
import game_functions as gf  #導入功能模塊

def run_game():
    pygame.init()  #初始化,建立屏幕對象
    ai_settings=Setting()    #建立一個800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("13-1")   #對於這個窗口的命名

    stars=Group()
    gf.creat_star_group(ai_settings,screen,stars)


    "開始遊戲的主代碼循環"
    while True:
        gf.check_events(screen)
        gf.update_screen(ai_settings,screen,stars)


run_game()

運行主程序後,結果以下:code

2.隨機分佈星星對象

在1的基礎上:blog

修改star類:遊戲

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#星星類
#星星類
import pygame
from pygame.sprite import Sprite
from random import randint

class Star(Sprite):
    def __init__(self,ai_setings,screen):
        super().__init__()
        self.screen=screen
        self.random_number=randint(-10, 10)
        self.image=pygame.image.load('images/star.bmp')
        self.rect=self.image.get_rect()
        self.rect.x=self.rect.width+self.random_number
        self.rect.y=self.rect.height+self.random_number
    
    def blitme(self):
        self.screen.blit(self.image,self.rect)

修改功能模塊:事件

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from star import Star

#檢測鼠標鍵盤事件
def check_events(screen):
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
       
#計算每行能夠放入多少個星星
def star_number_x(ai_settings,star_width):
    available_space_x=ai_settings.screen_width-2*star_width
    number_stars=int(available_space_x/(2*star_width))
    return number_stars

#計算能夠放入多少行
def star_number_rows(ai_settings,star_height):
    available_space_y=ai_settings.screen_height-2*star_height
    rows_number=int(available_space_y/(2*star_height))
    return rows_number

#建立一個星星
def creat_star(ai_settings,screen,stars,star_number,row_number):
    star=Star(ai_settings,screen)
    star_width=star.rect.width
    star.x=star.rect.x+2*star.rect.x*star_number
    star.rect.x=star.x
    star.rect.y=star.rect.y+2*star.rect.y*row_number
    stars.add(star)

#建立一羣星星
def creat_star_group(ai_settings,screen,stars):
    star=Star(ai_settings,screen)
    number_stars_x=star_number_x(ai_settings,star.rect.width)
    rows_number=star_number_rows(ai_settings,star.rect.height)
    for row_number in range(rows_number):
        for star_number in range(number_stars_x):
            creat_star(ai_settings,screen,stars,star_number,row_number)

#更新屏幕:
def update_screen(ai_settings,screen,stars):
    screen.fill(ai_settings.bg_color)
    stars.draw(screen)
    pygame.display.flip()

 

運行主程序:

3.尋找一幅雨滴的圖像,並建立一系列整齊排列的雨滴,讓這些雨滴往下落,直到屏幕底端就會消失

設置類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#存儲做業例子的設置類

class Setting():
    def __init__(self):
        self.screen_width=800      #設置屏幕高度寬度,背景顏色
        self.screen_height=600
        self.bg_color=(200,230,230)

z增長一個雨滴類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#建立雨滴類
#雨滴類
import pygame
from pygame.sprite import Sprite


class Rain(Sprite):
	def __init__(self,ai_setings,screen):
		super().__init__()
		self.screen=screen
		self.rain_speed_factor=0.5
		self.image=pygame.image.load('images/rain.bmp')
		self.rect=self.image.get_rect()
		self.rect.x=self.rect.width
		self.rect.y=self.rect.height
		self.y=float(self.rect.y)
   
	def update(self):
		self.y+=self.rain_speed_factor
		self.rect.y=self.y
    
	def blitme(self):
		self.screen.blit(self.image,self.rect)

功能模塊:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from rain import Rain

#檢測鼠標鍵盤事件
def check_events(screen):
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
       
#計算每行能夠放入多少個雨滴
def rain_number_x(ai_settings,rain_width):
    available_space_x=ai_settings.screen_width-2*rain_width
    number_rains=int(available_space_x/(2*rain_width))
    return number_rains


#建立一個雨滴
def creat_rain(ai_settings,screen,rains,rain_number):
    rain=Rain(ai_settings,screen)
    rain_width=rain.rect.width
    rain.x=rain_width+2*rain_width*rain_number
    rain.rect.x=rain.x
    rains.add(rain)

#建立一羣雨滴
def creat_rain_group(ai_settings,screen,rains):
	rain=Rain(ai_settings,screen)
	number_rains_x=rain_number_x(ai_settings,rain.rect.width)
  
   
	for rain_number in range(number_rains_x):
		creat_rain(ai_settings,screen,rains,rain_number)

#更新雨滴位置
def update_rain(rains):
    rains.update()

#更新屏幕:
def update_screen(ai_settings,screen,rains):
    screen.fill(ai_settings.bg_color)
    rains.draw(screen)
    pygame.display.flip()

主程序以下:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-

import sys     #退出時須要這個模塊
import pygame  #導入遊戲模塊
from setting import Setting    #導入設置類
from rain import Rain   #導入圖片類
from pygame.sprite import Group
import game_functions as gf  #導入功能模塊

def run_game():
    pygame.init()  #初始化,建立屏幕對象
    ai_settings=Setting()    #建立一個800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("13-2")   #對於這個窗口的命名

    rains=Group()
    gf.creat_rain_group(ai_settings,screen,rains)


    "開始遊戲的主代碼循環"
    while True:
        gf.check_events(screen)
        gf.update_rain(rains)
        gf.update_screen(ai_settings,screen,rains)


run_game()

 

4.修改3的代碼,是的一行雨滴消失在屏幕底端,屏幕頂端又會出現新的雨滴

以3的代碼的基礎下,修改功能模塊:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from rain import Rain

#檢測鼠標鍵盤事件
def check_events(screen):
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
       
#計算每行能夠放入多少個雨滴
def rain_number_x(ai_settings,rain_width):
    available_space_x=ai_settings.screen_width-2*rain_width
    number_rains=int(available_space_x/(2*rain_width))
    return number_rains


#建立一個雨滴
def creat_rain(ai_settings,screen,rains,rain_number):
    rain=Rain(ai_settings,screen)
    rain_width=rain.rect.width
    rain.x=rain_width+2*rain_width*rain_number
    rain.rect.x=rain.x
    rains.add(rain)

#建立一羣雨滴
def creat_rain_group(ai_settings,screen,rains):
	rain=Rain(ai_settings,screen)
	number_rains_x=rain_number_x(ai_settings,rain.rect.width)
  
   
	for rain_number in range(number_rains_x):
		creat_rain(ai_settings,screen,rains,rain_number)

#更新雨滴位置

def update_rain(ai_settings,rains,screen):
	rains.update()
	screen_rect=screen.get_rect()
	for rain in rains.copy():
		if rain.rect.top>screen_rect.bottom:
			rains.remove(rain)
	if len(rains)==0:
		rains.empty()
		creat_rain_group(ai_settings,screen,rains)
    

#更新屏幕:
def update_screen(ai_settings,screen,rains):
    screen.fill(ai_settings.bg_color)
    rains.draw(screen)
    pygame.display.flip()

修改主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-

import sys     #退出時須要這個模塊
import pygame  #導入遊戲模塊
from setting import Setting    #導入設置類
from rain import Rain   #導入圖片類
from pygame.sprite import Group
import game_functions as gf  #導入功能模塊

def run_game():
    pygame.init()  #初始化,建立屏幕對象
    ai_settings=Setting()    #建立一個800*800的屏幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("13-4")   #對於這個窗口的命名

    rains=Group()
    gf.creat_rain_group(ai_settings,screen,rains)


    "開始遊戲的主代碼循環"
    while True:
        gf.check_events(screen)
        gf.update_rain(ai_settings,rains,screen)
        gf.update_screen(ai_settings,screen,rains)


run_game()

 

 

5.建立一個遊戲,在屏幕底端放置一個玩家能夠左右移動的角色,讓一個球出如今屏幕頂端,且水平位置是隨機的,讓這個球以固定的速度下落。若是角色與球發生碰撞,就讓球消失,每當角色抓到球,或者由於球抵達到屏幕底端而消失後,都建立一個新球

設置類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#存儲做業例子的設置類

class Setting():
	def __init__(self):
		self.screen_width=800      #設置屏幕高度寬度,背景顏色
		self.screen_height=600
		self.bg_color=(200,230,230)
        #圖片移動速度
		self.picture_speed_factor=0.8
		#星星降低速度
		self.star_speed_factor=0.9

圖片類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#建立圖片類
#建立圖片類
import pygame
class Picture(): 
	def __init__(self,screen,ai_settings):
		self.screen=screen
		self.ai_settings=ai_settings

     #圖片存在images文件夾下,名字是picture.bmp    
		self.image=pygame.image.load('images/picture.bmp')  
		self.rect=self.image.get_rect()
		self.screen_rect=screen.get_rect()
		self.moving_right=False
		self.moving_left=False   
     
     #設置屏幕底端
		self.rect.bottom=self.screen_rect.bottom
		self.rect.centerx=self.screen_rect.centerx	
		
		self.ship_place=float(self.rect.centerx)
		

	def update(self):
		if self.moving_right and self.rect.right<self.screen_rect.right:
			self.ship_place+=self.ai_settings.picture_speed_factor
		if self.moving_left and self.rect.left>0:
			self.ship_place-=self.ai_settings.picture_speed_factor
		self.rect.centerx=self.ship_place
   
	def blitme(self):
		self.screen.blit(self.image,self.rect)

星星類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#星星類
#星星類
import pygame
from pygame.sprite import Sprite
from random import randint

class Star(Sprite):
	def __init__(self,ai_settings,screen):
		super().__init__()
		self.screen=screen
		self.ai_settings=ai_settings
		self.screen_rect=screen.get_rect()
		self.image=pygame.image.load('images/star.bmp')
		self.rect=self.image.get_rect()
		self.rect.x=randint(0, self.screen_rect.right-self.rect.right)
		self.rect.y=0
		self.y=float(self.rect.y)

	def update(self):
		self.y+=self.ai_settings.star_speed_factor
		self.rect.y=self.y
    
	def blitme(self):
		self.screen.blit(self.image,self.rect)

功能模塊:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from star import Star

#對按鍵的響應
def check_keydown_events(event,picture):
	if event.key==pygame.K_RIGHT:
		picture.moving_right=True
	elif event.key==pygame.K_LEFT:
		picture.moving_left=True
 
#鬆開鍵盤的響應
def check_keyup_events(event,picture):
    if event.key==pygame.K_RIGHT:
        picture.moving_right=False
    elif event.key==pygame.K_LEFT:
        picture.moving_left=False

#檢測鼠標鍵盤事件
def check_events(screen,picture):
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit()
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,picture)
		elif event.type==pygame.KEYUP:
			check_keyup_events(event,picture)



#建立一個星星
def creat_star(ai_settings,screen,star):
	if len(star)==0:
		s=Star(ai_settings,screen)
		star.add(s)


#重建星星
def again_star(ai_settings,screen,star):
	star.empty()
	creat_star(ai_settings,screen,star)



#更新星星位置
def update_star(ai_settings,star,screen,picture):
	star.update()
	screen_rect=screen.get_rect()
	for s in star.copy():
		if s.rect.bottom==screen_rect.bottom:
			star.empty()
			again_star(ai_settings,screen,star)
		elif pygame.sprite.spritecollideany(picture,star):
			again_star(ai_settings,screen,star)
	


#更新屏幕:
def update_screen(ai_settings,screen,star,picture):
    screen.fill(ai_settings.bg_color)
    star.draw(screen)
    picture.blitme()
    pygame.display.flip()

主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-

import sys     #退出時須要這個模塊
import pygame  #導入遊戲模塊
from setting import Setting    #導入設置類
from star import Star   #導入圖片類
from picture import Picture
from pygame.sprite import Group
import game_functions as gf  #導入功能模塊

def run_game():
	pygame.init()  #初始化,建立屏幕對象
	ai_settings=Setting()    #建立一個800*800的屏幕
	screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
	pygame.display.set_caption("13-4")   #對於這個窗口的命名
	picture=Picture(screen,ai_settings)
	star=Group()
	gf.creat_star(ai_settings,screen,star)


    #"開始遊戲的主代碼循環"
	while True:
		gf.check_events(screen,picture)
		picture.update()
		gf.update_star(ai_settings,star,screen,picture)
		gf.update_screen(ai_settings,screen,star,picture)


run_game()

 輸出界面:

 

 

6.完成5的代碼,跟蹤玩家有多少次未將球接着,在未接着球的次數到達三次後,結束遊戲。

新建一個統計信息類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#建立一個統計信息類
class GameStats():
	def __init__(self):
		self.game_active=True
		self.loss=0
	def check_active(self):
		if self.loss == 3:
			self.game_active = False

再修改下功能:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#功能模塊,包括按鍵的設置檢測,退出遊戲設置

import pygame
import sys
from star import Star

#對按鍵的響應
def check_keydown_events(event,picture):
	if event.key==pygame.K_RIGHT:
		picture.moving_right=True
	elif event.key==pygame.K_LEFT:
		picture.moving_left=True
 
#鬆開鍵盤的響應
def check_keyup_events(event,picture):
    if event.key==pygame.K_RIGHT:
        picture.moving_right=False
    elif event.key==pygame.K_LEFT:
        picture.moving_left=False

#檢測鼠標鍵盤事件
def check_events(screen,picture):
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit()
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,picture)
		elif event.type==pygame.KEYUP:
			check_keyup_events(event,picture)



#建立一個星星
def creat_star(ai_settings,screen,star):
	if len(star)==0:
		s=Star(ai_settings,screen)
		star.add(s)


#重建星星
def again_star(ai_settings,screen,star):
	star.empty()
	creat_star(ai_settings,screen,star)



#更新星星位置
def update_star(ai_settings,star,screen,picture,stats):
	star.update()
	screen_rect=screen.get_rect()
	for s in star.copy():
		if s.rect.bottom==screen_rect.bottom:
			star.empty()
			stats.loss+=1
			again_star(ai_settings,screen,star)
		elif pygame.sprite.spritecollideany(picture,star):
			again_star(ai_settings,screen,star)
	


#更新屏幕:
def update_screen(ai_settings,screen,star,picture):
    screen.fill(ai_settings.bg_color)
    star.draw(screen)
    picture.blitme()
    pygame.display.flip()

 主程序:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-

import sys     #退出時須要這個模塊
import pygame  #導入遊戲模塊
from setting import Setting    #導入設置類
from star import Star   #導入圖片類
from picture import Picture
from pygame.sprite import Group
import game_functions as gf  #導入功能模塊
from game_stats import GameStats

def run_game():
	pygame.init()  #初始化,建立屏幕對象
	ai_settings=Setting()    #建立一個800*800的屏幕
	screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
	pygame.display.set_caption("13-4")   #對於這個窗口的命名
	picture=Picture(screen,ai_settings)
	star=Group()
	gf.creat_star(ai_settings,screen,star)
	stats=GameStats()

    #"開始遊戲的主代碼循環"
	while True:
		gf.check_events(screen,picture)
		stats.check_active()
		if stats.game_active:
			picture.update()
			gf.update_star(ai_settings,star,screen,picture,stats)
		gf.update_screen(ai_settings,screen,star,picture)


run_game()

輸出結果:當三次未接到星星時。遊戲結束: