Python实现滑雪小游戏


Posted in Python onSeptember 25, 2021

本文实例为大家分享了Python实现滑雪小游戏的具体代码,供大家参考,具体内容如下

Python实现滑雪小游戏

源码分享:

import sys
import cfg
import pygame
import random
 
 
'''滑雪者类'''
class SkierClass(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        # 滑雪者的朝向(-2到2)
        self.direction = 0
        self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
        self.image = pygame.image.load(self.imagepaths[self.direction])
        self.rect = self.image.get_rect()
        self.rect.center = [320, 100]
        self.speed = [self.direction, 6-abs(self.direction)*2]
    '''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''
    def turn(self, num):
        self.direction += num
        self.direction = max(-2, self.direction)
        self.direction = min(2, self.direction)
        center = self.rect.center
        self.image = pygame.image.load(self.imagepaths[self.direction])
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.speed = [self.direction, 6-abs(self.direction)*2]
        return self.speed
    '''移动滑雪者'''
    def move(self):
        self.rect.centerx += self.speed[0]
        self.rect.centerx = max(20, self.rect.centerx)
        self.rect.centerx = min(620, self.rect.centerx)
    '''设置为摔倒状态'''
    def setFall(self):
        self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
    '''设置为站立状态'''
    def setForward(self):
        self.direction = 0
        self.image = pygame.image.load(self.imagepaths[self.direction])
 
 
'''
Function:
    障碍物类
Input:
    img_path: 障碍物图片路径
    location: 障碍物位置
    attribute: 障碍物类别属性
'''
class ObstacleClass(pygame.sprite.Sprite):
    def __init__(self, img_path, location, attribute):
        pygame.sprite.Sprite.__init__(self)
        self.img_path = img_path
        self.image = pygame.image.load(self.img_path)
        self.location = location
        self.rect = self.image.get_rect()
        self.rect.center = self.location
        self.attribute = attribute
        self.passed = False
    '''移动'''
    def move(self, num):
        self.rect.centery = self.location[1] - num
 
 
'''创建障碍物'''
def createObstacles(s, e, num=10):
    obstacles = pygame.sprite.Group()
    locations = []
    for i in range(num):
        row = random.randint(s, e)
        col = random.randint(0, 9)
        location  = [col*64+20, row*64+20]
        if location not in locations:
            locations.append(location)
            attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
            img_path = cfg.OBSTACLE_PATHS[attribute]
            obstacle = ObstacleClass(img_path, location, attribute)
            obstacles.add(obstacle)
    return obstacles
 
 
'''合并障碍物'''
def AddObstacles(obstacles0, obstacles1):
    obstacles = pygame.sprite.Group()
    for obstacle in obstacles0:
        obstacles.add(obstacle)
    for obstacle in obstacles1:
        obstacles.add(obstacle)
    return obstacles
 
 
'''显示游戏开始界面'''
def ShowStartInterface(screen, screensize):
    screen.fill((255, 255, 255))
    tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
    cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
    title = tfont.render(u'滑雪游戏', True, (255, 0, 0))
    content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))
    trect = title.get_rect()
    trect.midtop = (screensize[0]/2, screensize[1]/5)
    crect = content.get_rect()
    crect.midtop = (screensize[0]/2, screensize[1]/2)
    screen.blit(title, trect)
    screen.blit(content, crect)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                return
        pygame.display.update()
 
 
'''显示分数'''
def showScore(screen, score, pos=(10, 10)):
    font = pygame.font.Font(cfg.FONTPATH, 30)
    score_text = font.render("Score: %s" % score, True, (0, 0, 0))
    screen.blit(score_text, pos)
 
 
'''更新当前帧的游戏画面'''
def updateFrame(screen, obstacles, skier, score):
    screen.fill((255, 255, 255))
    obstacles.draw(screen)
    screen.blit(skier.image, skier.rect)
    showScore(screen, score)
    pygame.display.update()
 
 
'''主程序'''
def main():
    # 游戏初始化
    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load(cfg.BGMPATH)
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    # 设置屏幕
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.display.set_caption('滑雪游戏 —— 九歌')
    # 游戏开始界面
    ShowStartInterface(screen, cfg.SCREENSIZE)
    # 实例化游戏精灵
    # --滑雪者
    skier = SkierClass()
    # --创建障碍物
    obstacles0 = createObstacles(20, 29)
    obstacles1 = createObstacles(10, 19)
    obstaclesflag = 0
    obstacles = AddObstacles(obstacles0, obstacles1)
    # 游戏clock
    clock = pygame.time.Clock()
    # 记录滑雪的距离
    distance = 0
    # 记录当前的分数
    score = 0
    # 记录当前的速度
    speed = [0, 6]
    # 游戏主循环
    while True:
        # --事件捕获
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    speed = skier.turn(-1)
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    speed = skier.turn(1)
        # --更新当前游戏帧的数据
        skier.move()
        distance += speed[1]
        if distance >= 640 and obstaclesflag == 0:
            obstaclesflag = 1
            obstacles0 = createObstacles(20, 29)
            obstacles = AddObstacles(obstacles0, obstacles1)
        if distance >= 1280 and obstaclesflag == 1:
            obstaclesflag = 0
            distance -= 1280
            for obstacle in obstacles0:
                obstacle.location[1] = obstacle.location[1] - 1280
            obstacles1 = createObstacles(10, 19)
            obstacles = AddObstacles(obstacles0, obstacles1)
        for obstacle in obstacles:
            obstacle.move(distance)
        # --碰撞检测
        hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
        if hitted_obstacles:
            if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
                score -= 50
                skier.setFall()
                updateFrame(screen, obstacles, skier, score)
                pygame.time.delay(1000)
                skier.setForward()
                speed = [0, 6]
                hitted_obstacles[0].passed = True
            elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
                score += 10
                obstacles.remove(hitted_obstacles[0])
        # --更新屏幕
        updateFrame(screen, obstacles, skier, score)
        clock.tick(cfg.FPS)
 
 
'''run'''
if __name__ == '__main__':
    main();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python生成词云的实现方法(推荐)
Jun 13 Python
Python上下文管理器和with块详解
Sep 09 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
Python 12306抢火车票脚本
Feb 07 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
python中如何打包用户自定义模块
Sep 23 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
Python极值整数的边界探讨分析
Sep 15 #Python
Python办公自动化PPT批量转换操作
Sep 15 #Python
Python办公自动化解决world文件批量转换
Sep 15 #Python
Python函数式编程中itertools模块详解
Sep 15 #Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 #Python
Python3.10的一些新特性原理分析
Sep 15 #Python
You might like
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
Extjs 几个方法的讨论
2010/01/28 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
javascript实现计算器功能
2020/03/30 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python求crc32值的方法
2014/10/05 Python
Python格式化css文件的方法
2015/03/10 Python
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python中字典的基本知识初步介绍
2015/05/21 Python
用Python抢过年的火车票附源码
2015/12/07 Python
Python 通配符删除文件的实例
2018/04/24 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Pandas分组与排序的实现
2019/07/23 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
会议欢迎词范文
2015/01/27 职场文书
会议开幕词
2015/01/28 职场文书
合同纠纷调解书
2015/05/20 职场文书
小学班级管理心得体会
2016/01/07 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android