Python实现飞机大战-第一部分(附源码、素材、超详细实现过程)

源码、素材链接

源码、素材免费下载链接
https://download.csdn.net/download/qq_44744724/12615682

前言

最近在家闲来无事,二刷了Python基础,对于Python类的使用一直都很困惑,类和继承都是面向对象编程语言的特性之一。二刷之后对类的相关知识有了新的认识。顺便找个小项目练练手,加深对函数、类、重构的理解,最后想通过这篇博客记录一下实现过程。如果遇到什么困难或者不理解的地方欢迎滴滴我,同时程序中可能会有很多不足,望不吝赐教。
看这篇教程之前你要熟悉掌握Python基础,比如:Python基础语法、函数、类、重构等等
Pygame就无所谓,这个项目是为了练习python,并不是为了掌握pygame。

这里是整个项目的第一部分,在游戏窗口内生成玩家飞机,并控制玩家飞机上下、左右移动,同时防止飞机超出游戏窗口

首先创建一个文件夹用来存放所有py文件,文件名自拟,我命名为AirplaneWar,同时在这个文件夹内创建名为image的子文件夹

1.1.创建Pygame窗口

在Airplane文件目录下创建一个名为main.py的文件,作为主文件

import pygame
def start_game():
    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    screen = pygame.display.set_mode((480700))
    # 窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")
    # 背景图片地址
    background_image_path = './image/bg_image.png'
    # 加载背景图片
    background = pygame.image.load(background_image).convert()
	while True:
    '''游戏主循环'''
    	# 响应键鼠
    	for event in pygame.event.get():
        	if event.type == pygame.QUIT:
                sys.exit()
        # 填充背景图片
        screen.blit(background, (0, 0)) 
        # 刷新窗口
		pygame.display.update()

start_game()

下面运行代码
在这里插入图片描述
如图,游戏的窗口我们已经创建完成

1.2.创建设置类

这个设置类目前只是为了控制窗口的大小。
在同一目录下创建一个名为settings.py的文件

class Settings():
    '''游戏设置的类'''

    def __init__(self):
        '''游戏设置初始化'''
        # 游戏窗口宽度
        self.screen_weight = 480
        # 游戏窗口高度
        self.screen_height = 700   
        # 背景图片的地址
        self.background_image = './image/bg_image.png'

在这个类中可以看到,包含了三个内容;窗口宽度、窗口高度、背景图片的path。接下来修改main.py内的代码

import sys
import pygame
from settings import Settings

def start_game():

    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()

    # 实例化Settings类
    player_settings = Settings()

    # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口
    # 调用user_settings对象中的screen_weight和screen_height属性
    screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height))

    # 设置窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")

    # 调用player_settings中的image属性,其中有背景图片的路径
    background = pygame.image.load(player_settings.background_image).convert()
    while True:
        '''游戏主循环'''
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
                
        # 填充背景图片
        screen.blit(background, (0, 0))
        
        pygame.display.update()

start_game()

首先在文件的头部引入settings.py中的Settings类,接着实例化Settings类。

1.3.添加玩家飞机

在窗口的底部的中央添加一个玩家的飞机,首先创建player_plane.py,创建玩家飞机类

import pygame
class Plane():
    '''玩家飞机的类'''
    def __init__(self, screen, player_settings):
    
        self.screen = screen
        self.image = pygame.image.load('image/player.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
		self.player_settings = player_settings
        # 飞机放在屏幕底部中间
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

    def blitme(self):
        '''绘制飞机位置'''
        self.screen.blit(self.image, self.rect)

修改main.py中的代码

加载图像后,使用get_rect()来获取图像的矩形边框,接着使用rect对象的属性center、centerx、centery,可让图像居中;使用属性bottom、top、left、right,可让图像屏幕边缘对齐;属性x、y,可调整图像的水平和垂直的位置。

import sys
import pygame
from settings import Settings
from player_plane import Plane

def start_game():
	'''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()
    
    -- skip -- 重复的代码不再写,只提示在相应位置添加部分代码

    # 实例化飞机类,对象为players_plane
    players_plane = Plane(screen, player_settings)
	while True:
	-- skip --
	
	# 绘制玩家飞机
        players_plane.blitme()

start_game()

接着运行代码,看看效果。
在这里插入图片描述
添加成功了。

1.4.重构main.py模块

如果你还不知道什么是重构那么可以看这篇文章…待续
重构就是为了使代码结构清晰,逻辑更加清楚容易理解。
可以通过将main.py中实现某一功能的代码段,提取出来放到一个函数里面,然后创建一个新的py文件(比如game_functions.py)用来存放这些函数,当main.py中需要使用到这些函数时我们可以通过import game_functions调用模块中的某个函数。

1.4.1.check_keyboard() 监视键鼠事件的函数

在这里插入图片描述
main.py中这个代码段实现的功能就是监视键盘鼠标,接下来创建一个函数实现同样的功能,添加到game_functions.py中。

import sys
import pygame

def check_keyboard():
    '''监视键盘和鼠标事件'''
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

1.4.2.update_screen() 刷新屏幕的函数

同理,添加update_screen()到game_functions.py中。

import sys
import pygame

def update_screen(player_settings,players_plane, screen):
    '''更新窗口图像'''
    # 调用player_settings中的image属性,其中有背景图片的路径
    background = pygame.image.load(player_settings.background_image).convert()

    # 填充窗口背景
    screen.blit(background, (0, 0))

    # 绘制玩家飞机
    players_plane.blitme()

    # 刷新屏幕: update只刷新窗口有变动的地方,flip刷新整个窗口
    pygame.display.update()
    # pygame.display.flip()

修改main.py

import pygame
from settings import Settings
from player_plane import Plane
import game_functions as game_functions
def start_game():

    '''创建一个屏幕对象'''
    # 初始化游戏窗口
    pygame.init()

    # 实例化Settings类
    player_settings = Settings()

    # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口
    # 调用user_settings对象中的screen_weight和screen_height属性
    screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height))

    # 设置窗口的标题
    pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com")

    # 实例化飞机类,对象为players_plane
    players_plane = Plane(screen, player_settings)

    while True:
        '''游戏主循环'''
        # 调用文件game_functions内的check_keyboard函数,是一个响应键鼠的函数
        game_functions.check_keyboard()

        # 调用update_screen函数,更新窗口
        game_functions.update_screen(player_settings,players_plane, screen)
start_game()


一系列操作之后,main.py是不是更加的简洁,逻辑非常清晰。

1.5.控制飞机移动
1.5.1.左右移动

添加玩家飞时我们用到bottom和centerx控制飞机图像放置的位置,centerx用来控制图像的水平坐标。要让图像左右移动,只需要改变rect.centerx属性的值,添加一个方法change_position来修改rect.centerx的值。
为了实现用户按下键盘,飞机一直连续移动,需要给Plane类添加一个移动标志,初值为False(此时飞机不动),如果监测到键盘按下,移动标志被赋值为Ture。键盘松开,赋值为False。

player_plane.py

import pygame
class Plane():
    '''玩家的飞机的类'''
    def __init__(self, screen, player_settings):
    	--skip--
    
    	# 是否移动标志
        self.moving_right = False
        self.moving_left = False
        
    def change_position(self):
        '''根据移动标志改变飞机的位置'''
        if self.moving_right:
            self.rect.centerx += 1
        if self.moving_left:
            self.rect.centerx -= 1

修改了Plane的类,还要修改监视键盘的函数。

game.functions

'''储存大量游戏内的函数'''
import sys
import pygame


def check_keyboard(players_plane):
    '''监视键盘和鼠标事件'''
    --skip--
    	# KEYDOWN检测键盘是否按下
        elif event.type == pygame.KEYDOWN:
            # 检测右箭头键是否按下
            if event.key == pygame.K_RIGHT:
                players_plane.moving_right = True
            # 检测左箭头键是否按下
            elif event.key == pygame.K_LEFT:
                players_plane.moving_left = True
                
		# KEYUP检测键盘是否松开
        elif event.type == pygame.KEYUP:
            # 检测右箭头键是否松开
            if event.key == pygame.K_RIGHT:
                players_plane.moving_right = False
            # 检测左箭头键是否松开
            elif event.key == pygame.K_LEFT:
                players_plane.moving_left = False
1.5.2.上下移动

上下移动需要飞机的rect的bottom属性控制,代码的实现与上下移动基本相似,不再赘述。

player_plane.py

import pygame
class Plane():
    '''玩家的飞机的类'''
    def __init__(self, screen):
    	--skip--
		# 是否移动标志
		self.moving_up = False
        self.moving_down = False
        
	def change_position(self):
		--skip--
		if self.moving_up:
            self.rect.bottom -= 1
        if self.moving_down:
            self.rect.bottom += 1

game.functions
在左右移动的下方添加下面的代码

# 检测上箭头键是否按下
elif event.key == pygame.K_UP:
	players_plane.moving_up = True
#检测下箭头键是否按下
elif event.key == pygame.K_DOWN:
	players_plane.moving_down = True


# 检测上箭头键是否松开
elif event.key == pygame.K_UP:
	players_plane.moving_up = False
# 加测下箭头键是否松开
elif event.key == pygame.K_DOWN:
	players_plane.moving_down = False

运行代码,按下上下左右代码,测试一下效果。

1.6.控制玩家飞机移动速度

运行代码后,有木有感觉这飞机特喵的飞的好慢啊。接下来实现如何调整飞机的移动速度。
接下来画面转移到这里(Plane的类中的change_position方法),
注意:把下图中的self.rect.y改为self.rect.bottom
在这里插入图片描述
在这可以看出,键盘被按下后每次只改变1,现在修改这个值。在Settings类中添加一个player_change_speed属性,再把player_change_speed属性赋值给相应坐标的变化。这里注意,添加的属性再settings.py内,在player_plane.py中引用时,需要使用from settings import Settings 引入这个类。

player_plane.py
只需修改change_position()方法

在这里插入图片描述
settings.py
在这里插入图片描述

1.7.限制飞机移动范围

程序中的screen_rect对象可以get到游戏窗口的矩形边框,rect对象可以get到飞机图像的矩形边框。可以通过他们的属性right、left、top、bottom,来限制飞机的移动范围。

例如:我不想让飞机超出屏幕的下边缘,就可以让飞机图像的下边缘rect.bottom小于游戏窗口的下边缘screen_rect.bottom,那么我在Plane类中的change_position()方法中的if语句再加一个条件 rect.bottom < screen_rect.bottom,剩下左右和上边缘道理相同,不再赘述。
修改Plane类的change_position()方法,如下代码。

    def change_position(self):
        '''根据移动标志改变飞机的位置'''
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.centerx += self.player_settings.player_change_speed
        if self.moving_left and self.rect.left > 0:
            self.rect.centerx -= self.player_settings.player_change_speed
        if self.moving_up and self.rect.top > self.screen_rect.top:
            self.rect.bottom -= self.player_settings.player_change_speed
        if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
            self.rect.bottom += self.player_settings.player_change_speed
1.8.文件目录

现附上目录图

在这里插入图片描述
完成第一部分后的文件目录大概是这个样子的。

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值