AI 助理
备案 控制台
开发者社区 开发与运维 文章 正文

python小游戏——推箱子代码开源

简介: python小游戏——推箱子代码开源

一.效果呈现

二.主代码

'''
Function:
    推箱子小游戏
'''
import os
import sys
import cfg
import pygame
from modules import *
from itertools import chain
'''游戏地图'''
class gameMap():
    def __init__(self, num_cols, num_rows):
        self.walls = []
        self.boxes = []
        self.targets = []
        self.num_cols = num_cols
        self.num_rows = num_rows
    '''增加游戏元素'''
    def addElement(self, elem_type, col, row):
        if elem_type == 'wall':
            self.walls.append(elementSprite('wall.png', col, row, cfg))
        elif elem_type == 'box':
            self.boxes.append(elementSprite('box.png', col, row, cfg))
        elif elem_type == 'target':
            self.targets.append(elementSprite('target.png', col, row, cfg))
    '''画游戏地图'''
    def draw(self, screen):
        for elem in self.elemsIter():
            elem.draw(screen)
    '''游戏元素迭代器'''
    def elemsIter(self):
        for elem in chain(self.targets, self.walls, self.boxes):
            yield elem
    '''该关卡中所有的箱子是否都在指定位置, 在的话就是通关了'''
    def levelCompleted(self):
        for box in self.boxes:
            is_match = False
            for target in self.targets:
                if box.col == target.col and box.row == target.row:
                    is_match = True
                    break
            if not is_match:
                return False
        return True
    '''某位置是否可到达'''
    def isValidPos(self, col, row):
        if col >= 0 and row >= 0 and col < self.num_cols and row < self.num_rows:
            block_size = cfg.BLOCKSIZE
            temp1 = self.walls + self.boxes
            temp2 = pygame.Rect(col * block_size, row * block_size, block_size, block_size)
            return temp2.collidelist(temp1) == -1
        else:
            return False
    '''获得某位置的box'''
    def getBox(self, col, row):
        for box in self.boxes:
            if box.col == col and box.row == row:
                return box
        return None
'''游戏界面'''
class gameInterface():
    def __init__(self, screen):
        self.screen = screen
        self.levels_path = cfg.LEVELDIR
        self.initGame()
    '''导入关卡地图'''
    def loadLevel(self, game_level):
        with open(os.path.join(self.levels_path, game_level), 'r') as f:
            lines = f.readlines()
        # 游戏地图
        self.game_map = gameMap(max([len(line) for line in lines]) - 1, len(lines))
        # 游戏surface
        height = cfg.BLOCKSIZE * self.game_map.num_rows
        width = cfg.BLOCKSIZE * self.game_map.num_cols
        self.game_surface = pygame.Surface((width, height))
        self.game_surface.fill(cfg.BACKGROUNDCOLOR)
        self.game_surface_blank = self.game_surface.copy()
        for row, elems in enumerate(lines):
            for col, elem in enumerate(elems):
                if elem == 'p':
                    self.player = pusherSprite(col, row, cfg)
                elif elem == '*':
                    self.game_map.addElement('wall', col, row)
                elif elem == '#':
                    self.game_map.addElement('box', col, row)
                elif elem == 'o':
                    self.game_map.addElement('target', col, row)
    '''游戏初始化'''
    def initGame(self):
        self.scroll_x = 0
        self.scroll_y = 0
    '''将游戏界面画出来'''
    def draw(self, *elems):
        self.scroll()
        self.game_surface.blit(self.game_surface_blank, dest=(0, 0))
        for elem in elems:
            elem.draw(self.game_surface)
        self.screen.blit(self.game_surface, dest=(self.scroll_x, self.scroll_y))
    '''因为游戏界面面积>游戏窗口界面, 所以需要根据人物位置滚动'''
    def scroll(self):
        x, y = self.player.rect.center
        width = self.game_surface.get_rect().w
        height = self.game_surface.get_rect().h
        if (x + cfg.SCREENSIZE[0] // 2) > cfg.SCREENSIZE[0]:
            if -1 * self.scroll_x + cfg.SCREENSIZE[0] < width:
                self.scroll_x -= 2
        elif (x + cfg.SCREENSIZE[0] // 2) > 0:
            if self.scroll_x < 0:
                self.scroll_x += 2
        if (y + cfg.SCREENSIZE[1] // 2) > cfg.SCREENSIZE[1]:
            if -1 * self.scroll_y + cfg.SCREENSIZE[1] < height:
                self.scroll_y -= 2
        elif (y + 250) > 0:
            if self.scroll_y < 0:
                self.scroll_y += 2
'''某一关卡的游戏主循环'''
def runGame(screen, game_level):
    clock = pygame.time.Clock()
    game_interface = gameInterface(screen)
    game_interface.loadLevel(game_level)
    font_path = os.path.join(cfg.FONTDIR, 'simkai.ttf')
    text = '按R键重新开始本关'
    font = pygame.font.Font(font_path, 15)
    text_render = font.render(text, 1, (255, 255, 255))
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit(0)
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    next_pos = game_interface.player.move('left', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('left')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('left', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('left')
                                box.move('left')
                    break
                if event.key == pygame.K_RIGHT:
                    next_pos = game_interface.player.move('right', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('right')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('right', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('right')
                                box.move('right')
                    break
                if event.key == pygame.K_DOWN:
                    next_pos = game_interface.player.move('down', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('down')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('down', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('down')
                                box.move('down')
                    break
                if event.key == pygame.K_UP:
                    next_pos = game_interface.player.move('up', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('up')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('up', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('up')
                                box.move('up')
                    break
                if event.key == pygame.K_r:
                    game_interface.initGame()
                    game_interface.loadLevel(game_level)
        game_interface.draw(game_interface.player, game_interface.game_map)
        if game_interface.game_map.levelCompleted():
            return
        screen.blit(text_render, (5, 5))
        pygame.display.flip()
        clock.tick(100)
'''主函数'''
def main():
    pygame.init()
    pygame.mixer.init()
    pygame.display.set_caption('推箱子 —— 源码基地:#959755565#')
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.mixer.init()
    audio_path = os.path.join(cfg.AUDIODIR, 'EineLiebe.mp3')
    pygame.mixer.music.load(audio_path)
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    startInterface(screen, cfg)
    for level_name in sorted(os.listdir(cfg.LEVELDIR)):
        runGame(screen, level_name)
        switchInterface(screen, cfg)
    endInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
    main()

三.cfg

'''配置文件'''

import os



'''屏幕大小'''

SCREENSIZE = (500, 500)

'''block大小'''

BLOCKSIZE = 50

'''levels所在文件夹'''

LEVELDIR = os.path.join(os.getcwd(), 'resources/levels')

'''图片所在文件夹'''

IMAGESDIR = os.path.join(os.getcwd(), 'resources/images')

'''字体所在文件夹'''

FONTDIR = os.path.join(os.getcwd(), 'resources/font')

'''音频所在文件夹'''

AUDIODIR = os.path.join(os.getcwd(), 'resources/audios')

'''背景颜色'''

BACKGROUNDCOLOR = (45, 45, 45)

四.README


# Introduction

https://mp.weixin.qq.com/s/y6CZd4h3uo7602LrI7aFdQ


# Environment

```

OS: Windows10

Python: Python3.5+(have installed necessary dependencies)

```


# Usage

```

Step1:

pip install -r requirements.txt

Step2:

run "python Game12.py"

```


# Game Display

![giphy](demonstration/running.gif)


小刘在阿里
目录
相关文章
游客qf4jmczx4xu2y
|
5天前
|
设计模式 开发框架 缓存
探索Python中的装饰器:简化代码,增强功能
【9月更文挑战第16天】在Python的世界里,装饰器宛如一位巧手魔术师,轻轻一挥魔杖,便能让我们的函数和类焕发新生。本文将带你领略装饰器的魔力,从基础概念到实战应用,一步步解锁装饰器的强大潜能。让我们一起踏上这段奇妙的旅程,探索如何用装饰器简化代码,增强功能。
游客qf4jmczx4xu2y
32 19
我不是游客20240119
|
5天前
|
测试技术 Python
Python中的装饰器:简化代码的魔法
【9月更文挑战第16天】在Python编程的世界里,装饰器就像是一把瑞士军刀,它们为函数和类赋予了额外的超能力。本文将带你探索装饰器的秘密,了解如何利用这一工具来简化代码、增强可读性并提升效率。从基础概念到实际案例,我们将一步步揭示装饰器的神秘面纱,让你的代码更加优雅和强大。
我不是游客20240119
16 5
游客zllgslqrsw3f6
|
5天前
|
设计模式 缓存 开发者
探索Python中的装饰器:提升代码复用性的利器
本文深入探讨了Python中强大的装饰器功能,揭示了其如何通过元编程和闭包等技术手段,优雅地实现代码的复用与扩展。从基本概念到高级应用,我们将一步步揭开装饰器背后的奥秘,并通过实例展示其在实际项目开发中的巨大价值。无论是想要简化函数调用流程、增强函数功能,还是实现AOP(面向切面编程),掌握装饰器都是每位Python开发者必备的技能。
游客zllgslqrsw3f6
14 2
叫个什么名字
|
4天前
|
缓存 监控 测试技术
探索Python中的装饰器:提升代码的灵活性和可维护性
本文深入探讨Python装饰器的概念、用法及优势。通过实例讲解如何利用装饰器增强函数功能、日志记录及性能测试,旨在帮助读者掌握这一强大的工具,提升编程效率与代码质量。
叫个什么名字
11 0
zhanbao
|
5天前
|
缓存 开发者 Python
探索Python中的装饰器:提升代码复用性与可读性
本文旨在深入探讨Python装饰器的概念、实现及其应用。通过实例分析,本文展示了如何利用装饰器提高代码的模块化和重用性,从而优化开发流程。我们将从装饰器的基本定义入手,逐步解析其工作机制,并通过案例展示如何在实际项目中有效利用装饰器。
zhanbao
11 0
东方睿赢
|
4月前
|
设计模式 前端开发 数据库
Django是一个用Python编写的开源Web应用框架
Django是一个用Python编写的开源Web应用框架
东方睿赢
43 1
云栖大讲堂
|
机器学习/深度学习 算法 数据挖掘
Python粉都应该知道的开源机器学习框架:Scikit-learn入门指南
云栖大讲堂
1741 0
寒凝雪
|
Python 缓存 开发框架
Python引力波火了 你该了解的开源框架
寒凝雪
1159 0
游客qf4jmczx4xu2y
|
6天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从零基础到实战应用
【9月更文挑战第15天】本文将引导读者从零开始学习Python编程,通过简单易懂的语言和实例,帮助初学者掌握Python的基本语法和常用库,最终实现一个简单的实战项目。文章结构清晰,分为基础知识、进阶技巧和实战应用三个部分,逐步深入,让读者在学习过程中不断积累经验,提高编程能力。
游客qf4jmczx4xu2y
45 21
历年考试不作弊
|
2天前
|
数据可视化 Python
Python编程中的数据可视化技术
【9月更文挑战第19天】在数据驱动的时代,将复杂的数据集转化为直观易懂的视觉表达至关重要。本文将深入探索Python中的数据可视化库,如Matplotlib和Seaborn,并指导读者如何运用这些工具来揭示数据背后的模式和趋势。文章不仅会介绍基础图表的绘制方法,还将讨论高级技巧以提升图表的信息丰富度和吸引力。
历年考试不作弊
23 9

热门文章

最新文章

  • 1
    Python入门教程:内置函数—Map、Reduce、Filter
  • 2
    第24讲 python文件的写操作基础
  • 3
    ?python __future__ package的几个特性
  • 4
    【Python】fastapi框架之Web部署机器学习模型
  • 5
    python接口自动化测试 - requests库的post请求进行文件下载
  • 6
    python设计模式(五):适配器模式——各种类接口的合并
  • 7
    第十七章 Python网络编程
  • 8
    Python之pickle序列化
  • 9
    【机器学习算法-python实现】svm支持向量机(1)—理论知识介绍
  • 10
    python 题目3
  • 1
    如何使用Python脚本备份交换机的配置信息?
    57
  • 2
    阿里云 MaxCompute MaxFrame 开启免费公测,统一 Python 开发生态
    204
  • 3
    Python在哪些领域应用广泛?
    128
  • 4
    Python适合做游戏吗?
    98
  • 5
    PHP和Python是两种广泛应用的编程语言
    92
  • 6
    PHP和Python在哪些方面有所不同?
    19
  • 7
    Python和C++在内存管理方面有什么不同?
    38
  • 8
    Python爬虫与数据可视化:构建完整的数据采集与分析流程
    135
  • 9
    揭秘淘宝商品信息:Python爬虫技术入门与实战指南
    122
  • 10
    Python 3.9的异步编程和多进程优化有哪些改进?
    30
  • 相关课程

    更多
  • Python Web开发基础
  • Python爬虫实战
  • Python常用数据科学库
  • Python网络爬虫实战
  • Python完全自学手册图文教程
  • Python基础快速入门实战教程
  • 相关电子书

    更多
  • From Python Scikit-Learn to Sc
  • Data Pre-Processing in Python:
  • 双剑合璧-Python和大数据计算平台的结合
  • 相关实验场景

    更多
  • 1分钟部署经典小游戏
  • Python新手入门
  • Python入门
  • Python选择及循环结构
  • Python新手入门(Anolis OS)
  • 推荐镜像

    更多
  • python-release
  • nodejs-release
  • linuxmint-packages
  • 下一篇
    搭建自己的私有云盘工具总结

    天下网标王肇庆网站收录优化上虞网站优化公司效果甘肃专业的网站关键词优化seo网站怎么写优化文章开封搜索引擎网站优化费用松江区公司网站优化机构郑州百度seo网站优化技术蓬莱网站推广排名优化网站优化需要桐梓网站seo优化公司长春网站排名优化余姚市宁波网站优化网站优化排名的步骤和方法湘潭网站优化注意事项shell优化网站通化网站优化有哪些高负载类网站优化网站优化推广相信金手指21网站优化常见的错误南通网站优化有哪些方法上海网站优化学习滨城区英文网站优化设计太原网站优化价格四川网站关键词排名优化安仁seo的网站优化东莞网站首页关键词优化费用长春网站排名优化公司网站排名优化下拉天下zblog网站优化西秀区分类网站优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

    天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化