研究生入学前自学python

自我感觉python语法很简单易学  很多知识 类中的方法需要我们反复记忆 pygame模块提供的方法编写游戏真的太强大了 

学完python基础 自己编写了一个小游戏(当然不会的地方还是看老师教程)希望能给小伙伴们提供参考 

ok开始   建两个python文件就能搞定。

1.plane_main.py 用于编写游戏主函数类

2.plane_sprite.py 用于编写精灵类 (精灵类一定要学会 因为封装的方法太让人佩服)

(1)主函数类代码

#杜锋
#开发时间 2021/5/1216:45
import pygame
from plane_sprites import  *
class PlaneGame(object):
    '''飞机大战主游戏'''
    def __init__(self):
        print('游戏初始化')
        #1.创建游戏窗口
        self.screen=pygame.display.set_mode(SCREEN_RECT.size)  #.size 返回的是一个元组
        # 2.创建游戏时钟
        self.clock=pygame.time.Clock()
        # 3.调用私有方法 完成精灵组创建
        self.__creat_sprites()
        #设置定时器事件 1s执行一次此事件
        pygame.time.set_timer(CREAT_ENEMY_EVENT,1000)
        pygame.time.set_timer(HERO_FIRE_EVENT,500)

    def __creat_sprites(self):
        bg1=Background() #创建精灵
        bg2=Background(True) #创建背景精灵2
        self.back_groung=pygame.sprite.Group(bg1,bg2)#创建精灵组
        self.enemy_group=pygame.sprite.Group() #创建敌机精灵组
        #创建英雄的精灵和精灵组
        self.hero=Hero()
        self.hero_group=pygame.sprite.Group(self.hero)

    def srart_game(self):
        print('游戏开始')
        while True:
            #设置刷新帧率
            self.clock.tick(FRAME_PER_SEC) #一秒执行60次
            #事件监听
            self.__event_handler()
            #碰撞检测
            self.__check_collide()
            #更新绘制精灵
            self.__update_sprites()
            #更新显示
            pygame.display.update()
    def __event_handler(self):
        for item in pygame.event.get():
            '''判断是否退出游戏'''
            if item.type == pygame.QUIT:
              PlaneGame.__game_over() #类名调用静态方法
            elif item.type== CREAT_ENEMY_EVENT:
              print('敌机出场')
              #创建敌机精灵
              enemy=Enemy()
              self.enemy_group.add(enemy) #添加到精灵组
            elif item.type== HERO_FIRE_EVENT:
                self.hero.fire() #调用英雄发射子弹方法


            #使用键盘提供的方法获取键盘按键 返回按键元组
            keys_pressed= pygame.key.get_pressed()
            if keys_pressed[pygame.K_RIGHT]==1: #pygame.K_LIFT为键盘常量
                print('向右移动')
                self.hero.speed=2
            elif keys_pressed[pygame.K_LEFT]==1:
                print('向左移动')
                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,dokill=True) #返回一个列表
        #英雄与敌机碰撞
        if len(enemies)>0:
            self.hero.kill()
            ##结束游戏
            PlaneGame.__game_over() #静态方法




    def __update_sprites(self):
        self.back_groung.update()
        self.back_groung.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)
        pygame.display.update()
    @staticmethod #定义静态方法
    def __game_over():
        print('游戏结束')
        pygame.quit()
        exit()




if __name__ == '__main__':
   '''创建游戏对象'''
   game=PlaneGame()
   #启动游戏
   game.srart_game()

 (2)精灵类代码

#杜锋
#开发时间 2021/5/1215:48
import random
import  pygame
'''游戏精灵类'''
SCREEN_RECT=pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC=60

#创建敌机定时器常量
CREAT_ENEMY_EVENT= pygame.USEREVENT #就是定义一个事件
#发射子弹事件
HERO_FIRE_EVENT =pygame.USEREVENT+1 #常量



class GameSprite(pygame.sprite.Sprite):#.模块.类名称
    '''飞机大战游戏精灵'''
    def __init__(self,image_name,speed=1):  #增加了speed属性
        #调用父类初始化方法
        super().__init__()
        #定义对象属性
        self.image=pygame.image.load(image_name)
        self.rect =self.image.get_rect() #默认图片大小
        self.speed=speed
    def update(self): #update 更新位置
      self.rect.y+=self.speed
class Background(GameSprite): #在子类中重写父类方法
    '''游戏背景精灵'''
    def __init__(self, is_alt=False): #在父类上增加了is_alt属性
        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:  #图像位置移除屏幕 图像位置为rect.y 刚开始为0
            self.rect.y=-self.rect.height

class Enemy(GameSprite):
    '''敌机精灵'''
    def __init__(self):
        super().__init__("./images/enemy1.png")
        #敌机随机初始速度
        self.speed=random.randint(1,2)
        #敌机随机位置
        self.rect.bottom=0 #从顶端进入
        self.rect.x=random.randint(0,SCREEN_RECT.width-self.rect.width)



    def  update(self):
    #调用父类方法 保持垂直飞行
      super().update()
      if self.rect.y>=SCREEN_RECT.height:
          print('飞出屏幕 需要从精灵组删除')
          self.kill()
    def __del__(self): #内置方法 自动执行
        print('敌机死亡%s'% self.rect)


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):
        #英雄在水平方向上移动 只要修改x的值
        self.rect.x+=self.speed
        #控制英雄不能越界
        if self.rect.x<0:
            self.rect.x=0
        elif self.rect.x>SCREEN_RECT.width-self.rect.width:
            self.rect.x=SCREEN_RECT.width-self.rect.width
    def fire(self):
        print('发射子弹')
        for i in (0,1,2): #连续发射三颗子弹
            #创建子弹精灵
            bullet = Bullet()
            #设置精灵位置
            bullet.rect.bottom =self.rect.y-20*i
            bullet.rect.centerx=self.rect.centerx
            #将精灵添加到精灵组
            self.bullets.add(bullet)


class Bullet(GameSprite):
    def __init__(self):
        super().__init__("./images/bullet2.png",-3)


    def update(self):
        #调用父类方法 让子弹垂直方向飞行
        super().update()
        #判断子弹飞出屏幕
        if self.rect.bottom <0: #子弹出了屏幕
            self.kill() #删除子弹
    def __del__(self):
        print('子弹被销毁')

(3)游戏中需要的图片文件

 链接:https://pan.baidu.com/s/16NCbH19VDd7kIwzv0NbgAw 提取码:f990 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐