Pythone入門(mén)到實(shí)踐-學(xué)習(xí)筆記-Day5

實(shí)戰(zhàn)項(xiàng)目:大戰(zhàn)外星人

pygame是跨平臺(tái)Python模塊醇锚,專(zhuān)為電子游戲設(shè)計(jì)续膳,包含圖像、聲音胖替,建立在SDL(Simple DirectMedia Layer)基礎(chǔ)上

一研儒、pygame各模塊和功能

在某些平臺(tái)下,有些功能可能沒(méi)有独令,可用None測(cè)試

if pygame.cdrom is None:
  print "pygame.cdrom not available"
模塊名 功能
pygame.cdrom 訪問(wèn)光驅(qū)
pygame.cursors 加載光標(biāo)
pygame.display 訪問(wèn)顯示設(shè)備
pygame.draw 繪制形狀端朵、線和點(diǎn)
pygame.event 管理事件
pygame.font 使用字體
pygame.image 加載和存儲(chǔ)圖片
pygame.joystick 使用游戲手柄或類(lèi)似設(shè)置
pygame.key 讀取鍵盤(pán)按鍵
pygame.mixer 聲音
pygame.mouse 鼠標(biāo)
pygame.movie 播放視頻
pygame.music 播放音頻
pygame.overlay 訪問(wèn)高級(jí)視頻疊加
pygame.rect 管理矩形區(qū)域
pygame.sndarray 操作聲音數(shù)據(jù)
pygame.sprite 操作移動(dòng)圖像
pygame.surface 管理圖像和屏幕
pygame.surfarray 管理點(diǎn)陣圖像數(shù)據(jù)
pygame.time 管理時(shí)間和幀信息
pygame.transform 綻放和移動(dòng)圖像

二、創(chuàng)建Pygame窗口

import sys
import pygame
def run_game():
  pygame.init()
  screen = pygame.display.set_mode((1200,800))
  pygame.display.set_caption("大戰(zhàn)外星人")
  bg_color = (230,230,230)
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        sys.exit()
  screen.fill(bg_color)
  pygame.display.flip()

run_game()

pygame.init():初始化游戲并創(chuàng)建一個(gè)屏幕對(duì)像
screen = pygame.display.set_mode((1200,800)):創(chuàng)建一個(gè)顯示窗口燃箭,游戲的所有圖形元素都獎(jiǎng)在其中繪制冲呢,(1200,800)元組實(shí)參決定窗口的尺寸(寬1200高800)
pygame.display.set_caption("大戰(zhàn)外星人"):設(shè)置窗口標(biāo)題
pygame.event.get():接收用戶(hù)輸入事件(按鍵和移動(dòng)鼠標(biāo))
screen.fill(bg_color):設(shè)置背景顏色
pygame.display.flip():命令Pygame讓最近繪制的屏幕可見(jiàn),不斷刷新屏幕招狸,以顯示元素的位置敬拓,并在原來(lái)的位置隱藏元素,從而營(yíng)造平滑移動(dòng)的效果裙戏。

三乘凸、創(chuàng)建飛船

加載一幅圖像,再使用Pygame方法blit()繪制

import pygame
class Ship():
  def __init__(self, screen):
    self.screen = screen
    self.image = pygame.image.load('images/ship.bmp')
    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()

    self.rect.centerx = self.screen_rect.centerx
    self.rect.bottom = self.screcn_rect.bottom

  def blitme(self):
    self.screen.blit(self.image, self.rect)

self.image = pygame.image.load() :加載飛船圖片累榜,并存儲(chǔ)到self.image中
get_rect():獲取圖像的屬性rect营勤,python能夠像處理矩形(rect對(duì)象)一樣處理圖像,處理rect對(duì)象時(shí)壹罚,可使用矩形四角(left,right,bottom,top)冀偶、坐標(biāo)(x,y)和中心的x(centerx)和y(centery)坐標(biāo),來(lái)指矩形的位置渔嚷。
self.screen.blit(self.image, self.rect):根據(jù)rect指定的位置將圖像繪制到飛屏幕上进鸠。

四、駕駛飛船

def check_events(ship):
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      exit()
  elif event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RIGHT:
      ship.rect.centerx += 1
    elif event.key == pygame.K_LEFT:
      ship.rect.centerx -= 1

pygame.KEYDOWN:按下形病;pygame.KEYUP:彈起
** pygame.K_RIGHT:向右鍵客年; pygame.K_LEFT**:向左鍵

擴(kuò)展飛船功能:

1霞幅、允許不斷移動(dòng)
2、限制飛船的活動(dòng)范圍(不能超出屏幕)

五量瓜、飛船開(kāi)炮

1司恳、炮彈

class Bullet(Sprite):
  def __init__(self, ai_settings, screen, ship):
    super(Bullet,self).__init__()
    self.screen = screen
    self.rect = pygame.rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
    self.rect.centerx = ship.rect.centerx
    self.rect.top = ship.rect.top
    self.y = float(self.rect.y)
    self.color = ai_settings.bullet_color
    self.speed_factor = ai_settings.bullet_speed_factor  

  def update(self):
    self.y -= self.speed_factor
    self.rect.y = self.y

  def draw_bullet(self):
    pygam.draw.rect(self.screen, self.color, self.rect)

super(Bullet,self).init():Python2.7語(yǔ)法,也適用Python3绍傲,但Python3可以簡(jiǎn)寫(xiě)為:super()._init_()
pygame.rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height):創(chuàng)建矩形扔傅,第一個(gè)實(shí)參指定左上角x坐標(biāo),第二實(shí)參指定左上角y坐標(biāo)烫饼,第三實(shí)參指定矩形的寬猎塞,第四實(shí)參指定矩形的高度
self.rect.centerx = ship.rect.centerx和self.rect.top = ship.rect.top:調(diào)整矩形的位置
def update(self):向上移動(dòng)炮彈
pygam.draw.rect(self.screen, self.color, self.rect):使用self.color填充表示子彈的rect,并繪制到screen

2. 創(chuàng)建外星人

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
  def __init__(selft, ai_settings, screen):
    super().__init__()
    self.screen = screen
    self.ai_settings = ai_settings
    self.image = pygame.image.load('image/alien.bmp')

    self.rect = self.image.get_rect()
    self.rect.x = self.rect.width
    selft.rect.y = self.rect.height
    self.x = float(self.rect.x)

  def upate(self):
    self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
    self.rect.x = self.x

  def check_edges(self):
    screen_rect = self.screen.get_rect()
    if self.rect.right >= screen.right:
      return True
    elif self.rect.left <= 0:
      return True      

  def blitme(self):
    self.screen.blit(self.image, self.rect)  

外星人默認(rèn)在屏幕左上方位置杠纵,并向右邊移動(dòng)荠耽,除了位置不同外,大部分與Ship類(lèi)相似
fleet_direction:控制外星人向左向右移動(dòng)比藻,如果到最右邊铝量,向下移動(dòng)并向左邊移動(dòng),如果到最左邊银亲,向下移動(dòng)并向右邊移動(dòng)
check_edges:檢查外星人是否到屏幕邊緣

3.創(chuàng)建多行外星人

def create_fleet(ai_settings, screen, ship, aliens):
  alien = Alien(ai_settings,screen)
  alien_widht = alien.rect.widht
  availabe_width = screen.width -(2 * alien_width)
  number_alien_x = available_width /(2 * alien_widht)
  alien_height = alien.rect.height 
  availabled_height = aline.screen.height
 - (3 * alien_height) - ship.height
  number_alien_y = availabled_height / (2 *availabled_height )
  for m in range(number_alien_y):
    form n in range(number_alien_x):
      aline = Alien(ai_settings, screen)
      alien.x = aline_width +2 * alien_widht * n
      alien.y = aline_height + 2 * alien_height* m  
      alien.rect.x = alien.x
      alien.rect.y = alien.y
      aliens.add(alien)

4.射殺外星人

collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)

遍歷組子彈組和外星人組慢叨,當(dāng)有子彈和外星人的rect重疊時(shí),groupcollid()在它返回的字典中添加一個(gè)鍵值對(duì)务蝠,兩個(gè)實(shí)參True告訴python刪除發(fā)碰撞的子彈和外星人

5. 結(jié)束游戲

創(chuàng)建游戲統(tǒng)計(jì)信息類(lèi):

class GameStats():
   def __init__(self, ai_settings):
    self.ai_setting = ai_settings
    self.game_active = True
    self.reset_stats()
  
  def reset_stats(self):
    self.ship_left = self.ai_settings.ship_limit

外星人撞到飛船或外得人到達(dá)屏幕底部時(shí)拍谐,需結(jié)束游戲
pygame.sprite.spritecollideany(ship,alines):檢查外星人和飛船是否相撞,檢查編組是否有成員開(kāi)發(fā)業(yè)有靈發(fā)生碰撞请梢,并在找到與精靈發(fā)生碰撞的成員后停止遍歷,并返回找到的第一個(gè)發(fā)生碰撞的外星人力穗,如果沒(méi)有發(fā)生碰撞毅弧,返回None

def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
    
    aliens.empty()
    bullets.empty()

    create_fleet(ai_settings, screen, ship, aliens)
    ship.center_ship()

    if stats.ship_left > 0:
        stats.ship_left -= 1
        sleep(0.5)
    else:
        stats.game_active = False

def check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets):
    screen_rect = screen.get_rect()
    for alien in aliens.sprites():
        if alien.rect.bottom >= screen_rect.bottom:
            ship_hit(ai_settings, stats,screen, ship,aliens,bullets)
            break

第十四章 記分

添加Play按鈕

import pygame.font

class Button():
    def __init__(self,ai_settings, screen, msg):
        self.screen = screen
        self.screct_rect = screen.get_rect()

        self.width, self.height = 200,50
        self.color = (0,250,0)
        self.text_color = (255,255,255)
        self.font = pygame.font.SysFont(None,48)

        self.rect = pygmae.Rect(0,0,self.width,self.height)
        self.rect.center = self.screen_rect.center

        self.prep_msg(msg)
  def prep_msg(self, msg):
    self.msg_img = self.font.render(msg, True, self.text_color,self.color)
    self.msg_image_rect = self.msg_img.get_rect()
    self.msg_image_rect.center = self.rect.center

  def draw_button(self):
    self.screen.fill(self.color,self.rect)
    self.screen.blit(self.msg_img,self.msg_image_rect)

pygame.font讓pygame能夠?qū)⑽谋句秩镜狡聊簧?br> **pygame.font.SysFont(None,48)
**:指定使用什么字體來(lái)渲染文本,實(shí)參None讓python使用默認(rèn)字體当窗,48指定文本的字號(hào)
font.render():將存儲(chǔ)在msg中的文本轉(zhuǎn)換為圖像够坐,然后將圖像存儲(chǔ)中msg_img中,實(shí)參True指定開(kāi)啟反鋸齒功能崖面,剩下兩個(gè)分別是文本顏色和背景色
self.screen.fill():表示按鈕的矩形元咙,再調(diào)用一次screen.blit(),并向它傳遞一幅圖像與該圖像的關(guān)聯(lián)和rect對(duì)象

按鈕點(diǎn)擊事件

def check_play_button(ai_settings,screen, stats,ship,bullets,aliens, play_button,mouse_x,mouse_y):
    
    button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
    if button_clicked and not stats.game_active:
        pygame.mouse.set_visible(False)
        stats.game_active = True
        stats.reset_stats()
        aliens.empty()
        bullets.empty()

        create_fleet(ai_settings, screen, ship, aliens)
        ship.center_ship()

**pygame.mouse.set_visible(False)
**:隱藏鼠標(biāo)

記分

顯示飛船數(shù)prep_ship()巫员,當(dāng)前得分prep_score()庶香,當(dāng)前等級(jí)prep_level()

import pygame.font
from ship import Ship
from pygame.sprite import Group

class Scoreboard():
    def __init__(self, ai_settings, screen, stats):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None,48)

        self.prep_score()
        self.prep_level()
        self.prep_ship()

    def prep_score(self):
        score_str = 'Scroe:' + str(self.stats.score)
        self.msg_img = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)
        self.msg_image_rect = self.msg_img.get_rect()
        self.msg_image_rect.right = self.screen_rect.right - 20
        self.msg_image_rect.top = 20

    def prep_level(self):
        level_str = 'Level:'+str(self.stats.play_level)
        self.level_img = self.font.render(level_str,True, self.text_color,self.ai_settings.bg_color)
        self.level_img_rect = self.level_img.get_rect()
        self.level_img_rect.right = self.screen_rect.right - 20
        self.level_img_rect.top = 50

    def prep_ship(self):
        self.ships = Group()
        for num in range(self.stats.ship_left):
            ship = Ship(self.ai_settings, self.screen)
            ship.rect.x = 10 + num * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)

附代碼:

settings類(lèi)

class Settings():
    """存儲(chǔ)所有設(shè)置的類(lèi)"""
    def __init__(self):
        """初始化游戲的設(shè)置"""
        #屏幕設(shè)置
        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (230,230,230)
        
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 60,60,60
        self.bullets_allowed = 100
        self.space_x = 1

        self.fleet_direction=1
        self.fleet_drop_speed=20

        self.speedup_scale =1.1
        self.ship_limit = 3
        self.init_dynamic_settings()        

    def init_dynamic_settings(self):
        self.bullet_speed_factor = 1
        self.alien_speed_factor = 1
        self.ship_speed_factor = 1        

    def increase_speed(self):
        self.ship_speed_factor *= self.speedup_scale
        self.bullet_speed_factor *= self.speedup_scale
        self.alien_speed_factor *= self.speedup_scale

ship類(lèi)

import pygame
from pygame.sprite import Sprite

class Ship(Sprite):

    def __init__(self,ai_settings,screen):
        super().__init__()
        """"初始化飛船并設(shè)置其初始位置"""
        self.screen = screen
        self.ai_settings = ai_settings

        #加載飛船圖像并獲取基外接矩形
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        #將每艘飛船放在屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        # 移動(dòng)標(biāo)志
        self.moving_right = False
        self.moving_left = False
        # 一直開(kāi)火
        self.keeping_fire = False

    def  update(self):
        """根據(jù)移動(dòng)標(biāo)志調(diào)整飛船的位置 """
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.centerx += self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left > 0:
            self.rect.centerx -= self.ai_settings.ship_speed_factor

    def blitme(self):
        """在指定位置繪制飛船"""
        self.screen.blit(self.image,self.rect)

    def center_ship(self):
        self.rect.centerx = self.screen_rect.centerx

Bullet類(lèi)

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):
    """"一個(gè)對(duì)飛船發(fā)射子彈進(jìn)行管理的類(lèi)"""

    def __init__(self,ai_settings, screen, ship):
        """"在飛船所處的位置創(chuàng)建一個(gè)子彈對(duì)象"""
        super(Bullet, self).__init__()
        self.screen = screen

        self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
        self.rect.centerx = ship.rect.centerx
        self.rect.top = ship.rect.top

        self.y =  float(self.rect.y)
        self.color = ai_settings.bullet_color
        self.speed_factor = ai_settings.bullet_speed_factor
        
    def update(self):
        """向上移動(dòng)子彈"""
        #更新表示子彈的小數(shù)值
        self.y -= self.speed_factor
        #更新表示子彈的rect的位置
        self.rect.y = self.y       

    def draw_bullet(self):
        """在屏幕上繪制子彈"""
        pygame.draw.rect(self.screen, self.color, self.rect)

Alien類(lèi)

import pygame

from pygame.sprite import Sprite

class Alien(Sprite):

    def __init__(self,ai_settings,screen):
        super(Alien,self).__init__();
        self.screen = screen
        self.ai_settings = ai_settings

        self.image = pygame.image.load('images/alien.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 update(self):
        self.x += (self.ai_settings.alien_speed_factor *
                    self.ai_settings.fleet_direction)
        self.rect.x = self.x

    def blitme(self):
        self.screen.blit(self.image,self.rect)

    def check_edges(self):
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right or self.rect.left <= screen_rect.left :
            return True
        else:
            return False

公共控制模塊

import sys
import time

import pygame
from time import sleep

from bullet import Bullet
from alien import Alien

def check_events(ai_settings,stats, screen,ship,bullets,aliens,play_button):
    """響應(yīng)按鍵和鼠標(biāo)事件"""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_down_events(event, ai_settings, screen, ship, bullets)               
        elif event.type == pygame.KEYUP:
            check_up_events(event, ai_settings, screen, ship, bullets)
        elif event.type == pygame.MOUSEBUTTONDOWN:
            mouse_x,mouse_y = pygame.mouse.get_pos()
            check_play_button(ai_settings,screen,stats,ship,bullets,aliens, play_button,mouse_x,mouse_y)


def check_down_events(event,ai_settings,screen,ship,bullets):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        ship.moving_left = True
    elif event.key == pygame.K_SPACE:
        ship.keeping_fire = True
        fire_bullet(ai_settings, screen, ship, bullets)
    
def check_up_events(event, ai_settings, screen, ship, bullets):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        ship.moving_left = False
    elif event.key == pygame.K_SPACE:
        ship.keeping_fire = False

def update_screen(ai_settings, stats, screen, ship, aliens, bullets, play_button, sb):
    """更新屏幕上的圖像,并切換到新屏幕"""
    # 重繪屏幕
    screen.fill(ai_settings.bg_color)    
        
    # 在飛船和外星人后面重繪所有子彈
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    
    ship.blitme()
    aliens.draw(screen)
    sb.show_score_board()
    
    if not stats.game_active:
        play_button.draw_button()
     # 讓最近繪制的屏幕可見(jiàn)
    pygame.display.flip()

def update_bullets(ai_settings,screen, ship, aliens, bullets,stats, sb):
    bullets.update()
    
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    collissions = pygame.sprite.groupcollide(bullets, aliens ,True, True)
    if collissions:
        stats.score += 1
        sb.prep_score()
    if len(aliens) == 0:
        stats.play_level += 1
        sb.prep_level()
        bullets.empty()
        
        ai_settings.increase_speed()
        create_fleet(ai_settings,screen,ship,aliens)
        

def fire_bullet(ai_settings, screen, ship, bullets):
    if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings, screen, ship)        
        bullets.add(new_bullet)


def get_number_aliens_x(ai_settings, alien_width):
    available_space_x = ai_settings.screen_width - 2 * alien_width
    number_aliens_x = int(available_space_x / (2 * alien_width))
    return number_aliens_x

def get_number_rows(ai_settings, ship_height, alien_height):
    available_space_y = ai_settings.screen_height - 3 * alien_height - ship_height
    number_rows = int(available_space_y /(2 * alien_height))
    return number_rows

def create_alien(ai_settings, screen, aliens, alien_number, row_number):
    alien = Alien(ai_settings, screen)
    alien.x = alien.rect.width + 2 * alien.rect.width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    aliens.add(alien)

def create_fleet(ai_settings, screen, ship, aliens):    
    alien = Alien(ai_settings, screen)
    number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
    number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)

    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(ai_settings, screen, aliens, alien_number, row_number)
        

def update_aliens(ai_settings,stats,screen,ship,aliens, bullets,sb):
    check_fleet_edges(ai_settings, aliens)
    aliens.update()
    if pygame.sprite.spritecollideany(ship, aliens):
        ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb)
    check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb)

def check_fleet_edges(ai_settings, aliens):
    for alien in aliens.sprites():
        if alien.check_edges():
            change_fleet_direction(ai_settings, aliens)
            break

def change_fleet_direction(ai_settings, aliens):
    for alien in aliens.sprites():
        alien.rect.y += ai_settings.fleet_drop_speed
    ai_settings.fleet_direction *= -1

def ship_hit(ai_settings, stats, screen, ship, aliens, bullets,sb):    
    aliens.empty()
    bullets.empty()

    create_fleet(ai_settings, screen, ship, aliens)
    ship.center_ship()     

    if stats.ship_left > 0:
        stats.ship_left -= 1
        sb.prep_ship()
        sleep(0.5)
    else:        
        stats.game_active = False
        pygame.mouse.set_visible(True)

def check_alien_bottom(ai_settings, stats, screen, ship, aliens, bullets,sb):
    screen_rect = screen.get_rect()
    for alien in aliens.sprites():
        if alien.rect.bottom >= screen_rect.bottom:
            ship_hit(ai_settings, stats,screen, ship,aliens,bullets,sb)
            break

def check_play_button(ai_settings,screen, stats,ship,bullets,aliens, play_button,mouse_x,mouse_y):
    
    button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
    if button_clicked and not stats.game_active:
        pygame.mouse.set_visible(False)
        stats.game_active = True
        stats.reset_stats()
        aliens.empty()
        bullets.empty()

        create_fleet(ai_settings, screen, ship, aliens)
        ship.center_ship()

Button類(lèi)

import pygame.font

class Button():
    def __init__(self,ai_settings, screen, msg):
        self.screen = screen
        self.screen_rect = screen.get_rect()

        self.width, self.height = 200,50
        self.color = (0,250,0)
        self.text_color = (255,255,255)
        self.font = pygame.font.SysFont(None,48)

        self.rect = pygame.Rect(0,0,self.width,self.height)
        self.rect.center = self.screen_rect.center

        self.prep_msg(msg)       

    def prep_msg(self, msg):
        self.msg_img = self.font.render(msg, True, self.text_color,self.color)
        self.msg_image_rect = self.msg_img.get_rect()
        self.msg_image_rect.center = self.rect.center

    def draw_button(self):
        self.screen.fill(self.color,self.rect)
        self.screen.blit(self.msg_img,self.msg_image_rect)

記分類(lèi)

import pygame.font
from ship import Ship
from pygame.sprite import Group

class Scoreboard():
    def __init__(self, ai_settings, screen, stats):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None,48)

        self.prep_score()
        self.prep_level()
        self.prep_ship()

    def prep_score(self):
        score_str = 'Scroe:' + str(self.stats.score)
        self.msg_img = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)
        self.msg_image_rect = self.msg_img.get_rect()
        self.msg_image_rect.right = self.screen_rect.right - 20
        self.msg_image_rect.top = 20

    def prep_level(self):
        level_str = 'Level:'+str(self.stats.play_level)
        self.level_img = self.font.render(level_str,True, self.text_color,self.ai_settings.bg_color)
        self.level_img_rect = self.level_img.get_rect()
        self.level_img_rect.right = self.screen_rect.right - 20
        self.level_img_rect.top = 50

    def prep_ship(self):
        self.ships = Group()
        for num in range(self.stats.ship_left):
            ship = Ship(self.ai_settings, self.screen)
            ship.rect.x = 10 + num * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)

    def show_score_board(self):
        #self.screen.fill(self.text_color,self.rect)
        self.screen.blit(self.msg_img,self.msg_image_rect)
        self.screen.blit(self.level_img,self.level_img_rect)
        self.ships.draw(self.screen)

游戲狀態(tài)類(lèi)

class GameStats():
    def __init__(self, ai_settings):
        self.ai_settings = ai_settings
        self.reset_stats()
        self.game_active = False
        self.play_level = 1
        self.reset_stats()
        
  
    def reset_stats(self):
        self.ship_left = self.ai_settings.ship_limit
        self.score = 0

主程序

import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from gamestats import GameStats
from button import Button
from scoreboard import Scoreboard
import game_functions as gf

def run_game():
    # 初始化背景設(shè)置
    pygame.init()

    ai_settings=Settings()
    stats = GameStats(ai_settings) 
    
    # 創(chuàng)建顯示窗口
    screen = pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
    # 設(shè)置窗口標(biāo)題
    pygame.display.set_caption('Alien Invasion')
    sb = Scoreboard(ai_settings,screen,stats)    

    #創(chuàng)建一艘飛船
    ship = Ship(ai_settings, screen)
    play_button = Button(ai_settings, screen, 'Play')

    bullets = Group()
    aliens = Group()
    while True:
        # 處理事件
        gf.check_events(ai_settings,stats, screen,ship,bullets,aliens,play_button)

        if stats.game_active:
            ship.update()        
            gf.update_aliens(ai_settings, stats, screen,ship,aliens, bullets,sb)        
            gf.update_bullets(ai_settings,screen, ship, aliens,bullets,stats,sb)
            
        gf.update_screen(ai_settings,stats,screen,ship,aliens,bullets,play_button,sb)

run_game()

總結(jié)

1简识、屏幕創(chuàng)建

pygame.init()#初始化
screen = pygame.display.set_mode(width, height) #設(shè)置尺寸
screen_rect = screen.get_rect() #獲取屏幕矩形位置
pygame.display.set_caption('xx') #設(shè)置標(biāo)題
screen.fill(bg_color) #(230,230,230)
pygame.display.flip()# 讓最近繪制的屏幕可見(jiàn)

2赶掖、響應(yīng)事件(鍵盤(pán)鼠標(biāo))

#捕捉所有事件
for event in pygame.event.get():
  #按下
  if event.type == pygame.KEYDOWN:
    #按下什么鍵
    if event.key = pygame.K_RIGHT:
    elif event.key == pygame.K_LEFT:
 #彈起
  elif event.type == pygame.KEYUP:
#鼠標(biāo)按下
  elif event.type == pygame.MOUSEDONW:    

3感猛、讀取圖片并顯示到屏幕

image = pygame.image.load('image_path') #從文件讀取圖片
img_rect = image.get_rect()
#定位
img_rect.centerx = screen_rect.cetnerx
img_rect.bottom = screen_rect.bottom
#獲取長(zhǎng)高度
img_width = img_rect.width
img_height = img_rect.height
#按指定位置顯示到屏幕
screen.blit(image,img_rect)

4、顯示按鈕奢赂,并響應(yīng)按下操作

#按鈕背景
self.width,self.height = 200,50
self.bg_color = (0,250,0)
self.rect = pygame.Rect(0,0,self.width,self.height)
self.screen.fill(self.bg_color,self.rect)

#按鈕字體字號(hào)
self.text_color = (255, 255, 255)
self.font = pygame.font.SysFont(None,48)
#將文本轉(zhuǎn)換為圖像
btn_img= self.font.render(str,True, self.text_color, self.bg_color )
btn_rect = btn_img.get_rect()
btn_rect .center = self.rect.center
self.screen.blit(btn_img,btn_rect )

#按下
#獲取鼠標(biāo)位置
mouse_x,mouse_y = pygame.mouse.get_pos()
#檢查是否按在按鈕上面
clicked = play_button.rect.collidepoint(mouse_x,mouse_y)

5陪白、顯示文字
self.font = pygame.font.SysFont(None,48)
text_img = self.font.render(text, True,self.text_color, self.bg_color)
text_rect = text_img.get_rect()
screen.blit(text_img,text_rect)

6、pygame方法

#檢查精靈和精精靈編組是否相撞
pygame.sprite.spritecollideany(ship,aliens)
#刪除相撞的物體膳灶,返回鍵值對(duì)
collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咱士,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轧钓,更是在濱河造成了極大的恐慌序厉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聋迎,死亡現(xiàn)場(chǎng)離奇詭異脂矫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)霉晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)庭再,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人牺堰,你說(shuō)我怎么就攤上這事拄轻。” “怎么了伟葫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵恨搓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筏养,道長(zhǎng)斧抱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任渐溶,我火速辦了婚禮辉浦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茎辐。我一直安慰自己宪郊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拖陆。 她就那樣靜靜地躺著弛槐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪依啰。 梳的紋絲不亂的頭發(fā)上乎串,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音速警,去河邊找鬼灌闺。 笑死艰争,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桂对。 我是一名探鬼主播甩卓,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蕉斜!你這毒婦竟也來(lái)了逾柿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宅此,失蹤者是張志新(化名)和其女友劉穎机错,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體父腕,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弱匪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了璧亮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萧诫。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枝嘶,靈堂內(nèi)的尸體忽然破棺而出帘饶,到底是詐尸還是另有隱情,我是刑警寧澤群扶,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布及刻,位于F島的核電站,受9級(jí)特大地震影響竞阐,放射性物質(zhì)發(fā)生泄漏缴饭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一骆莹、第九天 我趴在偏房一處隱蔽的房頂上張望颗搂。 院中可真熱鬧,春花似錦汪疮、人聲如沸峭火。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纺且,卻和暖如春盏道,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背载碌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工猜嘱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衅枫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓朗伶,卻偏偏與公主長(zhǎng)得像弦撩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子论皆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容