Python+Pygame实现神庙逃亡游戏

目录
  • 游戏规则
  • 精灵类
  • 加载龙
  • 加载子弹
  • 添加玩家
  • 碰撞事件
  • 完整代码

游戏规则

用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避子弹,如果子弹命中玩家或者名字龙都会减速,玩家躲避子弹使更多的子弹打在龙上,当玩家被龙抓到,则游戏输,如果龙被子弹减少速度,与玩家有一定的距离,则玩家获胜。

精灵类

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 

    def _getx(self):
        return self.rect.x

    def _setx(self, value):
        self.rect.x = value

    X = property(_getx, _setx)

    def _gety(self):
        return self.rect.y

    def _sety(self, value):
        self.rect.y = value

    Y = property(_gety, _sety)

    def _getpos(self):
        return self.rect.topleft

    def _setpos(self, pos):
        self.rect.topleft = pos

    position = property(_getpos, _setpos)

    def load(self, filename, width, height, columns):
        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):
        if current_time > self.last_time + rate:
            self.frame += 1
            if self.frame > self.last_frame:
                self.frame = self.first_frame
            self.last_time = current_time

        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 = pygame.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) + \
               "," + str(self.rect)

MySprite继承精灵类,因为在做动画时候,需要许多的参数,这里进行了初始化,master_image 图片的位置,frame、old_frame分别储存第一帧和上一帧的位置,frame_width和frame_height保存宽高,first和last保存帧的第一帧和最后一帧。columns保存列数。last_time时间变量。
X、Y、pos保存精灵的位置x和y的位置。

load载入,赋予对应精灵的值,(rect.width // width) * (rect.height // height) - 1,通过给定的图片的宽高除以参数的值,-1就是初始的位置是从0开始的。

update更新的时候,根据传入的时间和间隔频率,如果时间大于上次时间和间隔则改变帧数,如果帧数改变对应的图片位置也改变,实现动态变化。

加载龙

dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)

arrow_vel = 8.0
game_over = False
you_win = False
player_jumping = False
jump_vel = 0.0

while True:
    framerate.tick(30)
    ticks = pygame.time.get_ticks()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_ESCAPE]:
        sys.exit()
    elif keys[pygame.K_SPACE]:
        if not player_jumping:
            player_jumping = True
            jump_vel = -8.0

    screen.blit(bg, (0, 0))

    if not game_over:
        group.update(ticks, 50)

    group.draw(screen)

    print_text(font, 350, 360, "Press SPACE to jump!")

    if game_over:
        print_text(font, 360, 100, "G A M E O V E R")
        if you_win:
            print_text(font, 330, 130, "YOU BEAT THE DRAGON")
        else:
            print_text(font, 330, 130, "THE DRAGON GOT YOU")
    pygame.display.update()

加载龙,实现龙动画,这里没有龙的位移,玩家躲子弹或者命中子弹都会导致双方的x坐标减少,这里没使用对应的速度改变,减少游戏的开发难度。

加载子弹

def reset_arrow():
    y = random.randint(250, 350)
    arrow.position = 800, y

arrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800, 320
group.add(arrow)

子弹因为只有一个,如果击中则需要重置,这里写了重置子弹的函数便于调用,random.randint(250, 350)给子弹一个随机的高度。使游戏与变化。

添加玩家

player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)

player_start_y = player.Y

player_start_y记录玩家初始的y坐标判断玩家是否处于跳跃状态中。

碰撞事件

    if not game_over:
        arrow.X -= arrow_vel
        if arrow.X < 40:
            reset_arrow()

    if pygame.sprite.collide_rect(arrow, player):
        reset_arrow()
        player.X -= 10

    if pygame.sprite.collide_rect(arrow, dragon):
        reset_arrow()
        dragon.X -= 10

    if pygame.sprite.collide_rect(player, dragon):
        game_over = True

    if dragon.X < -100:
        you_win = True
        game_over = True

    if player_jumping:
        player.Y += jump_vel
        jump_vel += 0.5
        if player.Y > player_start_y:
            player_jumping = False
            player.Y = player_start_y
            jump_vel = 0.0

这里需要检验玩家、子弹和龙两两相碰的事件。

完整代码

import sys, time, random, math, pygame
from pygame.locals import *

class MySprite(pygame.sprite.Sprite):
    def __init__(self, target):
        pygame.sprite.Sprite.__init__(self)  # extend the base Sprite class
        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

    # X property
    def _getx(self):
        return self.rect.x

    def _setx(self, value):
        self.rect.x = value

    X = property(_getx, _setx)

    # Y property
    def _gety(self):
        return self.rect.y

    def _sety(self, value):
        self.rect.y = value

    Y = property(_gety, _sety)

    # position property
    def _getpos(self):
        return self.rect.topleft

    def _setpos(self, pos):
        self.rect.topleft = pos

    position = property(_getpos, _setpos)

    def load(self, filename, width, height, columns):
        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
        # try to auto-calculate total frames
        rect = self.master_image.get_rect()
        self.last_frame = (rect.width // width) * (rect.height // height) - 1

    def update(self, current_time, rate=30):
        # update animation frame number
        if current_time > self.last_time + rate:
            self.frame += 1
            if self.frame > self.last_frame:
                self.frame = self.first_frame
            self.last_time = current_time

        # 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 = pygame.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) + \
               "," + str(self.rect)

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

def reset_arrow():
    y = random.randint(250, 350)
    arrow.position = 800, y

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Escape Dragon")
font = pygame.font.Font(None, 18)
framerate = pygame.time.Clock()

bg = pygame.image.load('background.png').convert_alpha()

group = pygame.sprite.Group()

dragon = MySprite(screen)
dragon.load("dragon.png", 260, 150, 3)
dragon.position = 100, 230
group.add(dragon)

player = MySprite(screen)
player.load("caveman.png", 50, 64, 8)
player.first_frame = 1
player.last_frame = 7
player.position = 400, 303
group.add(player)

arrow = MySprite(screen)
arrow.load("flame.png", 40, 16, 1)
arrow.position = 800, 320
group.add(arrow)

arrow_vel = 8.0
game_over = False
you_win = False
player_jumping = False
jump_vel = 0.0
player_start_y = player.Y

while True:
    framerate.tick(30)
    ticks = pygame.time.get_ticks()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_ESCAPE]:
        sys.exit()
    elif keys[pygame.K_SPACE]:
        if not player_jumping:
            player_jumping = True
            jump_vel = -8.0

    if not game_over:
        arrow.X -= arrow_vel
        if arrow.X < 40:
            reset_arrow()

    if pygame.sprite.collide_rect(arrow, player):
        reset_arrow()
        player.X -= 10

    if pygame.sprite.collide_rect(arrow, dragon):
        reset_arrow()
        dragon.X -= 10

    if pygame.sprite.collide_rect(player, dragon):
        game_over = True

    if dragon.X < -100:
        you_win = True
        game_over = True

    if player_jumping:
        player.Y += jump_vel
        jump_vel += 0.5
        if player.Y > player_start_y:
            player_jumping = False
            player.Y = player_start_y
            jump_vel = 0.0

    screen.blit(bg, (0, 0))

    if not game_over:
        group.update(ticks, 50)

    group.draw(screen)

    print_text(font, 350, 360, "Press SPACE to jump!")

    if game_over:
        print_text(font, 360, 100, "G A M E O V E R")
        if you_win:
            print_text(font, 330, 130, "YOU BEAT THE DRAGON")
        else:
            print_text(font, 330, 130, "THE DRAGON GOT YOU")
    pygame.display.update()

以上就是Python+Pygame实现神庙逃亡游戏的详细内容,更多关于Python Pygame神庙逃亡的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用python+pygame开发消消乐游戏附完整源码

    效果是这样的 ↓ ↓ ↓ 一.环境要求 windows系统,python3.6+ pip21+ 开发环境搭建地址 一起来学pygame吧 游戏开发30例(开篇词)--环境搭建+游戏效果展示 安装游戏依赖模块 pip install pygame 二.游戏简介 消消乐应该大家都玩过,或者看过.这个花里胡哨的小游戏 用python的pygame来实现,很简单. 今天带大家,用Python来实现一下这个花里胡哨的小游戏. 三.完整开发流程 1.项目主结构 首先,先整理一下项目的主结构,其实看一下主结构

  • Python+Pygame实现趣味足球游戏

    目录 导语 一.环境安装 二.代码展示 三.效果展示 1)加载界面 2)开始游戏界面 3)开始游戏 ​4)游戏运行 导语 ​足球运动有着“世界第一运动”的美称,还是全球最具影响力的体育运动项目之一. ​小小的足球在滚动中能释放满满的能量和快乐. 足球游戏不仅可以锻炼大家的协调和反应能力,还能提高身体素质哦~ 喜欢足球的小可爱,这一期可以大饱眼福啦 小编准备出一期关于足球的编程代码给大家哦~还有那些喜欢看足球赛的可以自己上jio啦​ ​​温馨提示: 足球游戏时,一定要注意.场地要安全,服装要选好.

  • Python Pygame实战之打地鼠小游戏

    目录 前言 开发工具 环境搭建 原理简介 前言 今天给大家写一个个打地鼠小游戏,废话不多说直接开始- 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠~ 首先,让我们确定一下游戏中有哪些元素.打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类: '''地鼠'

  • Python Pygame实战之水果忍者游戏的实现

    目录 一.准备中 1.0游戏规则 1.1游戏图片素材(可修改) 1.2游戏字体素材(可修改) 二.环境安装 三.开始敲代码 3.0设置界面玩家生命值等 3.1导入模块 3.2界面背景.字体设置 3.3游戏窗口设置 3.4随机生成水果的位置与数据存放 3.5用一个字典来存放水果的数据 3.6在屏幕中绘制字体 3.7绘制玩家的生命 3.8游戏开始与结束画面 3.9游戏主循环 四.游戏展示效果 导语 Hey!下午好,我是木木子,关注我,一起玩游戏吧~ ​ ​微信小游戏很久之前刮起了一股切水果热潮,还记

  • python pygame 愤怒的小鸟游戏示例代码

    小鸟(image) 游戏展示 代码展示 import pygame,sys pygame.init()#初始化操作 #保存窗口大小 width,height=600,400 screen=pygame.display.set_mode([width,height])#创建游戏窗口 #设置窗口标题 pygame.display.set_caption("愤怒的小鸟") #加载小鸟素材 player=pygame.image.load("xiaoniao.png") #

  • Python Pygame实战之塔防游戏的实现

    目录 一.环境要求 二.游戏介绍 1.游戏目标 2.先上游戏效果图 三.完整开发流程 1.项目主结构 2.详细配置 3.定义敌人.塔楼.子弹的类 4.游戏开始:选择难度地图 5.游戏开始界面 6.游戏运行 7.游戏暂停 8.游戏结束及分数 9.引入音频.图片.地图.难度json 四.游戏启动方法 一.环境要求 windows系统,python3.6+ 安装模块 pip install pyqt5 pip install pygame 二.游戏介绍 1.游戏目标 按照关卡,设计不同的塔防地图(博主

  • Python+Pygame实现神庙逃亡游戏

    目录 游戏规则 精灵类 加载龙 加载子弹 添加玩家 碰撞事件 完整代码 游戏规则 用pygame动画实现神庙逃亡类似的小游戏,当玩家移动的时候躲避子弹,如果子弹命中玩家或者名字龙都会减速,玩家躲避子弹使更多的子弹打在龙上,当玩家被龙抓到,则游戏输,如果龙被子弹减少速度,与玩家有一定的距离,则玩家获胜. 精灵类 class MySprite(pygame.sprite.Sprite): def __init__(self, target): pygame.sprite.Sprite.__init_

  • python PyGame五子棋小游戏

    目录 前言 五子棋小游戏 1.简介 2.环境准备 3.初始化环境 4.棋盘 5.黑白棋子 6.对局信息 7.AI 8.完善 总结 前言 PyGame 是一个专门设计来进行游戏开发设计的 Python 模块,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚,使用起来非常的简单,非常适合新手拿来玩耍,本教程源码均基于 Python 3.x 版本. 五子棋小游戏 1.简介 五子棋是我们小时候经常玩的两人对弈策略小游戏,规则简单: 1.对局双方各执一色棋子,常为黑白两色:2.空棋盘开局:

  • python pygame实现2048游戏

    实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码. 效果图 代码 # -*- coding: utf-8 -*- #!/usr/bin/python ''' Created on May 31, 2014 @author: yuanzi ''' import random import sys import pygame from pygame.locals import * PIXEL = 150 SCORE_PI

  • 基于Python Pygame实现的画饼图游戏

    目录 导入包 配置基本参数 根据输入的数字改变扇形的个数 监听事件 这个游戏就是实现键盘上输入不同的数字,将圆分割成不同的几个部分,每部分用不同的颜色来实现. 导入包 导入随机包,pygame,系统包,time时间包用于时间暂停.math是用来确认弧度的. import random import pygame, sys, time import math from pygame.locals import * 配置基本参数 初始化pygame,设置窗口大小标题,设置圆心的x和y轴,圆的半径,线

  • Python Pygame实现落球游戏详解

    目录 引包 初始化配置 捕捉事件 填充屏幕让球下落 完整代码 引包 引入对应的包,和原来一样写一个打印文字的方法 import sys, random,  pygame from pygame.locals import * def print_text(font, x, y, text, color=(255, 255, 255)):     img_text = font.render(text, True, color)     screen.blit(img_text, (x, y))

  • Python+Pygame实战之24点游戏的实现

    目录 导语 游戏介绍 实现代码 游戏效果展示 导语 我第一次玩24点是初中的时候,那时候和堂弟表哥在堂妹家玩,堂妹提出玩24点游戏,堂妹比我们小三岁,可能正在上小学吧. 拿出一副扑克牌去掉大小怪和花牌,从剩下的牌里随便找出四张,谁能先用加减乘除算出24就算赢. 如果大家都同意放弃或者有人计算出来就重新开始一局.结果是我们三个哥哥都输多赢少,堂妹显然是经过了准备的. 其实24点小游戏除了能用来无聊的时候跟朋友与一起玩儿下,还能锻炼思维能力,尤其是家里的小孩子提升数学能力 多锻炼还是很有好处的,尤其

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

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

  • Python+Pygame实战之英文版猜字游戏的实现

    目录 导语 一.运行环境 二.素材(图片等) 三.代码展示 四.效果展示 导语 当下的孩子们多少会被电子产品“侵袭”,那么既然都要玩游戏,为什么不选既能玩又能收获知识的呢? 兴趣是最大的学习推动力,当学习英语变成一款小游戏时,不仅能够玩游戏,激发调动孩子的积极性,还能够让孩子们在娱乐中潜移默化地掌握英语的学习技巧哦~ 今天木子为大家敲了一款简单的英语版<神奇的猜字小游戏>,分享给大家,希望能帮到大家.如果您是一位热心于辅导孩子学习英语的家长,上面这款游戏也不妨用一用,试一试哦~ (文中代码仅供

  • Python+Pygame实战之炫舞小游戏的实现

    目录 导语 一.环境安装 二.代码展示 三.效果展示 1)简洁版炫舞 ​2)随机截图 3)MISS节拍 导语 昨天去老姐家里蹭饭,进门的时候就看到佳佳妹(我姐的女儿)低头霹雳吧啦一顿操作猛如虎,饭好了都还在玩儿,什么东西这么好玩?一走进就看到这是一款酷似炫舞的小游戏.(死去的回忆突然在攻击我~没想到现在还有这款游戏就是不知道升级了多少次啦) 不知道你们还记不记得曾经有个风靡一时的舞蹈游戏炫舞. 我读小学的时候,大概是09年吧,这个游戏非常火爆,如果你去网吧,十个女生里,有十一个都是在玩炫舞,像我

随机推荐