zoukankan      html  css  js  c++  java
  • 第十二章—武装飞船

    12-1 蓝色天空 :创建一个背景为蓝色的Pygame窗口。

     1 import sys
     2 import pygame
     3 def run_game():
     4     #初始化游戏并创建一个屏幕对象
     5     pygame.init()
     6     screen=pygame.display.set_mode((1200,800))
     7     pygame.display.set_caption("Alien Invasion")
     8     #设置背景颜色
     9     bg_color=(0,0,255)
    10     #开始游戏的主循环
    11     while True:
    12         #监视键盘和鼠标事件
    13         for event in pygame.event.get():
    14             if event.type==pygame.QUIT:
    15                 sys.exit()
    16         #每次循环时都会重绘屏幕
    17         screen.fill(bg_color)
    18         #让最近绘制的屏幕可见
    19         pygame.display.flip()
    20 run_game()

    输出:

    12-2 游戏角色 :找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。创建一个类,将该角色绘制到屏幕中央,并将该图像的背景色设置为屏幕背景色,或将 屏幕背景色设置为该图像的背景色。

    alien_invasion1.py

     1 import sys
     2 import pygame
     3 from rocket import Rocket
     4 
     5 def run_game():
     6     #初始化游戏并创建一个屏幕对象
     7     pygame.init()
     8     screen=pygame.display.set_mode((800,600))
     9     pygame.display.set_caption("Alien Invasion")
    10 
    11     #创建一艘火箭
    12     rocket=Rocket(screen)
    13 
    14     #设置背景颜色
    15     bg_color=(0,0,255)
    16     #开始游戏的主循环
    17     while True:
    18         #监视键盘和鼠标事件
    19         for event in pygame.event.get():
    20             if event.type==pygame.QUIT:
    21                 sys.exit()
    22         #每次循环时都会重绘屏幕
    23         screen.fill(bg_color)
    24         rocket.blitme()
    25         #让最近绘制的屏幕可见
    26         pygame.display.flip()
    27 run_game()

    rocket.py

     1 import pygame
     2 class Rocket():
     3     def __init__(self,screen):
     4         '''初始化火箭并设置其初始位置'''
     5         self.screen=screen
     6         #加载火箭图像图像并获取其外接矩形
     7         self.image=pygame.image.load('image/rocket.bmp')
     8         self.rect = self.image.get_rect()
     9         self.screen_rect = screen.get_rect()
    10 
    11         #将每艘新火箭放在屏幕中央
    12         self.rect.centerx = self.screen_rect.centerx
    13         self.rect.centery = self.screen_rect.centery
    14         # 在飞船的属性center中存储小数值
    15         self.center = float(self.rect.centerx)
    16 
    17     def blitme(self):
    18         # 在指定位置绘制飞船
    19         self.screen.blit(self.image, self.rect)

    输出:

    12-3 火箭 :编写一个游戏,开始时屏幕中央有一个火箭,而玩家可使用四个方向键上下左右移动火箭。请务必确保火箭不会移到屏幕外面。 

    alien_invasion1.py

     1 import sys
     2 import pygame
     3 import game_functions1 as gf
     4 from settings1 import Settings
     5 from rocket import Rocket
     6 
     7 def run_game():
     8     #初始化游戏并创建一个屏幕对象
     9     pygame.init()
    10     ai_settings=Settings()
    11     screen=pygame.display.set_mode(
    12         (ai_settings.screen_width,ai_settings.screen_height))#窗口尺寸
    13     pygame.display.set_caption("Rocket")
    14     #创建一个火箭
    15     rocket=Rocket(ai_settings,screen)
    16     #开始游戏主循环
    17     while True:
    18         #监视键盘和鼠标事件
    19         gf.check_events(rocket)
    20         rocket.update()
    21         gf.update_screen(ai_settings,screen,rocket)
    22 run_game()

    输出:

    12-4 按键 :创建一个程序,显示一个空屏幕。在事件循环中,每当检测到pygame.KEYDOWN 事件时都打印属性event.key。运行这个程序,并按各种键,看看Pygame如何响应。

     1 import sys
     2 import pygame
     3 def run_game():
     4     pygame.init()
     5     screen=pygame.display.set_mode((1000,600))
     6     pygame.display.set_caption('kong')
     7     bg_color = (230, 230, 230)
     8     while True:
     9         for event in pygame.event.get():
    10             if event.type==pygame.QUIT:
    11                 sys.exit()
    12             elif event.type == pygame.KEYDOWN:
    13                 if event.key==pygame.K_DOWN:
    14                     bg_color = (255, 0, 0)
    15                 else :
    16                     bg_color = (0, 255, 0)
    17         screen.fill(bg_color)
    18         pygame.display.flip()
    19 
    20 run_game()

    输出:

    点击运行后键盘无操作:

    键盘向下键:

    键盘其他键:

     12-5 侧面射击 :编写一个游戏,将一艘飞船放在屏幕左边,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右穿行的子弹,并在子弹离开 屏幕而消失后将其删除。

    settings2.py

     1 class Settings():
     2     #存储《外星人入侵》的所有设置的类
     3     def __init__(self):
     4         #初始化游戏的设置
     5         #屏幕设置
     6         self.screen_width=1000
     7         self.screen_height=500
     8         self.bg_color=(230,230,230)
     9         #飞船的设置
    10         self.ship_speed_factor=1.5
    11 
    12         #子弹的设置
    13         self.bullet_speed_factor=1
    14         self.bullet_width=15
    15         self.bullet_height=3
    16         self.bullet_color=(60,60,60)
    17         self.bullets_allowed=6

    ship2.py

     1 import pygame
     2 class Ship():
     3     def __init__(self,ai_settings,screen):
     4         #初始化飞船并设置其初始位置
     5         self.screen=screen
     6         self.ai_settings=ai_settings
     7         #加载飞船图像并获取其外接矩形
     8         self.image=pygame.image.load('image/ship.bmp')
     9         self.rect=self.image.get_rect()
    10         self.screen_rect=screen.get_rect()
    11         #将每艘新飞船放在屏幕左侧中央
    12         self.rect.left=self.screen_rect.left
    13         self.rect.centery=self.screen_rect.centery
    14         #在飞船的属性center中存储小数值
    15         self.centery=float(self.rect.centery)
    16 
    17         #移动标志
    18         self.moving_up=False
    19         self.moving_down = False
    20     def update(self):
    21         """根据移动标志调整飞船位置"""
    22         #更新飞船的center值,而不是rect
    23         if self.moving_up and self.rect.top>0:
    24             self.centery-=self.ai_settings.ship_speed_factor
    25         if self.moving_down and self.rect.bottom<self.screen_rect.bottom:
    26             self.centery+=self.ai_settings.ship_speed_factor
    27 
    28         #根据self.centery更新rect对象
    29         self.rect.centery=self.centery
    30 
    31     def blitme(self):
    32         #在指定位置绘制飞船
    33         self.screen.blit(self.image,self.rect)

    bullet2.py

     1 import pygame
     2 from pygame.sprite import Sprite
     3 
     4 class Bullet(Sprite):
     5     '''一个对飞船发射的子弹进行管理的类'''
     6     def __init__(self,ai_settings,screen,ship):
     7         """在飞船所处的位置创建一个子弹对象"""
     8         super(Bullet,self).__init__()
     9         self.screen=screen
    10         #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
    11         self.rect=pygame.Rect(0,0,ai_settings.bullet_width,
    12                               ai_settings.bullet_height)
    13         self.rect.centery=ship.rect.centery
    14         self.rect.left=ship.rect.left
    15         #存储用小数表示的子弹位置
    16         self.x=float(self.rect.x)
    17         self.color= ai_settings.bullet_color
    18         self.speed_factor=ai_settings.bullet_speed_factor
    19     def update(self):
    20         """向右移动子弹"""
    21         #更新表示子弹位置的小数值
    22         self.x+=self.speed_factor
    23         #更新表示子弹的rect的位置
    24         self.rect.x=self.x
    25 
    26     def draw_bullet(self):
    27         """在屏幕上绘制子弹"""
    28         pygame.draw.rect(self.screen,self.color,self.rect)

    game_functions2.py

     1 import sys
     2 import pygame
     3 from bullet2 import Bullet
     4 def check_keydown_events(event,ai_settings,screen,ship,bullets):
     5     """响应按键"""
     6     if event.key == pygame.K_UP:
     7         # 向上移动飞船
     8         ship.moving_up = True
     9     elif event.key == pygame.K_DOWN:
    10         # 向下移动飞船
    11         ship.moving_down = True
    12     elif event.key==pygame.K_SPACE:
    13         fire_bullet(ai_settings, screen, ship, bullets)
    14 
    15 def fire_bullet(ai_settings,screen,ship,bullets):
    16     """如果还没有到达限制,就发射一颗子弹"""
    17     # 创建一颗子弹,并将其加入到编组bullets中
    18     if len(bullets) < ai_settings.bullets_allowed:
    19         new_bullet = Bullet(ai_settings, screen, ship)
    20         bullets.add(new_bullet)
    21 
    22 def check_keyup_events(event,ship):
    23     """响应松开"""
    24     if event.key == pygame.K_UP:
    25         # 向上移动飞船
    26         ship.moving_up = False
    27     elif event.key == pygame.K_DOWN:
    28         # 向上移动飞船
    29         ship.moving_down = False
    30 def check_events(ai_settings,screen,ship,bullets):
    31     for event in pygame.event.get():
    32         if event.type == pygame.QUIT:
    33             sys.exit()
    34         elif event.type==pygame.KEYDOWN:
    35             check_keydown_events(event, ai_settings,screen,ship,bullets)
    36 
    37         elif event.type==pygame.KEYUP:
    38             check_keyup_events(event, ship)
    39 
    40 def update_screen(ai_settings,screen,ship,bullets):
    41     """更新屏幕上的图像,并切换到新屏幕上"""
    42     #每次循环时都重绘屏幕
    43     screen.fill(ai_settings.bg_color)
    44     #在飞船和外星人后面重绘所有子弹
    45     for bullet in bullets.sprites():
    46         bullet.draw_bullet()
    47     ship.blitme()
    48     #让最近绘制屏幕可见
    49     pygame.display.flip()
    50 def update_bullets(bullets):
    51     # 更新子弹位置,删除已消失的子弹
    52     #更新子弹位置
    53     bullets.update()
    54     #删除已消失的子弹
    55     for bullet in bullets.copy():
    56         if bullet.rect.left >= 1000:
    57             bullets.remove(bullet)
    58             # print(len(bullets))
    alien_invasion2.py
     1 import sys
     2 import pygame
     3 from pygame.sprite import Group
     4 import game_functions2 as gf
     5 from settings2 import Settings
     6 from ship2 import Ship
     7 
     8 def run_game():
     9     #初始化游戏并创建一个屏幕对象
    10     pygame.init()
    11     ai_settings=Settings()
    12     screen=pygame.display.set_mode(
    13         (ai_settings.screen_width,ai_settings.screen_height))#窗口尺寸
    14     pygame.display.set_caption("Alien Invasion")
    15     #创建一个飞船
    16     ship=Ship(ai_settings,screen)
    17     #创建一个用于存储子弹的编组
    18     bullets=Group()
    19 
    20     #开始游戏主循环
    21     while True:
    22         gf.check_events(ai_settings,screen,ship,bullets)
    23         ship.update()
    24         gf.update_bullets(bullets)
    25         gf.update_screen(ai_settings,screen,ship,bullets)
    26 run_game()

    输出:

  • 相关阅读:
    长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&&水题
    长春理工大学第十四届程序设计竞赛A Rubbish——并查集&&联通块
    长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表
    2018ccpc吉林 E:THE TOWER——数形结合
    区间第K小——可持久化线段树模板
    牛客练习赛3 贝伦卡斯泰露——队列&&爆搜
    [LeetCode] Find Peak Element
    [LeetCode] Intersection of Two Linked Lists
    C++静态库与动态库
    模板的全特化与偏特化
  • 原文地址:https://www.cnblogs.com/liuhaier/p/8947522.html
Copyright © 2011-2022 走看看