前言
这学期学习了Linux与python基础,老师建议学习Pyhton的时候,将这本书的外星飞船的小游戏做一遍,打算趁着这段时间边复习考试便将这个游戏做完,下面记录一下第一章的过程。
一、在Linux上安装Python,Pygame
当时安装的时候也遇到好些问题,但忘记录了,大家自己搜搜怎么安装吧。
二、游戏项目
1.创建各个.py文件,以及添加对应代码
1.alien_invasion1.py文件
首先,先在终端中输入mkdir alien_invasion创建一个alien_invasion目录用于存放你所有的代码。
进入alien_invasion,创建alien_invasion1.py。
alien_invasion1.py相当于整个项目的main.c,在这个文件中完成,各个模块的导入,初始化,以及主函数的编写。
添加如下代码
#!/usr/bin/env python3
#--snip--
import pygame
import sys
from ship import Ship
import game_functions as gf
from settings import Settings
from pygame.sprite import Group
def run_game():
pygame.init()#初始化背景设置, 让Pygame能够正确地工作
ai_settings=Settings()#创建Setting对象
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
ship=Ship(ai_settings,screen)#创建ship对象
bullets = Group()
#游戏的主循环
while True:
#监听鼠标和键盘
gf.check_events(ai_settings,screen,ship,bullets)
#更新飞船状态
ship.update()
#更新子弹
gf.update_bullets(bullets)
#让最近绘制的屏幕可见
gf.update_screen(ai_settings,screen,ship,bullets)
run_game()
import A as B这种方式为给引入的包A定义一个别名B
2.settings.py文件
#!/usr/bin/env python3
class Settings():
#存储游戏中所有设置的类
def __init__(self):
#屏幕设置
self.screen_width=1200#屏幕宽度
self.screen_height=800#屏幕高度
self.bg_color=(0,0,0)#背景颜色,RGB
self.ship_speed_factor = 1.5#船移动的速度
#子弹设置
self.bullet_speed_factor = 0.5#子弹移动速度
self.bullet_width = 3#子弹的宽度
self.bullet_height = 15#子弹的高度
self.bullets_allowed = 3#屏幕中最多允许的子弹数
self.bullet_color = 60,60,60#子弹的颜色
3.ship.py文件
#!/usr/bin/env python3
import pygame
class Ship():
def __init__(self,ai_settings,screen):
self.screen =screen
self.ai_settings = ai_settings
self.image = pygame.image.load('images/ship.bmp')#获取飞船图片
self.image = pygame.transform.scale(self.image,(30,30))#改变飞船图片大小
self.rect = self.image.get_rect()#获取飞船外接矩形,我们使用get_rect() 获取相应
#surface的属性rect
self.screen_rect = screen.get_rect()#得到屏幕的矩形
self.rect.centerx = self.screen_rect.centerx#飞船设置为屏幕的x中心
self.rect.bottom = self.screen_rect.bottom#飞船设置为屏幕的底部
self.center = float(self.rect.centerx)
self.moving_right = False#飞船移动的标志位
self.moving_left = False
def update(self):
if self.moving_right and self.rect.right < self.screen_rect.right:
#标志位为真,且不超过右边的屏幕
self.center += self.ai_settings.ship_speed_factor#飞船中心向右移动
if self.moving_left and self.rect.left> 0:
#标志位为真,且不超过左边的屏幕
self.center -= self.ai_settings.ship_speed_factor#飞船中心向左移动
self.rect.centerx = self.center#更新x飞船坐标
def blitme(self):
self.screen.blit(self.image,self.rect)#指定位置绘制飞船
4.game_functions.py文件
#!/usr/bin/env python3
import pygame
from bullet import Bullet
import sys
def check_keydown_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:#空格按下
#创建一颗子弹,并将其加入到编组bullets中
fire_bullet(ai_settings,screen,ship,bullets)
update_bullets(bullets)
def check_keyup_events(event,ship):#检测到按键松开
if event.key == pygame.K_RIGHT:
ship.moving_right = False#松开右键,右移的标志为假
elif event.key == pygame.K_LEFT:
ship.moving_left = False#松开左键,左移的标志为假
def check_events(ai_settings,screen,ship,bullets):
for event in pygame.event.get():#监视鼠标键盘动作
if event.type == pygame.QUIT:
sys.exit()#关闭按钮,退出游戏
elif event.type == pygame.KEYDOWN:#按下按键
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ship)
elif event.type == pygame.KEYUP:#松开按键
check_keyup_events(event,ship)
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 update_bullets(bullets):
bullets.update()#更新子弹
for bullet in bullets.copy():#子弹底部到顶了,删除子弹
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
def update_screen(ai_settings,screen,ship,bullets):
screen.fill(ai_settings.bg_color)#使用背景色填充屏幕
for bullet in bullets.sprites():
bullet.draw_bullet()#绘制出子弹
ship.blitme()#绘制飞船
pygame.display.flip()#绘制好的屏幕可见
5.bullet.py 文件
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,ai_settings,screen,ship):
super(Bullet,self).__init__()
self.screen = screen
#在(0,0)创建一个表示子弹的矩形,在设置正确的位置
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
#更新表示子弹的rect的位置
self.rect.y = self.y
def draw_bullet(self):
pygame.draw.rect(self.screen,self.color,self.rect)
三、所遇问题
1.import-im6.q16: not authorized `sys' @ error/constitute.c/WriteImage/1037.
import-im6.q16: not authorized `pygame' @ error/constitute.c/WriteImage/1037.
./alien_invasion.py: 行 3: 未预期的符号 `(' 附近有语法错误
./alien_invasion.py: 行 3: `def run_game():'
解决方案:在.py文件中添加#!/usr/bin/env python3,
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。
当系统看到这一行的时候,首先会到env设置(环境变量)里查找python的安装路径,再调用对应路径下的解释器程序完成操作。原文
2.def __init__使用方法:
ship.py文件中,添加self.image = pygame.transform.scale(self.image,(30,30))#改变飞船图片大小
原文:
四、运行结果