♥️作者:小刘在这里

♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生!

♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。

目录

一.效果呈现

二.主代码

三.cfg

四.README


一.效果呈现

二.主代码

'''
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_colsself.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 = Falsefor target in self.targets:if box.col == target.col and box.row == target.row:is_match = Truebreakif not is_match:return Falsereturn 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.BLOCKSIZEtemp1 = self.walls + self.boxestemp2 = pygame.Rect(col * block_size, row * block_size, block_size, block_size)return temp2.collidelist(temp1) == -1else:return False'''获得某位置的box'''def getBox(self, col, row):for box in self.boxes:if box.col == col and box.row == row:return boxreturn None'''游戏界面'''
class gameInterface():def __init__(self, screen):self.screen = screenself.levels_path = cfg.LEVELDIRself.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))# 游戏surfaceheight = cfg.BLOCKSIZE * self.game_map.num_rowswidth = cfg.BLOCKSIZE * self.game_map.num_colsself.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 = 0self.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.centerwidth = self.game_surface.get_rect().wheight = self.game_surface.get_rect().hif (x + cfg.SCREENSIZE[0] // 2) > cfg.SCREENSIZE[0]:if -1 * self.scroll_x + cfg.SCREENSIZE[0] < width:self.scroll_x -= 2elif (x + cfg.SCREENSIZE[0] // 2) > 0:if self.scroll_x < 0:self.scroll_x += 2if (y + cfg.SCREENSIZE[1] // 2) > cfg.SCREENSIZE[1]:if -1 * self.scroll_y + cfg.SCREENSIZE[1] < height:self.scroll_y -= 2elif (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')breakif 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')breakif 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')breakif 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')breakif 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():returnscreen.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)

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

  1. python小游戏——像素鸟代码开源

    ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至. 目录 一.呈 ...

  2. python小游戏——反弹小球代码开源

    ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至. 目录 一.效 ...

  3. python小游戏——打砖块代码开源

    ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至. 目录 一.效 ...

  4. python小游戏 推箱子小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 5 最后 0 项目简介

  5. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  6. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  7. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

  8. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  9. Python游戏开发,Python实现童年小游戏推箱子 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 上效果图 原理简 ...

最新文章

  1. 四、redis的底层数据结构
  2. 10个顶级的CSS UI开源框架
  3. C语言实现单链表的逆置
  4. Windows下安装Zabbix agent
  5. Maven(八)Eclipse创建Web项目(复杂方式)
  6. 真效率神器,UI稿智能转换成前端代码,准确率极高
  7. 塑料封装可靠性问题浅析
  8. python获取方法的装饰方法_python中的方法和装饰器
  9. asp td tr 高度_ASP.NET Core Blazor 初探之 Blazor Server
  10. [tensorflow]tensorflow 顺序模型(Sequential model)
  11. MFC基于 单文档为状态栏添加进度条
  12. 计算机基础考试题库(含答案)
  13. MATLAB中saveas函数使用
  14. x01.wos: 纸娃娃系统
  15. 正反转信号判别原理以及数字鉴相器原理
  16. 六度分割理论走向实践
  17. 衡量连通图连通性一些指标(r-reachable, r-robust)
  18. windows上配置深度学习(李沐-动手学深度学习)
  19. css white-space属性总结
  20. Dp-状态压缩:玉米田

热门文章

  1. 许多研究生的一个通病:对导师过度依赖!
  2. 固件库应用之按键检测
  3. 基于ECS和NAS搭建个人网盘
  4. 关注这几点,远程办公不犯迷糊
  5. python将PDF转Excel,简单实用
  6. 基于虹软使用Java实现人脸识别、人脸比对、活性检测等
  7. IT猎头的几天生活感想((做IT的一定要看啊~~看了真是。。。)
  8. 【转载】Go语言:操作Windows注册表
  9. 仿QQ黑屏,锁屏,程序切换之后的手势密码锁定,加强版
  10. 绵阳高考成绩2021查询,2021绵阳一诊划线最全解读,快看你的成绩能上什么大学...