Python推箱子小游戏源代码,人物移动使用键盘方向键,有四个难度等级。游戏运行截图:
核心程序代码:
Game.py

'''
Author:Charles
Function:推箱子小游戏
微信公众号:Python代码大全
'''
import os
import sys
import pygame
from Sprites import *
from config import Config
from itertools import chain'''退出游戏'''
def quitGame():pygame.quit()sys.exit(0)'''游戏地图'''
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))elif elem_type == 'box':self.boxes.append(elementSprite('box.png', col, row))elif elem_type == 'target':self.targets.append(elementSprite('target.png', col, row))'''画游戏地图'''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 = Config.get('block_size')temp1 = 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 = Config.get('levels_path')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))# 游戏surfaceheight = Config.get('block_size') * self.game_map.num_rowswidth = Config.get('block_size') * self.game_map.num_colsself.game_surface = pygame.Surface((width, height))self.game_surface.fill(Config.get('bg_color'))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)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 + Config.get('WIDTH') // 2) > Config.get('WIDTH'):if -1 * self.scroll_x + Config.get('WIDTH') < width:self.scroll_x -= 2elif (x + Config.get('WIDTH') // 2) > 0:if self.scroll_x < 0:self.scroll_x += 2if (y + Config.get('HEIGHT') // 2) > Config.get('HEIGHT'):if -1 * self.scroll_y + Config.get('HEIGHT') < 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(Config.get('resources_path'), Config.get('fontfolder'), '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:quitGame()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 BUTTON(screen, position, text):bwidth = 310bheight = 65left, top = positionpygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), [left+bwidth, top], 5)pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))font_path = os.path.join(Config.get('resources_path'), Config.get('fontfolder'), 'simkai.ttf')font = pygame.font.Font(font_path, 50)text_render = font.render(text, 1, (255, 0, 0))return screen.blit(text_render, (left+50, top+10))'''开始界面'''
def startInterface(screen):screen.fill(Config.get('bg_color'))clock = pygame.time.Clock()while True:button_1 = BUTTON(screen, (95, 150), '开始游戏')button_2 = BUTTON(screen, (95, 305), '退出游戏')for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if button_1.collidepoint(pygame.mouse.get_pos()):returnelif button_2.collidepoint(pygame.mouse.get_pos()):quitGame()clock.tick(60)pygame.display.update()'''关卡切换界面'''
def switchInterface(screen):screen.fill(Config.get('bg_color'))clock = pygame.time.Clock()while True:button_1 = BUTTON(screen, (95, 150), '进入下关')button_2 = BUTTON(screen, (95, 305), '退出游戏')for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN:if button_1.collidepoint(pygame.mouse.get_pos()):returnelif button_2.collidepoint(pygame.mouse.get_pos()):quitGame()clock.tick(60)pygame.display.update()'''结束界面'''
def endInterface(screen):screen.fill(Config.get('bg_color'))clock = pygame.time.Clock()font_path = os.path.join(Config.get('resources_path'), Config.get('fontfolder'), 'simkai.ttf')text = '机智如你~恭喜通关!'font = pygame.font.Font(font_path, 30)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()screen.blit(text_render, (120, 200))clock.tick(60)pygame.display.update()'''主函数'''
def main():pygame.init()pygame.mixer.init()pygame.display.set_caption('推箱子-微信公众号:Python代码大全')screen = pygame.display.set_mode([Config.get('WIDTH'), Config.get('HEIGHT')])pygame.mixer.init()audio_path = os.path.join(Config.get('resources_path'), Config.get('audiofolder'), 'EineLiebe.mp3')pygame.mixer.music.load(audio_path)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)startInterface(screen)levels_path = Config.get('levels_path')for level_name in sorted(os.listdir(levels_path)):runGame(screen, level_name)switchInterface(screen)endInterface(screen)'''run'''
if __name__ == '__main__':main()

Sprites.py

'''
Author:Charles
Function:一些精灵类集合
微信公众号:Python代码大全
'''
import os
import pygame
from config import Config'''
Function:推箱子的人精灵类
'''
class pusherSprite(pygame.sprite.Sprite):def __init__(self, col, row):pygame.sprite.Sprite.__init__(self)self.image_path = os.path.join(Config.get('resources_path'), Config.get('imgfolder'), 'player.png')self.image = pygame.image.load(self.image_path).convert()color = self.image.get_at((0, 0))self.image.set_colorkey(color, pygame.RLEACCEL)self.rect = self.image.get_rect()self.col = colself.row = row'''移动'''def move(self, direction, is_test=False):# 测试模式代表模拟移动if is_test:if direction == 'up':return self.col, self.row - 1elif direction == 'down':return self.col, self.row + 1elif direction == 'left':return self.col - 1, self.rowelif direction == 'right':return self.col + 1, self.rowelse:if direction == 'up':self.row -= 1elif direction == 'down':self.row += 1elif direction == 'left':self.col -= 1elif direction == 'right':self.col += 1'''将人物画到游戏界面上'''def draw(self, screen):self.rect.x = self.rect.width * self.colself.rect.y = self.rect.height * self.rowscreen.blit(self.image, self.rect)'''
Function:游戏元素精灵类
'''
class elementSprite(pygame.sprite.Sprite):def __init__(self, sprite_name, col, row):pygame.sprite.Sprite.__init__(self)# 导入box.png/target.png/wall.pngself.image_path = os.path.join(Config.get('resources_path'), Config.get('imgfolder'), sprite_name)self.image = pygame.image.load(self.image_path).convert()color = self.image.get_at((0, 0))self.image.set_colorkey(color, pygame.RLEACCEL)self.rect = self.image.get_rect()# 元素精灵类型self.sprite_type = sprite_name.split('.')[0]# 元素精灵的位置self.col = colself.row = row'''将游戏元素画到游戏界面上'''def draw(self, screen):self.rect.x = self.rect.width * self.colself.rect.y = self.rect.height * self.rowscreen.blit(self.image, self.rect)'''移动游戏元素'''def move(self, direction, is_test=False):if self.sprite_type == 'box':# 测试模式代表模拟移动if is_test:if direction == 'up':return self.col, self.row - 1elif direction == 'down':return self.col, self.row + 1elif direction == 'left':return self.col - 1, self.rowelif direction == 'right':return self.col + 1, self.rowelse:if direction == 'up':self.row -= 1elif direction == 'down':self.row += 1elif direction == 'left':self.col -= 1elif direction == 'right':self.col += 1

完整程序代码:Python推箱子小游戏源代码
更多Python源代码,请关注公众号:Python代码大全。

Python推箱子小游戏源代码相关推荐

  1. python推箱子小游戏源代码_Python制作推箱子小游戏

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

  2. python推箱子小游戏_小伙利用Python自制一个推箱子小游戏!

    原标题:小伙利用Python自制一个推箱子小游戏! 导语 月初更波python制作小游戏系列吧用python写了个推箱子小游戏,在这里分享给大家,让我们愉快地开始吧 小伙利用Python自制一个推箱子 ...

  3. python推箱子小游戏

    推箱子小游戏 本次小游戏学习视频:https://www.bilibili.com/video/BV1gz411B71H 相关素材:点击这里 import turtle import levelms ...

  4. Python【小游戏合集】之自己做一个简单又好玩的推箱子小游戏

    导语:哈喽铁汁们~今日游戏之旅开始! 想领取完整源码跟python学习资料可私信我或点击这行字体 这期就是带大家使用当前主流且易用的Python语言做一个简单的推箱子小游戏 现在小编的快乐源泉就是玩自 ...

  5. python写推箱子_python写的推箱子小游戏

    原标题:python写的推箱子小游戏 导语 Python 功能强大,可以写爬虫.服务器.数据分析.AI--当然,也可以写游戏. 用python写了个推箱子小游戏,在这里分享给大家,让我们愉快地开始吧~ ...

  6. python写的推箱子小游戏

    作者:白露未晞me 来源:Charles的皮卡丘 导语 Python 功能强大,可以写爬虫.服务器.数据分析.AI--当然,也可以写游戏. 用python写了个推箱子小游戏,在这里分享给大家,让我们愉 ...

  7. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  8. 推箱子matlab源代码,C++实现推箱子小游戏源码

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 功能尚为完善. // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #incl ...

  9. c 语言推箱子vs,C语言推箱子小游戏教程

    作者GitHub-Pages个人主页 本教程GitHub-Pages链接 本教程百度云下载地址 本教程编写于2016/11/22 Dawson Lee edited this page on Beij ...

  10. 控制台推箱子小游戏C语言

    自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点. ...

最新文章

  1. eeglab中文教程系列(13)-导入cnt文件
  2. vue-music(1)音乐播发器 项目开发记录
  3. 戛古 Kakku, Kekku-掸邦 shan state
  4. 【实用】SAP MR8M校验增强
  5. BFS 保存路径模板
  6. TCPIP / LAN、WAN、、VLAN、WLAN 和 WIFI 的区别和联系
  7. 【docker常用镜像命令总结,持续更新中... 建议收藏!】
  8. int 互换 java_Java基础中Int类型变量值互换的几种方法
  9. ambari集成mysql_Ambari 安装配置 MySql
  10. QLineEdit限制数据类型——只能输入浮点型数
  11. MATLAB字符串和ASCII码的转换
  12. 01 辅助函数之加密函数
  13. ubuntu16.04安装pycharm
  14. 德力西双电源自动转换开关说明书_今日优品:南开区FLQ3-25双电源自动转换开关全国服务-老友网...
  15. MySQL学习日志(二)
  16. wcf部署到IIS上,安装iis和wcf组件方法,并提供wcf文件
  17. “狼牙抓鸡”现身IT江湖
  18. Open3D 欧式聚类
  19. 比较有理数大小C语言pta,有理数比较PTA
  20. python爬LOL英雄皮肤

热门文章

  1. java捕鱼达人代码java捕鱼游戏代码
  2. C语言实现函数调用的三种方法
  3. windows文件搜索工具 Everything
  4. 潜在失效模式和后果分析 FMEA 10分钟教程
  5. 历年计算机二级Java考试试题及答案(完整版)
  6. 数据结构(java语言描述)课后答案_数据结构JAVA语言描述习题答案(刘小晶等主编)pdf总复习.ppt...
  7. linux 执行sql loader,sql loader使用例子
  8. CarMaker入门——【第1讲】运行TestRuns示例
  9. 在IPG-CarMaker的ipgmovie中显示地图
  10. deepin上配置eclipse的hadoop开发环境