一个简单的开始

一个简单的开始
这算是正式入驻博客这个大家庭,在博客上之前也写过一些东西,但这算正式开始吧,简单收拾一下,开始python的旅行吧!
这里欢迎各路大神指点,共同进步,先声明一下,我是python的菜鸟刚刚开始接触python这门语言,好多东西都不是很懂,在这里写的这些,也可能很不入眼,这算是我对一个阶段的总结,结合项目实战自己对python的一些理解吧!
其实在接触这门语言的时候还是下了很大的决心的,也问过很多人,你要说哪一门语言更好,可能各不相同,存在即合理对吧,每一门语言的存在都有它的道理,不管是C javae,php,还是其他语言,每门语言都有它的优势和缺点,我们不讨论这些,接下来简单分享一下这段时间学习的python,以及这段时间的成果,总结一下。
学习过python的都知道,python相对于其他语言还是比较简单易懂的,每个人对代码的实现理解不同编写的代码也各不相同,但要想尽可能的以更简洁优美的代码,写出来,我们在阅读的时候真的很舒服,就像在阅读一首完美无瑕的诗一样,但是要是写的代码不好,可能到后来以至于自己都不知道知道写的到底是一些什么鬼东西,我之前在书写代码的时候也经常使用ABCD这样的变量名来赋值,可最后发现自己都不知道,自己写的那个是那个了,所以后边就尽可能的使用简而易懂的变量名来赋值,这样写起代码来不仅更轻松,而且他人也在阅读的时候往往赞不绝口。
好了,不废话了,开始吧!
我们这次讨论一下一个实战项目,飞机大战,相信大部分人都玩过这个游戏,其实python不是很适合来做游戏的,最适合还是C,所谓机器码生汇编码,汇编生C,C生万物嘛,不得不承认C的强大之处,不过C对于我这个初学者来说可能有些难了,那我们为什么用python来完成游戏呢,这里我学习的主要是python代码的思想,跟游戏没有多大关系,我们侧重点不是游戏,而是代码!
我们只要用python体验一下,创建每一个程序员“hello world”,既然要完成这个游戏我们就要完成游戏的可视化,那么我们就需要用到pygame,这个大家百度一下网上全是安装教程,可以一步一步的实现安装。我们只需要在终端中确认一下我么是否安装了pygame,我们输入python3 -m pygame.exanples.aliens,如果我们可以看到游戏界面,就证明我们安装了,如果没有就证明我们没有正确的安装,需要自己重新安装。在终端中安装的命令为sudo pip3 install pygame
我们既然要开始项目,就要做一些初期的准备,创立飞机大战的项目,创建飞机大站的py文件,还需呀准备一些背景图片,子弹样子啊什么的。我们在py文件中先不写代码,我们需要找一些重点的图片,包括背景图片,玩家的飞机,爆炸效果,子弹等等,这些图片素材,只要我们能够想到的都整理在一个包中,简单来讲就是我们讲一些静止的图片通过代码的控制,来完成一个动态的效果,那这个就是一个简单的2D的游戏的开发。讲到这里是不是对一个游戏有一个简单的印象了。
那么我首先要做的就是创建一个游戏的主窗口,我们前期准备的就是pygame的init方法讲所有的模块初始化,那么游戏结束我们就要一个quit的方法结束我们的游戏。我们在py文件中就首先导入pygame这个模块,然后使用init方法加载并且初始化所有模块,中间就是我们的游戏代码,最后游戏结束用到quit方法,卸载我们导入的所有pygame所有的模块。
pygame给我们专门提供可一个dispaly模块,这就是专门用来创建,管理游戏的窗口,那我们就看看这个游戏到底该怎样开始呢
首先我们要在我们的创建的第一个py文件中,导入pygame这个模块,然后我们就要初始化和加载这个模块,我们直接用pygame.init这个方法就可以来了,那前边我们介绍了一个display这个模块,这边还有有个方法叫set_mode()这个就是我们创建的窗口,这个里边是有三个默认参数的,我们看到第一个参数是一个元组,这既是我们控制界面宽和高我们给它传入我们所需要的宽和高,这个需要和我么的游戏背景图片的宽高保持一致,然后我门用一个死循环,让游戏界面一直显示,游戏结束是不是还需要调用quit这个方法。这样我们就可以看到一个pygame的游戏窗口了,那set_mode都有一个返回值,返回的就是我们创建的窗口。那这里我们为什么要用死循环呢?如果不用这个死循环我们所创建出来的游戏窗口一瞬间就消失了,所以我么要使用一个死循环让我们的窗口一直显示在我们的桌面上。
这里我们引用坐标系,我们创建好窗口,那么我们定义的坐标原点在哪里呢?就在左上角,那这个就是X,y轴就是向右向下递增的。我们所有在窗口看到的元素都是矩形呈现的,并不是一个点,我们还需要知道这个元素的宽和高,X,Y确定这个元素左上角的位置,width,height决定这个元素的大小,pygame给我们也提供了一个特殊的类,pygame.Rect,这个就是专门确定这个矩形的区域的,第一个值是X,第二个值是Y 第三个值是size值,也就是width和height这两个值,Rect这个了不需要初始化也就是不用init这个方法。
接下来我们绘制背景图片,我们就首先需要把图片加载到我们的磁盘中,我们要用三个方法来实现,首先我么用pygame.文件名.load(’./images/background.png‘)这个方法加载我们的图片,还需要在括号内添加完整的路径,这个需要一个对象来接收,接下来我们就用blit这个方法,将图片绘制到指定的位置,我们就需要用,游戏窗口的对象来调用这个方法,然后我们传入加载背景图片这个对象,和我们需要所放置的位置,我们默认为(0,0),然后我们用pygame.display.update这个方法,刷新界面,要是不使用这个方法,我们是没有办法查看到我们所加载的图片的。
接下来绘制玩家得到图片,其实是和创建 背景图片完全一样的,只不过我们让更新界面执行一次就可以了,不必要每次都调用,就显得有点复杂了。
那游戏是一个动态的画面,不是静态的画面,python给我们提供了一个时钟类Clock,在循坏外部创建一个Clock对象。在循环内部我们用这个对象,创建一个tick这个方法定义每秒钟循环多少次。我们接下来就考虑控制飞机的移动,我们就需要创建一个时钟对象,定义飞机的初始位置的对象,我们就用这个对象来控制飞机向上移动那我们就直接用这个对象点Y让它每次-1,然后我们每次都要刷新背景图片,那我们就要之前创建的窗口对象点blit调用背景图片。让每次移动都刷新背景图片。我们还需要判断当y<=0的时候要从最下方重新开始,让玩家飞机不断地在移动,那我们用之前创建的记录飞机的初始位置对象,调用Rect里边的bottom参数,让这个参数小于等于0,然后在让飞机回到y=之间创建的位置就可以实现循环了。


这两段代码就是实现图形界面化输出。
那玩家需要对游戏做一些操作,这个就叫事件,在python中通过pygame.even.get()获取用户当前动作的列表。我们通过for循环遍历这个事件列表中的所有信息,如果用户点击或者按下退出键,结束当前游戏
结束前我们就要用一个python中的额函数pygame.quit()这个方法退出游戏,卸载游戏中的所有模块,并在控制台输出,游戏结束, 使用xeit()方法退出当前循环。
在这里插入图片描述
我们这时候就考虑用到,精灵和精灵组,我们在之前创建的py文件中导入我们创建的精灵文件的所有东西。

在这里插入图片描述
在这里我们先导入pygame这个模块,创建飞机大战游戏精灵,初始化对象,让这个类继承python.sprite.Sprite这个父类,先初始化方法,调用父类方法,定义image实例成员。调用父类方法,定义image实力成员,调用,pygame.image.load这个方法吧我们的形参传递进去,定义rect属性让image调用get_rect方法,让图形大小为默认方法,接下来我们定义一个垂直方向移动的方法。我们所传递的speed参数不一样,游戏精灵移动的速度就不同。
我们创建敌机的得到时候需要导入我们创建的精灵类,然后和创建玩家大径相同
我们直接看代码
enemy=GameSprite(’./images/enemy.png’)
enemy1=GameSprite(’./images/enemy.png’,2)
enemy_group=pygame.sprite.Group(enemy,enemy1)
这就是我们创建的两个敌人,调用Group这个类,传入两个敌人,然后我们就要在循环里边让精灵组调用update这个方法和draw这个方法传入之前我们创建的screen
接下来我们就可以看到有敌机和玩家这两个元素!

在这里插入图片描述
写到这里电脑宕机了,完全没有心思在写了,直接看代码吧!
import pygame
from plame_sprites import *
class PlaneGame(object):
“”“飞机大战主程序”""
def init(self):
print(‘游戏初始化’)
#创建游戏的窗口
self.screen=pygame.display.set_mode(SCREEN_RECT.size)
#创建游戏的时钟
self.clock=pygame.time.Clock()
self.__create_sprites()
#调用私有方法,精灵和精灵组
#设置定时器事件
pygame.time.set_timer(CRATE_ENEMY_EVENT,1000)
pygame.time.set_timer(HERO_FIRE_EVENT,500)
def __create_sprites(self):
# 创建背景精灵和精灵组
bg1 = Background()
bg2 = Background(True)

    self.back_ground = pygame.sprite.Group(bg1,bg2)
    self.enemy_group=pygame.sprite.Group()
    self.hero=Hero()
    self.hero_group=pygame.sprite.Group(self.hero)
def start_game(self):
    print('游戏开始。。。')
    while True:
        #设置刷新帧率
        self.clock.tick(FRAME_PER_SEC)

        #事件监听
        self.__even_handler()
        #碰撞检测
        self.__check_collide()
        #更新/绘制精灵
        self.__update_sprites()
        #更新显示
        pygame.display.update()
def __even_handler(self):
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            PlaneGame.__game_over()
        elif event.type==CRATE_ENEMY_EVENT:
            # print('敌机出场。。')
            #创建敌机精灵
            enemy=Enemy()
            self.enemy_group.add(enemy)
        # elif event.type==pygame.KEYDOWN and event.key==pygame.K_RIGHT:
        #     print('向右移动')
        elif event.type==HERO_FIRE_EVENT:
            self.hero.fire()
    #使用键盘提供的方法回去键盘按键
    keys_pressed=pygame.key.get_pressed()
    #判断元组中对应的索引值是否为1
    if keys_pressed[pygame.K_RIGHT]:
        self.hero.speed=2
    elif keys_pressed[pygame.K_LEFT]:
        self.hero.speed=-2
    else:
        self.hero.speed=0

def __check_collide(self):
    #子弹摧毁敌机
    pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
    #敌机撞毁玩家
    enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
    #判断列表是否有内容
    if len(enemies)>0:
        #让英雄牺牲
        self.hero.kill()
        #结束游戏
        PlaneGame.__game_over()

def __update_sprites(self):
    self.back_ground.update()
    self.back_ground.draw(self.screen)
    self.enemy_group.update()
    self.enemy_group.draw(self.screen)
    self.hero_group.update()
    self.hero_group.draw(self.screen)
    self.hero.bullets.update()
    self.hero.bullets.draw(self.screen)
@staticmethod
def __game_over():
    print('游戏结束')
    pygame.quit()
    exit()

if name==‘main’:
#创建游戏对象
game=PlaneGame()
game.start_game()
这就是我们的主程序,内部包括控制玩家飞行,创建玩家精灵,子弹精灵等,游戏结束等信息。

import random
import pygame
#屏幕大小的常量
SCREEN_RECT=pygame.Rect(0,0,480,600)
#定义刷新帧率
FRAME_PER_SEC=60
#创建敌机的定时器常量
CRATE_ENEMY_EVENT=pygame.USEREVENT
#英雄发射子弹事件
HERO_FIRE_EVENT=pygame.USEREVENT+1

class GameSprite(pygame.sprite.Sprite):
“”"
飞机大战游戏精灵
“”"
def init(self,image_name,speed=1):
super().init()
#定义游戏精灵的属性
self.image=pygame.image.load(image_name)
self.rect=self.image.get_rect()
self.speed=speed
def update(self):
#在屏幕的锤直方向移动
self.rect.y+=self.speed

class Background(GameSprite):
def init(self,is_alt=False):
#调用父类方法实现精灵的创建(image/rect/speed)
super().init(’./images/background.png’)
if is_alt:
self.rect.y=-self.rect.height

def update(self):
    #调用父类的方法实现
    super().update()
    #判断是否移出屏幕
    if self.rect.y>=SCREEN_RECT.height:
        self.rect.y=-self.rect.height

class Enemy(GameSprite):
def init(self):
super().init(’./images/enemy.png’)
self.speed=random.randint(1,3)
self.rect.bottom=0
max_x=SCREEN_RECT.width-self.rect.width
self.rect.x=random.randint(0,max_x)
def update(self):
super().update()
if self.rect.y>=SCREEN_RECT.height:
# print(‘飞出屏幕,需要从屏幕删除。。。’)
#kill方法可以将精灵从所有精灵组中移出
self.kill()
def del(self):
# print(‘敌机挂了%s’% self.rect)
pass
class Hero(GameSprite):
“”" 英雄精灵"""
def init(self):
super().init(’./images/me1.png’,0)
#英雄的初始位置
self.rect.centerx=SCREEN_RECT.centerx
self.rect.bottom=SCREEN_RECT.bottom - 120
#创建子弹的精灵组
self.bullets=pygame.sprite.Group()

def update(self):
    #英雄在水平方向上移动
    self.rect.x+=self.speed
    #控制英雄不能离开屏幕
    if self.rect.x<0:
        self.rect.x=0
    elif self.rect.right>SCREEN_RECT.right:
        self.rect.right=SCREEN_RECT.right
def fire(self):
    #创建子弹精灵
    for i in (0,1,2):

        bullet=Bullet()
        #设置精灵位置
        bullet.rect.bottom=self.rect.y - i*20
        bullet.rect.centerx=self.rect.centerx
        #将精灵添加到精灵组
        self.bullets.add(bullet)

class Bullet(GameSprite):
“”“子弹精灵”""
def init(self):
super().init(’./images/1.png’,-2)

def update(self):
    #调用父类方法,让子弹沿垂直方向飞行
    super().update()
    if self.rect.bottom<0:
        self.kill()

def __del__(self):
    print('子弹被销毁')

这段就是我们创建的游戏精灵,包括计时器的使用。
怎样讲呢,完成这个项目看起来还是很垃圾的游戏界面也很丑的,不过经过两天的努力终于完成了,还是值得仔细看看的,里边包含很多python的基础语法及pygame的模块,方法等等,如何实现在主程序中调用精灵的模块,方法等,都有很多值得学习的地方。下边展示一下在这里插入图片描述
看起来很丑的,不过对于初学的我来说,能够完全理解代码已经有点困难了,还是很高兴完成这个游戏的开发,并实现图形界面化的输出,往后还需要更加努力!
为什么要做呢?总得给自己找点事吧,要不还是会很难过的…
print(‘hello world’)

发布了14 篇原创文章 · 获赞 6 · 访问量 991

猜你喜欢

转载自blog.csdn.net/weixin_44935235/article/details/89791645