【Python】 python实现我的世界(Minecraft)计算器(重制版)

【Python】 python实现我的世界(Minecraft)计算器

文章目录

  • 【Python】 python实现我的世界(Minecraft)计算器
    • 1.引言与原理
    • 2.写代码之前的配置
        • 1.BuidTools.jar文件配置服务器
        • 2.raspberryjuice-1.12.1.jar用python控制服务器
    • 3.第三方库mcpi的基本方法
    • 4.计算器构建的思路
    • 5.源码展示
    • 6.操作示例
    • 7.结语

这是配置资源以及教学视频链接
配置资源及操作方法
Python实现我的世界(Minecraft)计算器(附源码与教程)

1.引言与原理

​ 想必mc玩家都见过红石计算器吧,非常宏大的工程,也非常的牛逼。我的红石还没有到达那种层次,所以我是造不出来那种层次的 计算器的。因为它需要将计算原理所需的结构都建造出来,而我这种小菜鸡肯定是不会的。不过,由于计算机内部已经帮我们构造好了计算的功能,我们就可以直接用计算机帮我们计算,将结果在mc中返回就好了。


那做这件事的意义是什么呢?意义颇丰,可以提高你的算法思维以及工程能力,也可以在代码与游戏的交互下感受到无比的乐趣与成就感


​ 众所周知,Minecraft是用Java语言编写的。但是我们可以通过一些插件,结合python的第三方库mcpi来控制Minecraft

mcpi可以用来填充方块、接收mc端的玩家发出的信息以及玩家的位置、将信息发送给mc端,然后进行处理。只用基于这四种功能,我们就可以利用python实现mc的计算器了。

在这里插入图片描述

听起来是不是很简单,没错,做起来也很简单!下面一起跟着我来探索一下吧。

2.写代码之前的配置

写之前当然少不了安装一些东西,需要的东西以及操作方法我都放在一个文件中了,大家有需要自取

点我获取文件

1.BuidTools.jar文件配置服务器

Spigot BuidTools是mc服务器

  • 1.新建一个文件夹,专门放置与服务器有关的文件

  • 2.将其放入其中

    该文件是一个jar包,直接在命令行上运行它便开始下载与服务器相关的文件

     java -jar BiudTools.jar --rev 1.19.2  # 运行命令# 1.19.2是你对应的mc版本号
    
  • 3.运行后生成的 spigot-1.19.2.jar这个jar包便是这个版本的服务器,将其放入一个新文件夹中,点击运行后生成了eula.txt和server.properties文件以及plugins文件夹

  • 4.点开eula.txt文件 将eula=false改成 eula=true

  • 5.点开server.properties文件,将online-mode改为false

2.raspberryjuice-1.12.1.jar用python控制服务器
  • 1.将其放入plugins文件夹中

  • 2.点击spigot-1.19.2.jar启动服务器

  • 3.打开游戏,多人游戏,输入127.0.0.1进入游戏

  • 4.pip install mcpi 下载控制mc的第三方库

  • 5.随便新建一个py文件,输入以下三行代码,点击运行后查看游戏里的效果

    # 导入 Minecraft 模块,这是与 Minecraft 游戏交互的 Python API
    from mcpi.minecraft import Minecraft# 创建一个 Minecraft 对象,这将连接到 Minecraft 世界
    mcDriver = Minecraft.create()# 使用 postToChat 方法向游戏中的聊天窗口发送一条消息
    mcDriver.postToChat("Hello World!")

3.第三方库mcpi的基本方法

想要构建出计算器,只需要知道mcpi中的四种方法就可以了

# 导入模块
from mcpi.minecraft import Minecraft
from mcpi.minecraft import CmdPositionermcDriver=Minecraft.create()               # 与Minecraft进行交互,里面有很多交互的方法,通过mcDriver.方法名来使用# 方法一:获取玩家的位置x,y,z
playerId=mcDriver.getPlayerEntityId('Janium')    # 获取玩家的Id,'Janium'为玩家名称
positioner=CmdPositioner(mcDriver.conn,b'entity')# 用来处理实体的位置信息
playerPosition=positioner.getTilePos(playerId)   # 获取玩家的位置
x=playerPosition.x
y=playerPosition.y								 # 玩家的坐标
z=playerPosition.z# 方法二:向mc端发出信息
mcDriver.postToChat("Hello World!")# 方法三:接受mc端玩家发来的信息,返回一个列表   列表元素格式:
mcInfo=mcDriver.events.pollChatPosts()# 方法四:创建方块,前两个参数是创建方块的起始与结束的坐标,第三个方块的Id,152是红石。类似mc中的/fillmcDriver.setBlocks(subScreen[0],subScreen[1],152)

只需掌握这四种方法,属于你的mc计算器也就可以搭建了。

4.计算器构建的思路

我写了两个文件,一个是创建显示结果的大屏幕,创建时返回你一个坐标,这就是你大屏幕的坐标。然后将这个坐标输入到第二个显示计算结果的文件中去,运行第二个文件,就可以开始使用了

下面就来看看思路

  • 1.首先用方法四创建一个大屏幕,返回大屏幕的坐标。

  • 2.然后将大屏幕划分成小屏幕,每个小屏幕都显示一个数字。

  • 3.通过方法四写好构建数字以及符号的方法

  • 4.利用方法三接受mc端玩家发送来的信息

  • 5.在信息中提取算式

  • 6.通过eval()方法计算算式的结果

  • 7.转成字符串来遍历,依次显示结果

只需要这七个步骤,属于你的mc计算器就大功告成了!是不是特别简单?

当然还有一些细节,大家可以看我的B站视频,那里面有详细的思路解析

点我观看视频

下面直接给大家公布源码

5.源码展示

文件一

# CreateBigScreen.py    (创建大屏幕并返回大屏幕坐标)from mcpi.minecraft import Minecraft
from mcpi.minecraft import CmdPositionermcDriver=Minecraft.create()  # 与Minecraft进行交互,里面有很多交互的方法,通过mcDriver.方法名来使用
playerId=mcDriver.getPlayerEntityId('Janium')           # 获取玩家的Id,'Janium'为玩家名称
positioner=CmdPositioner(mcDriver.conn,b'entity')       # 用来处理实体的位置信息
playerPosition=positioner.getTilePos(playerId)          # 获取玩家的位置
x=playerPosition.x
y=playerPosition.y                                      # 玩家的坐标
z=playerPosition.zdef createBigScreen():mcDriver.setBlocks(x,y+48,z,x+98,y+20,z,123)createBigScreen()mcDriver.postToChat("创建大屏幕成功!创建时的坐标x,y,z分别是  {},{},{}".format(x,y,z))

文件二

# ProcessAndDisplay.py# 导入mcpi库
from mcpi.minecraft import Minecraft
import mcpi.block as blockimport timemcDriver=Minecraft.create()                          # 创建Minecraft对象,与Minecraft进行交互x,y,z=-44,-1,-170                                    # 就是在这里输入CreateBigScreen得到的坐标# 用相对坐标来划分每个子屏幕的位置,一共七个子屏幕,也就是可以处理七位数以内的计算。
subScreen1=[[x+5,y+44,z-1],[x+15,y+44,z-1],[x+5,y+34,z-1],[x+15,y+34,z-1],[x+5,y+24,z-1],[x+15,y+24,z-1]]
subScreen2=[[x+18,y+44,z-1],[x+28,y+44,z-1],[x+18,y+34,z-1],[x+28,y+34,z-1],[x+18,y+24,z-1],[x+28,y+24,z-1]]
subScreen3=[[x+31,y+44,z-1],[x+41,y+44,z-1],[x+31,y+34,z-1],[x+41,y+34,z-1],[x+31,y+24,z-1],[x+41,y+24,z-1]]
subScreen4=[[x+44,y+44,z-1],[x+54,y+44,z-1],[x+44,y+34,z-1],[x+54,y+34,z-1],[x+44,y+24,z-1],[x+54,y+24,z-1]]
subScreen5=[[x+57,y+44,z-1],[x+67,y+44,z-1],[x+57,y+34,z-1],[x+67,y+34,z-1],[x+57,y+24,z-1],[x+67,y+24,z-1]]
subScreen6=[[x+70,y+44,z-1],[x+80,y+44,z-1],[x+70,y+34,z-1],[x+80,y+34,z-1],[x+70,y+24,z-1],[x+80,y+24,z-1]]
subScreen7=[[x+83,y+44,z-1],[x+93,y+44,z-1],[x+83,y+34,z-1],[x+93,y+34,z-1],[x+83,y+24,z-1],[x+93,y+24,z-1]]
subScreenList=[subScreen1,subScreen2,subScreen3,subScreen4,subScreen5,subScreen6,subScreen7]# 在子屏幕内清除之前计算结果、创建数字以及符号的方法都在这个类里
class CreateBlock:def clearScreen():mcDriver.setBlocks(x,y+48,z-1,x+98,y+20,z-1,block.AIR)def zero(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)mcDriver.setBlocks(subScreen[0],subScreen[4],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)def one(subScreen):mcDriver.setBlocks(subScreen[1],subScreen[5],152)def two(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[1],subScreen[3],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[2],subScreen[4],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)def three(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)def four(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[2],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)def five(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[0],subScreen[2],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[3],subScreen[5],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)def six(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[0],subScreen[4],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)mcDriver.setBlocks(subScreen[3],subScreen[5],152)def seven(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)def eight(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)mcDriver.setBlocks(subScreen[0],subScreen[4],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)def nine(subScreen):mcDriver.setBlocks(subScreen[0],subScreen[1],152)mcDriver.setBlocks(subScreen[1],subScreen[5],152)mcDriver.setBlocks(subScreen[0],subScreen[2],152)mcDriver.setBlocks(subScreen[2],subScreen[3],152)mcDriver.setBlocks(subScreen[4],subScreen[5],152)# 创建小数点def point(subScreen):mcDriver.setBlock(subScreen[4],152)# 创建负号def minus(subScreen):mcDriver.setBlocks(subScreen[2],subScreen[3],152)# 算式所包含的字符,用来判断输入格式是否有效
arithmeticSymbolList=['0','1','2','3','4','5','6','7','8','9','+','-','*','/','(',')','.','-']
# 算式是否有效,有效为1,无效为0
validOrNot=1 mcDriver.postToChat('计算器启动中......')
time.sleep(0.5)
mcDriver.postToChat('计算器已启动!')while True:# 子屏幕位置screenNumber=0while True:time.sleep(0.5)# 获取mc那边玩家输入的信息mcInfo=mcDriver.events.pollChatPosts()  if mcInfo != []:break# 在信息中提取算式equation=str(mcInfo[0])[31:-1]# 判断字符是否在算式列表里for num in equation:if num not in arithmeticSymbolList:validOrNot=0break# 有效,则开始计算结果if validOrNot==1:# 利用python自带的eval()方法直接算出算式的值numResult=eval(equation)# 字符串类型的算式计算结果,方便遍历每个数字,在屏幕中显示出来strResult=str(eval(equation))# 如果超过七位以上的浮点数,则取前七位(不是四舍五入)if type(numResult)==type(1.1):strResult=strResult[0:7]# 如果计算结果小于七位数,则开始显示if len(strResult)<=7:CreateBlock.clearScreen()# 遍历结果,显示数字for digitPosition in strResult:time.sleep(0.5)if   digitPosition=='0': CreateBlock.zero(subScreenList[screenNumber])elif digitPosition=='1': CreateBlock.one(subScreenList[screenNumber])elif digitPosition=='2': CreateBlock.two(subScreenList[screenNumber])elif digitPosition=='3': CreateBlock.three(subScreenList[screenNumber])elif digitPosition=='4': CreateBlock.four(subScreenList[screenNumber])elif digitPosition=='5': CreateBlock.five(subScreenList[screenNumber])elif digitPosition=='6': CreateBlock.six(subScreenList[screenNumber])elif digitPosition=='7': CreateBlock.seven(subScreenList[screenNumber])elif digitPosition=='8': CreateBlock.eight(subScreenList[screenNumber])elif digitPosition=='9': CreateBlock.nine(subScreenList[screenNumber])elif digitPosition=='.': CreateBlock.point(subScreenList[screenNumber])elif digitPosition=='-': CreateBlock.minus(subScreenList[screenNumber])screenNumber+=1# 如果超出七位数则显示结果溢出else:mcDriver.postToChat('结果溢出!')  # 无效,则提示输入错误    else:validOrNot=1mcDriver.postToChat('输入错误!')

6.操作示例

  • 1.先运行第一个文件,运行之后你可以看到你的mc世界上方生成了一个大屏幕,并且收到了一个坐标

  • 2.将你得到的坐标输入到第二个文件代码中对应的位置,之后运行第二个文件

在这里插入图片描述

  • 3.在mc聊天栏中输入算式即可

    在这里插入图片描述

  • 输入算式时,“ +-*/ ”分别对应” 加减乘除 “

7.结语

希望这个博客对大家有所帮助
资源以及视频链接在文章开头以及文章中间都有,大家有兴趣可以看一下。

本人资历尚浅,源码都是自己原创。如果有什么有问题或者不得体的地方,欢迎各位大佬批评指正,不过请别发表侮辱性言论。大家也可以在评论区多多交流,相互学习,共同成长。

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

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

相关文章

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

uni-app 程序打包 Android apk、安卓夜神模拟器调试运行

1、打包思路 云端打包方案&#xff08;每天免费次数限制5&#xff0c;最简单&#xff0c;可以先打包尝试一下你的程序打包后是否能用&#xff09;&#xff1a; HBuilderX 发行App-Android云打包 选择Android、使用云端证书、快速安心打包本地打包&#xff1a; HBuilderX …

Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!

1. SmolVLM 模型家族简介 1.1 什么是 SmolVLM-256M 和 SmolVLM-500M,它们为何如此重要? 在人工智能的多模态模型领域,如何在有限的计算资源下实现强大性能一直是一个重要的挑战。SmolVLM-256M 和 SmolVLM-500M 是最近推出的两款视觉语言模型,它们不仅突破了传统“大模型”…

速通Docker === Docker Compose

目录 Docker Compose 简介 Docker Compose 常用命令 使用 Docker Compose 启动 WordPress 普通启动方式&#xff08;使用 Docker 命令&#xff09; 使用 Docker Compose 启动 Docker Compose 的特性 Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Dock…

MySQL误删数据怎么办?

文章目录 1. 从备份恢复数据2. 通过二进制日志恢复数据3. 使用数据恢复工具4. 利用事务回滚恢复数据5. 预防误删数据的策略总结 在使用MySQL进行数据管理时&#xff0c;误删数据是一个常见且具有高风险的操作。无论是因为操作失误、系统故障&#xff0c;还是不小心执行了删除命…

AAAI2024论文合集解读|Multi-granularity Causal Structure Learning-water-merged

论文标题 Multi-granularity Causal Structure Learning 多粒度因果结构学习 论文链接 Multi-granularity Causal Structure Learning 论文下载 论文作者 Jiaxuan Liang, Jun Wang, Guoxian Yu, Shuyin Xia, Guoyin Wang 内容简介 本文提出了一种新颖的方法&#xff0c;…

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型&#xff0c;以便根据输入特征预测目标变量&#xff0c;在使用 TensorFlow 2.x 实现线性回归模型时&…

【景区导游——LCA】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; const int M 2 * N; int p[N][18], d[N], a[N]; ll dis[N][18]; //注意这里要开long long int h[N], e[M], ne[M], idx, w[M]; int n, k; void add(int a, int b, …

家政预约小程序11分类展示

目录 1 创建页面2 配置导航菜单3 配置侧边栏选项卡4 配置数据列表5 首页和分类页联动总结 我们现在在首页开发了列表显示服务信息的功能&#xff0c;在点击导航菜单的时候&#xff0c;需要自动跳转到对应的分类&#xff0c;本篇我们介绍一下使用侧边栏选项卡实现分类显示的功能…

CVE-2023-38831 漏洞复现:win10 压缩包挂马攻击剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 影响范围 防御措施 复现步骤 环境准备 具体操作 前言 在网络安全这片没有硝烟的战场上&#xff0c;新型漏洞如同隐匿的暗箭&#xff0c;时刻威胁着我们的数字生活。其中&#xff0c;CVE - 2023 - 38831 这个关联 Win10 压缩包挂…

WPF进阶 | WPF 数据绑定进阶:绑定模式、转换器与验证

WPF进阶 | WPF 数据绑定进阶&#xff1a;绑定模式、转换器与验证 一、前言二、WPF 数据绑定基础回顾2.1 数据绑定的基本概念2.2 数据绑定的基本语法 三、绑定模式3.1 单向绑定&#xff08;One - Way Binding&#xff09;3.2 双向绑定&#xff08;Two - Way Binding&#xff09;…

Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

大会官网&#xff1a;www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包&#xff0c;提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件&#xff0c;包括其作用、使用方法以及示例代码&#xff0c;帮助你快速掌握 Swing 的核心知识。 一…

题解 信息学奥赛一本通/AcWing 1118 分成互质组 DFS C++

题目 传送门 AcWing 1118. 分成互质组 - AcWing题库https://www.acwing.com/problem/content/1120/https://www.acwing.com/problem/content/1120/https://www.acwing.com/problem/content/1120/https://www.acwing.com/problem/content/1120/https://www.acwing.com/proble…

论文阅读笔记:VMamba: Visual State Space Model

论文阅读笔记&#xff1a;VMamba: Visual State Space Model 1 背景2 创新点3 方法4 模块4.1 2D选择性扫描模块&#xff08;SS2D&#xff09;4.2 加速VMamba 5 效果5.1 和SOTA方法对比5.2 SS2D和自注意力5.3 有效感受野5.4 扫描模式 论文&#xff1a;https://arxiv.org/pdf/240…

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…

03:Heap代码的分析

Heap代码的分析 1、内存对齐2、Heap_1.c文件代码分析3、Heap_2.c文件代码分析4、Heap_4.c文件代码分析5、Heap_5.c文件代码分析 1、内存对齐 内存对齐的作用是为了CPU更快的读取数据。对齐存储与不对齐存储的情况如下&#xff1a; 计算机读取内存中的数据时是一组一组的读取的…

自动驾驶---苏箐对智驾产品的思考

1 前言 对于更高级别的自动驾驶&#xff0c;很多人都有不同的思考&#xff0c;方案也好&#xff0c;产品也罢。最近在圈内一位知名的自动驾驶专家苏箐发表了他自己对于自动驾驶未来的思考。 苏箐是地平线的副总裁兼首席架构师&#xff0c;同时也是高阶智能驾驶解决方案SuperDri…

Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)

Android BitmapShader简洁实现马赛克/高斯模糊&#xff08;毛玻璃&#xff09;&#xff0c;Kotlin&#xff08;三&#xff09; 发现&#xff0c;如果把&#xff08;二&#xff09; Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;二&#xff09;-CSDN博客 …

【数据结构】 并查集 + 路径压缩与按秩合并 python

目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合&#xff0c;每个集合用一棵树表示&#xff0c;树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点&#xff0c;那么它就是该集合的代…

【深度学习入门_机器学习理论】K近邻法(KNN)

本部分主要为机器学习理论入门_K近邻法(KNN)&#xff0c;书籍参考 “ 统计学习方法&#xff08;第二版&#xff09;”。 学习目标&#xff1a; 了解k近邻算法的基本概念、原理、应用&#xff1b;熟悉k近邻算法重要影响要素&#xff1b;熟悉kd树原理与优化应用。 开始本算法之…