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

♥️作者:小刘在这里

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

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

目录

一.效果呈现

 二.主代码

三.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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++小游戏】推箱子代码

注&#xff1a;本程序完全原创&#xff0c;如果有BUG&#xff0c;欢迎私信投诉。 Upd 2023/1/2 : 把代码扔到 LOJ 里格式化了一下&#xff0c;希望代码看起来没原来那么丑陋。 Upd 2023/3/3 : 修复了一个没有测试出来的 bug&#xff08;箱子推进去后无法立即显示&#xff09; …

怎么把知网的外文文献翻译成中文_知网查重中文译成英文可行吗?

把中文翻译成英文知网查重是能查出的,最新的版本增加了中英文互译、跨语言检测等功能。因此,中国知网不仅能查重英文论文,还能将中文翻译成英文的论文给查出来。所以说,中文译成英文不是一个好办法。那么,知网查重中文译成英文可行吗? 一、中国知网能否查重英文 目前市场…

开源大模型文档

开源大模型综述 排行榜1.LLaMA资源&#xff1a; 2.Chinese-LLaMA-Alpaca资源&#xff1a; 3.Alpaca资源&#xff1a; 4.Alpaca-LoRA5.Vicuna资源&#xff1a; 6.OpenChatKit资源&#xff1a; 7.GPT4ALL8.Raven RWKV资源&#xff1a; 9.OPT资源&#xff1a; 10.Flan-T5-XXL资源&…

5月份读书学习好文记录

学好C可以采取以下几个步骤&#xff1a; 掌握基本语法&#xff1a;C的语法对于初学者来说可能是一件比较难的事情&#xff0c;所以需要花时间掌握C的语言基础和语法规则&#xff0c;例如数据类型、流程控制、函数等。 学会面向对象编程(OOP)&#xff1a;C是一种面向对象的编程…

多表关联出现重复数据原因

多表联合查询的时候&#xff0c;可能会产生多条重复数据&#xff0c;出现的原因&#xff1a; 1.可能是你用来进行 join的列&#xff0c;具有重复数据。 今天下午在写sql的时候&#xff0c;由于没有注意到该列的值并不是唯一的&#xff0c;所以导致查询出来的有N条重复数据 解决…

数据拼接出现重复

数据拼接出现重复 使用join方法拼接数据出现重复 使用join方法拼接数据出现重复 打印日期和星期&#xff0c;首先获取当前日期毫秒&#xff0c;再通过for循环将毫秒计算出下一日期 如要实现打印如下日期 代码如下 当28行和23行位置互换&#xff0c;就会发生一下情况 原因是…

wechat——解决重试三次产生消息重复的问题

通过上篇成功的接入开发者模式&#xff0c;与微信交互发送文本消息和模板消息&#xff0c;发现消息有的时候会重复发送&#xff0c;最多三次。查看微信公众平台文档发现&#xff1a;微信服务器在五秒内收不到响应会断掉链接&#xff0c;并且重新发起请求&#xff0c;总共重试三…

如何重复对好友发同一条信息

words"期末考试必过" import pyautogui #控制键盘鼠标 import pyperclip #控制电脑的复制截切版 import time #控制时间 time.sleep(5) #设置切换窗口时准备的时间 for i in words.split("/n")*99: #split("/n")把文章分成一句一句的 pr…

GP查询并删除重复数据问题

在数据库中做增删查改时&#xff0c;难免会因为误操作导致数据库中存在一些重复数据&#xff0c;那么如何定位这些重复数据并且删除呢&#xff1f;本文将介绍在Greenplum数据库中如何实现查询并删除重复数据的方法。 目录 PostgreSQL与Greenplum的关系GP查询重复数据1. row_nu…

C++ 查找字符串重复字符和只出现一次的字符

#include <iostream> #include <string>using namespace std;int main() {string temp "";cout << "请输入字符串&#xff1a;";getline(cin,temp);string str ""; //存放只出现一次的字符string str1 ""; //存…

chatgpt赋能python:Python排除字符串中重复字符

Python排除字符串中重复字符 在处理字符串数据时&#xff0c;我们经常需要对字符串中的重复字符进行处理&#xff0c;以便更好地对数据进行分析和处理。在Python编程领域中&#xff0c;有许多方法可以用于排除字符串中的重复字符&#xff0c;从而使数据更加清晰和有用。在本文…

拼音打字时不定时出现重复字母

问题自述&#xff1a; 家里面有一台备用机惠普15-R239TX&#xff0c;东西放久了发现键盘缝隙里面很脏&#xff0c;得空就拆机后彻底清理了一下。 自从上次清理过键盘后&#xff0c;在使用Q Q拼音打字时会不定时出现重字母的情况&#xff0c;重新下载最新版本&#xff0c;默认设…

CPM-Bee本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

3分钟部署私人chat-gpt教程

一、注册vercel账号 点击 Vercel 邮箱注册一个号&#xff0c;86的手机号也能注册。需要github账号和openai key 二、创建项目 1. 在首页新建项目 2. 登录你的github账号&#xff0c;然后创建一个仓库 导入第三方的仓库 输入&#xff1a;https://github.com/Yidadaa/ChatGPT…

注册AppStore开发者账号以及收款设置的流程详解(2019最新版)

最近和朋友倒腾了一个APP&#xff0c;想在App Store上架&#xff0c;因此就在注册个人开发者账号的过程中踩了不少坑。 申请App Store的开发者账号果然不是一件容易的事情&#xff0c;并且我发现在设置收款时尤其容易踩坑。期间&#xff0c;我也看了不少分享&#xff0c;但由于…

苹果 company开发者账号注册流程图解分享

苹果开发者账号的注册过程还是比较复杂的&#xff0c;周期拉了一个月&#xff08;漫长啊~~&#xff09;。和大家分享一下过程和细节&#xff0c;以免大家走了弯路。本文由萌虾米492405648编写蛮辛苦的要是对你有用是我最大的欣慰啦 一定要记住申请的过程中遇到问题致电苹果开发…

最新苹果商务管理ABM注册及使用

本文了解苹果商务管理Apple Business Manager(简称ABM)的申请注册流程及应用下载方式 苹果商务管理&#xff0c;Apple Business Manager 简称ABM&#xff0c;用于 定制应用分发公司/组织内部应用分发 如果你的应用是上边两种类型就考虑用ABM分发了&#xff0c;这类应用的特点是…

年度最新!iOS如何申请苹果公司开发者账号流程详细图文介绍

苹果官方参考文章&#xff1a;使用 Apple Developer App 注册和管理您的帐。 申请公司账号&#xff0c;别申请个人账号。以前有家公司就申请错了申请为个人账号了&#xff0c;结果只能显示个人开发者的名字。个人账号和公司账号费用现在一样了。企业账号已经不能申请了。申请网…

iOS 苹果企业账号申请流程

申请需要用到的一些资料&#xff1a;.一张可以付美元的信用卡(如VISA或万事达)、一个企业邮箱账号还有公司的营业执照复印件(申请邓白氏码的时候需要用到)。 1.打开网址https://developer.apple.com&#xff0c;如下图&#xff1a; 2.点击上图中的Account&#xff0c;进入登录页…

发布苹果App有哪些步骤流程

前提&#xff1a; 1.需要一台苹果电脑 2.需要苹果开发者账号 3.已经开发好的App 发布步骤&#xff1a; 1.先创建App ID 登录开发者账号选择Certificates, Identifiers & Profiles进入相应的界面&#xff0c;再选择Identifiers旁边的蓝色&#xff0b;号 然后选择App IDs…