利用Pygame制作躲避僵尸游戏

目录
  • 游戏玩法
  • property()
  • 精灵类
  • 初始画面
  • 精灵移动函数
  • 加载玩家
  • 添加僵尸
  • 添加血包
  • 精灵相互碰撞事件
  • 完整代码

游戏玩法

根据神庙逃亡,实现一个人躲避僵尸的小游戏,主要的是精灵、精灵组之间相撞、相交的处理。

游戏开始随机出现一定的僵尸,随机移动,玩家在一位置上,如果僵尸靠近玩家一定距离,则玩家持续掉血。玩家通过上下左右移动躲避僵尸,屏幕会随机刷新一个加血包,玩家吃了就会加一定的血,并在此刷新血包。

property()

这个函数在类中返回新的属性

property(get,set,del,doc)

参数如上所示,get、set、del分别是获取设值删除调用的,doc是描述的。

精灵类

在原来的精灵类中添加方向和属性即可。

class MySprite(pygame.sprite.Sprite):
    def __init__(self, target):
        pygame.sprite.Sprite.__init__(self)
        self.master_image = None
        self.frame = 0
        self.old_frame = -1
        self.frame_width = 1
        self.frame_height = 1
        self.first_frame = 0
        self.last_frame = 0
        self.columns = 1
        self.last_time = 0
        self.direction = 0
        self.classification = "玩家"

    def load(self, filename, width, height, columns, direction, classification="玩家"):
        # 精灵的属性
        self.classification = classification
        # 方向
        self.direction = direction
        # 载入图片
        # 780 * 300
        self.master_image = pygame.image.load(filename).convert_alpha() # 载入图片
        self.frame_width = width
        self.frame_height = height
        self.rect = Rect(0, 0, width, height)
        self.columns = columns
        rect = self.master_image.get_rect()
        self.last_frame = (rect.width // width) * (rect.height // height) - 1 

    def update(self, current_time, rate=30): # current_time 更新频率 为30
        if current_time > self.last_time + rate: # 如果当前事件 大于 最后的时间 + 当前的节奏
            self.frame += 1 # 当前的帧数加一
            if self.frame > self.last_frame: # 当前最后一帧 则从第一帧开始
                self.frame = self.first_frame  # 从0开始
            self.last_time = current_time # 将最后帧值为30

        # build current frame only if it changed
        if self.frame != self.old_frame: # 当前帧数不等于老的一帧
            frame_x = (self.frame % self.columns) * self.frame_width
            frame_y = (self.frame // self.columns) * self.frame_height
            rect = (frame_x, frame_y, self.frame_width, self.frame_height) # 更新对应的位置
            self.image = self.master_image.subsurface(rect) # 循环箱已有的方向
            self.old_frame = self.frame

    def __str__(self):
        return str(self.frame) + "," + str(self.first_frame) + \
               "," + str(self.last_frame) + "," + str(self.frame_width) + \
               "," + str(self.frame_height) + "," + str(self.columns)

初始画面

和原来一样,先建立简单的画面。

import mySprite1
import pygame, sys, random
from pygame.locals import *

def print_text(font, x, y, text, color=(255, 255, 255)):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))

# 设置窗口
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("勇闯后半夜")
font = pygame.font.Font(None, 30)
timer = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    key = pygame.key.get_pressed()
    if key[K_ESCAPE]:
        sys.exit()

    screen.fill((50, 50, 100))

    pygame.display.update()

精灵移动函数

如果是僵尸遇到墙壁自动反方向走,根据方向改变对应的位置。

def reversal_direction(mySprite):
    direction = mySprite.direction
    if direction == 0:
        direction = 4
    elif direction == 2:
        direction = 6
    elif direction == 4:
        direction = 0
    elif direction == 6:
        direction = 2
    mySprite.direction = direction

def increment(mySprite, offset=1):
    # 上下左右
    direction = mySprite.direction
    rect = mySprite.rect
    if direction == 0:
        rect.y -= offset
    elif direction == 2:
        rect.x += offset
    elif direction == 4:
        rect.y += offset
    elif direction == 6:
        rect.x -= offset
    # 超出边界的处理
    # 超出边界flg
    boundary = False
    if rect.x < 0:
        rect.x = 0
        boundary = True
    if rect.x + mySprite.frame_width > 800:
        rect.x = 800 - mySprite.frame_width
        boundary = True
    if rect.y < 0:
        rect.y = 0
        boundary = True
    if rect.y + mySprite.frame_height > 600:
        rect.y = 600 - mySprite.frame_height
        boundary = True
    # 如果超出边界而且是僵尸的话 则反转方向
    if boundary and mySprite.classification == "僵尸":
        reversal_direction(mySprite)

加载玩家

这个是素材的图,如上所示,奇数行便是对应的方向移动。文件大小是768 * 768,可以分为96 * 96的8张。

加载玩家

# 玩家
play_group = pygame.sprite.Group()

play = mySprite1()
play.load("farmer walk.png", 96, 96, 8)
play.direction = -1
play_group.rect.x = 96
play_group.rect.y = 96
play_group.add(play)

	play_group.update(ticks, 50)
    screen.fill((50, 50, 100))

    play_group.draw(screen)
    pygame.display.update()

通过改变帧数修改,根据游戏的结束或是否移动,改变对应的事件

    if not game_over:
        play.first_frame = play.direction * play.columns
        play.last_frame = play.first_frame + play.columns - 1
        if play.frame < play.first_frame:
            play.frame = play.first_frame

    if not play_moving:
        play.frame = play.first_frame = play.last_frame
    else:
        increment(play)

控制交互

    if key[K_ESCAPE]:
        sys.exit()
    elif key[K_UP]:
        play.direction = 0
        play_moving = True
    elif key[K_DOWN]:
        play.direction = 4
        play_moving = True
    elif key[K_LEFT]:
        play.direction = 6
        play_moving = True
    elif key[K_RIGHT]:
        play.direction = 2
        play_moving = True
    else:
        play_moving = False

添加僵尸

# 随机生成20个僵尸
for n in range(0, 10):
    zombie = MySprite()
    random_direction = random.randint(0, 3) * 2
    zombie.load("zombie walk.png", 96, 96, 8, random_direction, "僵尸")
    zombie.rect.x = random.randint(0, 600)
    zombie.rect.y = random.randint(0, 500)
    print(zombie.rect)
    zombie_group.add(zombie)

         # 设置僵尸
        for z in zombie_group:
            z.first_frame = z.direction * z.columns
            z.last_frame = z.first_frame + z.columns - 1
            if z.frame < z.first_frame:
                z.frame = z.first_frame
            increment(z)

添加血包

血包就是单纯的一个图的展示。

health = MySprite()
health.load("health.png", 32, 32, 1)
health.rect.x = random.randint(0, 600)
health.rect.y = random.randint(0, 500)
health_group.add(health)

精灵相互碰撞事件

主要是僵尸和人 、人和血包之间的相撞事件

    # 相撞事件
    attack = None
    attack = pygame.sprite.spritecollideany(play, zombie_group)
    if attack is not None:
        if pygame.sprite.collide_rect_ratio(0.5)(play, attack):
            play_health -= 10
            attack.rect.x = random.randint(0, 600)
            attack.rect.y = random.randint(0, 500)
        else:
            attack = None

    if pygame.sprite.collide_rect_ratio(0.5)(play, health):
        play_health += 30
        if play_health > 100:
            play_health = 100
        health.rect.x = random.randint(0, 600)
        health.rect.y = random.randint(0, 500)

    if play_health <= 0:
        game_over = True

    # 显示血量
    pygame.draw.rect(screen, (100, 200, 100, 180), Rect(300, 575, 200, 25))
    pygame.draw.rect(screen, (50, 150, 150, 180), Rect(300, 575, play_health * 2, 25))

完整代码

import pygame, sys, random
from pygame.locals import *
from mySprite1 import *

def print_text(font, x, y, text, color=(255, 255, 255)):
    imgText = font.render(text, True, color)
    screen.blit(imgText, (x, y))

def reversal_direction(mySprite):
    direction = mySprite.direction
    if direction == 0:
        direction = 4
    elif direction == 2:
        direction = 6
    elif direction == 4:
        direction = 0
    elif direction == 6:
        direction = 2
    mySprite.direction = direction

def increment(mySprite, offset=1):
    # 上下左右
    direction = mySprite.direction
    rect = mySprite.rect
    if direction == 0:
        rect.y -= offset
    elif direction == 2:
        rect.x += offset
    elif direction == 4:
        rect.y += offset
    elif direction == 6:
        rect.x -= offset
    # 超出边界的处理
    # 超出边界flg
    boundary = False
    if rect.x < 0:
        rect.x = 0
        boundary = True
    if rect.x + mySprite.frame_width > 800:
        rect.x = 800 - mySprite.frame_width
        boundary = True
    if rect.y < 0:
        rect.y = 0
        boundary = True
    if rect.y + mySprite.frame_height > 600:
        rect.y = 600 - mySprite.frame_height
        boundary = True
    # 如果超出边界而且是僵尸的话 则反转方向
    if boundary and mySprite.classification == "僵尸":
        reversal_direction(mySprite)

# 设置窗口
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("勇闯后半夜")
font = pygame.font.Font(None, 30)
timer = pygame.time.Clock()
game_over = False

# 玩家
play_group = pygame.sprite.Group()

play = MySprite()
play.load("farmer walk.png", 96, 96, 8, 4)
play.rect.x = 96
play.rect.y = 96
play_moving = False
play_group.add(play)
play_health = 100

# 僵尸
zombie_group = pygame.sprite.Group()

# 随机生成20个僵尸
for n in range(0, 10):
    zombie = MySprite()
    random_direction = random.randint(0, 3) * 2
    zombie.load("zombie walk.png", 96, 96, 8, random_direction, "僵尸")
    zombie.rect.x = random.randint(0, 600)
    zombie.rect.y = random.randint(0, 500)
    print(zombie.rect)
    zombie_group.add(zombie)

# 血包
health_group = pygame.sprite.Group()

health = MySprite()
health.load("health.png", 32, 32, 1)
health.rect.x = random.randint(0, 600)
health.rect.y = random.randint(0, 500)
health_group.add(health)

while True:
    # 设置执行的频率
    timer.tick(30)
    ticks = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    key = pygame.key.get_pressed()
    if key[K_ESCAPE]:
        sys.exit()
    elif key[K_UP]:
        play.direction = 0
        play_moving = True
    elif key[K_DOWN]:
        play.direction = 4
        play_moving = True
    elif key[K_LEFT]:
        play.direction = 6
        play_moving = True
    elif key[K_RIGHT]:
        play.direction = 2
        play_moving = True
    else:
        play_moving = False

    if not game_over:
        # 设置玩家
        play.first_frame = play.direction * play.columns
        play.last_frame = play.first_frame + play.columns - 1
        if play.frame < play.first_frame:
            play.frame = play.first_frame
        # 设置僵尸
        for z in zombie_group:
            z.first_frame = z.direction * z.columns
            z.last_frame = z.first_frame + z.columns - 1
            if z.frame < z.first_frame:
                z.frame = z.first_frame
            increment(z)

    if not play_moving:
        play.frame = play.first_frame = play.last_frame
    else:
        increment(play)

    # 相撞事件
    attack = None
    attack = pygame.sprite.spritecollideany(play, zombie_group)
    if attack is not None:
        if pygame.sprite.collide_rect_ratio(0.5)(play, attack):
            play_health -= 10
            attack.rect.x = random.randint(0, 600)
            attack.rect.y = random.randint(0, 500)
        else:
            attack = None

    if pygame.sprite.collide_rect_ratio(0.5)(play, health):
        play_health += 30
        if play_health > 100:
            play_health = 100
        health.rect.x = random.randint(0, 600)
        health.rect.y = random.randint(0, 500)

    if play_health <= 0:
        game_over = True

    play_group.update(ticks, 50)
    zombie_group.update(ticks, 50)
    health_group.update(ticks, 50)
    screen.fill((50, 50, 100))

    play_group.draw(screen)
    zombie_group.draw(screen)
    health_group.draw(screen)

    # 显示血量
    pygame.draw.rect(screen, (100, 200, 100, 180), Rect(300, 575, 200, 25))
    pygame.draw.rect(screen, (50, 150, 150, 180), Rect(300, 575, play_health * 2, 25))

    if game_over:
        print_text(font, 300, 100, "GAME OVER!!!")
    pygame.display.update()

到此这篇关于利用Pygame制作躲避僵尸游戏的文章就介绍到这了,更多相关Pygame躲避僵尸游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python+Pygame实战之疯狂吃水果游戏的实现

    目录 导语 一.准备中 1)游戏玩法 2)环境安装 3)素材准备 二.代码展示 三.效果展示 导语 嘿嘿!木木子今日闪现——已经给大家写了很多内容啦~ 涉及的人工智能.初学者.爬虫.数据分析(这方面的一般不过审核)游戏........ PS: 吃豆人我写过了哈 Python+Pygame实战之吃豆豆游戏的实现 切水果我写过了哈 Python Pygame实战之水果忍者游戏的实现 今天二者集合,做出一款新游戏,哈哈哈,名字叫做<疯狂

  • Python+Pygame实战之泡泡游戏的实现

    目录 导语 一.环境安装 二.代码展示 三.效果展示 导语 泡泡王国 欢乐多多 咕噜噜,吹泡泡,七彩泡泡满天飘.大的好像彩气球,小的就像紫葡萄. ​当泡泡漫天飞舞时,大朋友.小朋友都会情不自禁地被它吸引.而当珍珠般的泡泡遇上可爱的程序员门时,又会出现什么样的美丽风景呢? 说到4399小游戏,没有人会陌生吧?我小时候经常趁着家长不在家的时候偷偷打开电脑打开小游戏的网页,在电脑桌前一坐就是一下午,真的不能赖我不适可而止,而是这些游戏真的太好 玩了!关于童年的经典游戏and有关泡泡的,之前已经仿写了一

  • Python+Pygame实现之走四棋儿游戏的实现

    目录 导语 一.游戏解说 二.游戏规则 三.环境安装 四.代码展示 五.效果展示 导语 大家以前应该都听说过一个游戏:叫做走四棋儿 这款游戏出来到现在时间挺长了,小时候的家乡农村条件有限,附近也没有正式的玩具店能买到玩具,因此小朋友们聚在一起玩耍时,其玩具大多都是就地取材的. 直接在家里的水泥地上用烧完的炭火灰画出几条线,摆上几颗石头子即可.当时的火爆程度可谓是达到了一个新的高度.包括我当时也比较喜欢这款游戏.因为时间推移,小时候很多游戏都已经在现在这个时代看不到啦! 今天小编就带大家追忆童年—

  • Pygame游戏开发之太空射击实战入门篇

    目录 视频 入门 游戏循环 1. 处理输入(或事件) 2. 更新游戏 3. 渲染(或绘制) 时钟 构建 Pygame 模板 渲染/绘制部分 输入/事件部分 控制屏幕刷新频率 结束语 本部分代码 视频 观看视频 入门 pygame 这是我们教程系列“使用 Pygame 进行游戏开发”的第 1 部分.它适用于对游戏开发和提高Python编码技能感兴趣的初学者/中级程序员. 什么是Pygame Pygame是一个“游戏库” - 一套帮助程序员制作游戏的工具.其中一些内容是: 图形和动画 声音(包括音乐

  • Pygame游戏开发之太空射击实战精灵的使用上篇

    目录 视频 使用精灵 什么是精灵 创建一个精灵 精灵运动 视频 观看视频 使用精灵 这是我们“使用 Pygame 进行游戏开发”教程系列的第 2 部分.您应该从第 1 部分开始:入门 什么是精灵 sprite 是一个计算机图形术语,指屏幕上可以移动的任何对象.当您玩任何2D游戏时,您在屏幕上看到的所有对象都是精灵.精灵可以是动画的,它们可以由玩家控制,甚至可以相互交互. 我们将在游戏循环的更新和绘制部分中负责更新和绘制精灵.但您可能可以想象,如果您的游戏具有大量精灵,那么游戏循环的这些部分可能会

  • 教你用Pygame制作简单的贪吃蛇游戏

    目录 1.序言 2.安装与导入 3.定义后续需要的参数 4.绘制蛇与食物 5.游戏规则与运行 6.成品展示 7.完整代码 总结 1.序言 目前基本上软测会用到的工具或者第三方库都已经被写完,本着不要逮着一只羊进行薅羊毛原则,换个赛道,这次就使用pygame库写个简单的贪吃蛇吧,当做熟悉python练手也是不错的. 2.安装与导入 使用pip install pygame进入安装,安装成功后导入所需模块: import pygame,sys,random from pygame.locals im

  • 教你使用Python的pygame模块实现拼图游戏

    目录 pygame介绍 安装pygame pygame常用模块 pygame入门案例 pygame实现拼图游戏 总结 pygame介绍 Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统,具有良好的跨平台性.Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费.开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生. Pygame 在 SDL(Simple Di

  • Python+Pygame实现之见缝插针游戏的实现

    目录 前言 ​一.运行环境 二.代码展示 三.效果展示 ​总结 前言 姥姥说: 炎炎夏日热浪来袭. 有点让人无法忍受... 一动就是一身汗..... 想玩点小游戏都没地方玩了... <见缝插针>游戏小程序好玩吗?<见缝插针>小游戏怎么玩? 只有你想不到,没有我不会敲代码的好游戏!「良心好游戏推荐」——栗子同学强势来袭! 每天都会推荐好玩的小游戏.小编今天推荐这款游戏叫<见缝插针>,这是一个考验玩家首脑协调.反应力的小游戏,这种游戏很常见,居然还没有推荐过!今天赶紧来补上

  • Python+Pygame实战之吃豆豆游戏的实现

    目录 导语​ 一.首先 ​二.正式开始 三.效果展示 导语​ ​昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉 于是,我在想怎么能够保证我达到吃完所有豆豆的目标,然后我就想到了一个办法: 自己找资料找素材学习仿写了一款吃豆豆的小游戏,然后给我自己无限开挂! 哈哈哈!这不?完全解决了我的问题,完美的躺赢了!聪明的我.jpg 一.首先 1)素材 首先找到吃豆豆游戏的界面按照上面的素材找找准备下相似的图片!如下: 2)环境 本文的环境都跟之前的

  • 利用Pygame制作躲避僵尸游戏

    目录 游戏玩法 property() 精灵类 初始画面 精灵移动函数 加载玩家 添加僵尸 添加血包 精灵相互碰撞事件 完整代码 游戏玩法 根据神庙逃亡,实现一个人躲避僵尸的小游戏,主要的是精灵.精灵组之间相撞.相交的处理. 游戏开始随机出现一定的僵尸,随机移动,玩家在一位置上,如果僵尸靠近玩家一定距离,则玩家持续掉血.玩家通过上下左右移动躲避僵尸,屏幕会随机刷新一个加血包,玩家吃了就会加一定的血,并在此刷新血包. property() 这个函数在类中返回新的属性 property(get,set

  • 利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 游戏简介: 将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状.游戏目标为通过移动非空白块将随机摆放获得的图像恢复成原图像的模样,且规定移动操作仅存在于非空白块移动到空白块. 例如下图所示:

  • 使用python和pygame制作挡板弹球游戏

    python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 GitHub: EasyBaffleBallGame # -*- coding:utf-8 -*- from sys import exit import pygame from pygame.locals import * pygame.init() # 创建窗口 ScreenWidth = 5

  • python实战之利用pygame实现贪吃蛇游戏(二)

    一.前言 在上一篇博客中,我们实现了基本的界面搭建,这次实现一下逻辑部分. 二.创建蛇 首先,先分析一下蛇的移动,不然我们一定会吃亏的(别问,问就是自己写了一堆无效代码). 蛇的移动其实并没有想象中那样复杂,每一个模块都需要有一个方向,按照方向进行移动. 其实实际上就是一个出队的感觉,即每一个元素都取代上一个元素的位置,然后再按照贪吃蛇当前的方向,移动一下头节点即可. snake.py: """"

  • python实战之利用pygame实现贪吃蛇游戏(一)

    一.前言 之前尝试了自己用pygame写井字棋,这次玩的是贪吃蛇系列. 个人感觉模块可能会比较大,所以选择将函数和主要逻辑代码分在了两个文件中. fuc为函数模块,存储了事件感应和刷新界面等部分. main模块则是游戏的核心. 二.搭建界面 这里我就不重复了,可以先看一下这篇博客 其中界面的基本要素都有. main.py import pygame from fuc import * # 基本属性 lattice_wh = 20 #长宽 snake_color = (84, 255, 159)

  • 利用Matlab制作三子棋游戏的示例代码

    效果: 注: 由于用uifigure和uiaxes写的会比较慢,改成常规的axes和figure会快很多. 完整代码: function OX_chess fig=uifigure('units','pixels',... 'position',[350 100 500 500],... 'Numbertitle','off',... 'name','OX_chess',... 'Color',[1 1 1],... 'resize','off',... 'menubar','none'); a

  • 利用Pygame制作简单动画的示例详解

    目录 前言 计时器 绘制精灵 加载精灵 完整代码 前言 实现一个帧动画,使用的一个图,根据不同的时间显示不同的图. 使用的就是如下所示的一张图,宽度780 * 300 ,使用加载图片 260 * 150来实现. pygame.init() screen = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption("动画") while True: for event in pygame.event.ge

  • 教你利用pygame模块制作跳跃小球小游戏

    前言 pygame是用来开发游戏的一套基于SDL的模板,它可以是python创建完全界面化的游戏和多媒体程序,而且它基本上可以在任何系统上运行.本文将详细介绍你利用pygame模块制作跳跃小球小游戏的相关内容,下面来一起看看吧 实现方法 首先创建一个游戏窗口,然后再窗口内创建一个小球.以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动.可以按照如下步骤实现该功能. (1)首先来创建一个游戏窗口,宽和高设置为640×480.代码如下: import sys #导入sys模块 im

  • 详解如何利用Python制作24点小游戏

    目录 先睹为快 游戏规则(改编自维基百科) 逐步实现 Step1:制作24点生成器 Step2:定义游戏精灵类 Step3:实现游戏主循环 先睹为快 24点 游戏规则(改编自维基百科) 从1~10这十个数字中随机抽取4个数字(可重复),对这四个数运用加.减.乘.除和括号进行运算得出24.每个数字都必须使用一次,但不能重复使用. 逐步实现 Step1:制作24点生成器 既然是24点小游戏,当然要先定义一个24点游戏生成器啦.主要思路就是随机生成4个有解的数字,且范围在1~10之间,代码实现如下:

  • 如何利用Matlab制作一款真正的拼图小游戏

    效果: 简单原理介绍: 1构造0,1矩阵作为每片拼图的透明度,可以构造出不规则形状的拼图(image函数有alphaData属性可以设置) jigsawMask=zeros(101*5,101*5); jigsawMask(102:404,102:404)=1; [xMesh,yMesh]=meshgrid(1:101*5,1:101*5); dis1=sqrt((xMesh-51).^2+(yMesh-253).^2); dis2=sqrt((xMesh-505+50).^2+(yMesh-2

随机推荐