Python编程:从入门到实践-------外星人入侵


前言

这学期学习了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的安装路径,再调用对应路径下的解释器程序完成操作。原文

not authorized `argparse' @ error/constitute.c/WriteImage/1037.问题的解决_weixin_40900419的博客-CSDN博客使用python文件做深度学习训练时候,遇到一个问题,在跑代码的时候出现:import-im6.q16: not authorized `argparse' @ error/constitute.c/WriteImage/1037.import-im6.q16: not authorized `os' @ error/constitute.c/WriteImage/1037.import-i...https://blog.csdn.net/weixin_40900419/article/details/101620485?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166848006216800182166379%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166848006216800182166379&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-101620485-null-null.142^v63^control,201^v3^control,213^v2^t3_control1&utm_term=import-im6.q16%3A%20not%20authorized%20%60sys%20%40%20error%2Fconstitute.c%2FWriteImage%2F1037.&spm=1018.2226.3001.4187

2.def __init__使用方法:

https://blog.csdn.net/cuichongxin/article/details/109580807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166849446916782428693823%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166849446916782428693823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-109580807-null-null.142^v63^control,201^v3^control,213^v2^t3_control1&utm_term=python%20__init__&spm=1018.2226.3001.4187icon-default.png?t=M85Bhttps://blog.csdn.net/cuichongxin/article/details/109580807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166849446916782428693823%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166849446916782428693823&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-109580807-null-null.142%5ev63%5econtrol,201%5ev3%5econtrol,213%5ev2%5et3_control1&utm_term=python%20__init__&spm=1018.2226.3001.41873.在屏幕中显示图片的时候,出现图片过大的现象。

ship.py文件中,添加self.image = pygame.transform.scale(self.image,(30,30))#改变飞船图片大小

原文:

python编写游戏导入的图片太大的解决办法_无 眠的博客-CSDN博客_导入游戏的图太大【代码】python编写游戏导入的图片太大的解决办法。https://blog.csdn.net/sjzszyh/article/details/127263461

四、运行结果

 

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值