乐愚社区Beta

 编程语言  >  0基础学python(九)

0基础学python(九)

P2P  L3  • 2020-11-03 • 回复 6 • 只看楼主举报    

今天做个打飞机的小游戏??

首先安装pygame模块,win+r打开管理器输入cmd进入一个黑黑的窗口,(确保python加入环境变量)输入pip install pygame

首先导入需要的模块

import pygame
from pygame.locals import *

然后我们去网上找一些图片,己方飞机,敌方飞机,背景图,自家子弹,敌方子弹。

我们首先要创建一个窗口,看一下你们找的背景图的尺寸

 #1. 创建窗口
    screen = pygame.display.set_mode((480,852),0,32)

    #2. 创建一个背景图片
    background = pygame.image.load("填写背景图片存放的路径")

创建窗口后他就是那个黑黑的窗口,需要把背景图片填充进去,不然看着太黑了??接着我们进行背景填充,这里注意要加一个死循环,不然那个界面闪一下就结束了,因为代码执行完了就关闭了

while True:
        screen.blit(background, (0,0))#填充背景图片

这样简单的背景就做好了,现在我们开始创建玩家控制的飞机,这边引入一下类,大家都吃过月饼吧,?上面有很多花纹,花纹怎么来的?靠模具对吧,模具就相当于类,月饼就相当于实例对象,一个模具可以做很多个月饼,同样一个类可以有很多的实例对象,简单介绍一下类的写法

class Plane():#Plane是类的名字
    def __init__(self,name):
        '''初始化'''
        self.name = name
    def fly():#方法(在类里面定义的函数叫方法)
        print('%s正在飞'%(self.name))
#实例化对象
feiji = Plane('阿飞')
#调用类里面的方法
feiji.fly()

__init__前后都是两个下划线,起到初始化的作用,例如打游戏时像cf,lol每局游戏的开始的时候位置都一样的,可以加载一些信息,实例对象时会自动调用__init__方法self必须写,后面就是一些属性可以由用户输入就像上面的name

我们现在就可以开始创建玩家飞机了,这里注意一下游戏窗口的左上角为(0,0)建立直角坐标系向右x逐渐变大向下y逐渐变大,玩家飞机图片实际上是一个矩形的图片,看好玩家飞机图片的尺寸合理设置x,y坐标

class HeroPlane():
    def __init__(self, screen_temp):
        self.x = 210#x坐标
        self.y = 700#y的坐标
        self.screen = screen_temp#让玩家飞机出现在屏幕上
        self.image = pygame.image.load("玩家飞机图片路径")
        self.bullet_list = []#存储发射出去的子弹对象引用
hero = HeroPlane(screen)#实例对象

我们这里就简单想一下我们这个飞机要干啥首先就是出现在屏幕上,其次尽量放在中间靠下的位置这个坐标大家自己去试,然后飞机需要移动和发射子弹

先做一个移动的方法,这边不需要大家去理解,这个东西比较死板

def key_control(hero_temp):

    #获取事件,比如按键等
    for event in pygame.event.get():

        #判断是否是点击了退出按钮
        if event.type == QUIT:
            print("exit")
            exit()
        #判断是否是按下了键
        elif event.type == KEYDOWN:
            #检测按键是否是a或者left
            if event.key == K_a or event.key == K_LEFT:
                
                hero_temp.move_left()
            #检测按键是否是d或者right
            elif event.key == K_d or event.key == K_RIGHT:
                hero_temp.move_right()
            #检测按键是否是空格键
            elif event.key == K_SPACE:
                hero_temp.fire()
key_control(hero)

这边就是方向键和射击以及退出就写好了,然后我们在己方飞机的类里面定义一下移动就行了

def move_left(self):
        self.x -= 5

def move_right(self):
        self.x += 5

然后就是发射子弹的问题了

def display(self):
        self.screen.blit(self.image, (self.x, self.y))#让子弹显示在窗口上
        
        for bullet in self.bullet_list:
            bullet.display()
            bullet.move()
            if bullet.judge():#判断子弹是否越界
                self.bullet_list.remove(bullet)

子弹只是进行一个上下移动的问题我们让它出边界删除就行了,我们现在创建一个子弹类

class Bullet():
    def __init__(self, screen_temp, x, y):
        '''x,y为飞机坐标子弹的坐标应该在飞机头上所以要进行偏移'''
        self.x = x+40
        self.y = y-20
        self.screen = screen_temp
        self.image = pygame.image.load("子弹图片路径")

    def display(self):#子弹显示在屏幕上
        self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y-=20

    def judge(self):#判断是否出界
        if self.y<0:
            return True
        else:
            return False

然后创建敌方飞机的类,比较简单也不需要玩家控制方向,让它左右来回飘就行了,我就讲一下敌方的子弹发射问题,可以让一个变量储存一个随机数,当随机数等于几的时候就发射子弹

    def fire(self):
     #产生一个随机数
        random_num = random.randint(1,100) 
     #当随机数为10或99时敌机发射子弹
        if random_num == 10 or random_num == 99:
            self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))

接下来我就把完整的代码发一下

import pygame
from pygame.locals import *
import random

class HeroPlane():
    def __init__(self, screen_temp):
        self.x = 210
        self.y = 700
        self.screen = screen_temp
        self.image = pygame.image.load("玩家飞机图片路径")
        self.bullet_list = []#存储发射出去的子弹对象引用

    def display(self):
#图片显示在窗口上
        self.screen.blit(self.image, (self.x, self.y))
        
        for bullet in self.bullet_list:
            bullet.display()#显示子弹
            bullet.move()#子弹移动
            if bullet.judge():#判断子弹是否越界
                self.bullet_list.remove(bullet)

    def move_left(self):
        self.x -= 5

    def move_right(self):
        self.x += 5

    def fire(self):
        self.bullet_list.append(Bullet(self.screen, self.x, self.y))

class EnemyPlane(object):
    """敌机的类"""
    def __init__(self, screen_temp):
        self.x = 0#敌机位置
        self.y = 0
        self.screen = screen_temp
        self.image = pygame.image.load("敌机图片路径")
        self.bullet_list = []#存储发射出去的子弹对象引用
        self.direction = "right"#用来存储飞机默认的显示方向

    def display(self):
        #显示图片
        self.screen.blit(self.image, (self.x, self.y))
        
        for bullet in self.bullet_list:
            bullet.display()#显示敌方子弹
            bullet.move()#子弹移动
            if bullet.judge():#判断子弹是否越界
                self.bullet_list.remove(bullet)


    def move(self):
        
        if self.direction=="right":
            self.x += 5
        elif self.direction=="left":
            self.x -= 5
        '''由于图片也有大小所以边界应该是背景的x轴长度减去飞机x轴长度
        if self.x>480-50:
            self.direction = "left"
        elif self.x<0:
            self.direction = "right"

    def fire(self):
        random_num = random.randint(1,100) 
        if random_num == 8 or random_num == 20:
            self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))

class Bullet():
    def __init__(self, screen_temp, x, y):
        self.x = x+40
        self.y = y-20
        self.screen = screen_temp
        self.image = pygame.image.load("子弹图片路径")

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y-=20

    def judge(self):
        if self.y<0:
            return True
        else:
            return False

class EnemyBullet(object):
     #敌方子弹类
    def __init__(self, screen_temp, x, y):
        self.x = x+25
        self.y = y+40
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/bullet1.png")

    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y+=5

    def judge(self):
        if self.y>852:
            return True
        else:
            return False

def key_control(hero_temp):

    #获取事件,比如按键等
    for event in pygame.event.get():

        #判断是否是点击了退出按钮
        if event.type == QUIT:
            print("exit")
            exit()
        #判断是否是按下了键
        elif event.type == KEYDOWN:
            #检测按键是否是a或者left
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                hero_temp.move_left()
            #检测按键是否是d或者right
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                hero_temp.move_right()
            #检测按键是否是空格键
            elif event.key == K_SPACE:
                print('space')
                hero_temp.fire()

def main():
    #1. 创建窗口
    screen = pygame.display.set_mode((480,852),0,32)

    #2. 创建一个背景图片
    background = pygame.image.load("./feiji/background.png")

    #3. 创建一个飞机对象
    hero = HeroPlane(screen)

    #4. 创建一个敌机
    enemy = EnemyPlane(screen)

    while True:
        screen.blit(background, (0,0))
        hero.display()
        enemy.display()
        enemy.move()#调用敌机的移动方法
        enemy.fire()#敌机开火
        pygame.display.update()#更新图片
        key_control(hero)
if __name__ == "__main__":
    main()

就讲到这里了,点赞30出个完整版的坦克大战包括坦克爆炸效果


6条回帖
weisili  L0  评论于
(0)  回复(5) 1#
楼主是学计算机的么?关于软件检测一类的工作你觉得怎么样
P2P 楼主 :主要还看自己吧,毕业以后对口的专业没那么好找,如果是真的是想做程序员的话java或者c至少会一个,然后再学一个流行的语言
发表在2020-11-04 回复
P2P 楼主 :尽量在学校多学点东西吧,以后出来就没那么闲了
发表在2020-11-04 回复
weisili :嗯,毕业一年了,而且不是学的计算机。
发表在2020-11-05 回复
含了个秋 :回复 P2P:奏是,后悔大学不好好学,看着满屏的代码,陌生中带有一丝丝熟悉
发表在2020-11-05 回复
P2P 楼主 :自学的话其实就是看自控力吧,很多时候累了就休息了,每天能打200行代码就可以了
发表在2020-11-05 回复
  
:)
还没注册帐号?快来注册社区帐号,和我们一起嗨起来!
关于本社区

集各类兴趣爱好于一身的轻量化交流社区,在此您可以和他人一起分享交流您觉得有价值的内容,社区鼓励大家发表原创内容,为社区添砖加瓦!

发帖奖励 → 社区版规 → 招聘版主 →
推荐版块
扫描二维码下载社区APP
回到顶部