PCL+Spigot服务器+python进行MC编程(使用Trae进行AI编程)---可以生成彩虹
1.安装PCL(网上有多个教程,此处不介绍,也可以绿色版免安装),
夸克网盘分享
PCL2启动器龙腾猫跃爱发电官网下载 - 第三方PCL2下载站
PCL2启动器下载_龙腾猫跃 - 爱发电官网
安装成功后我们选择1.18.2的版本,fabric版本可以使用最新的。
我之前安装地铁MTR模组时需要安装java,我安装的是jdk-17.0.16_windows-x64_bin.exe,有些模组不适配最新的java版本,用的是PCL 正式版 2.10.3\.minecraft\versions\1.18.2-Fabric 0.17.1\saves\鹤浦市v1.0
2.python_MC编程安装包中是针对1.18.2的版本
python环境我本地是anaconda的,在虚拟环境中安装mcpi,
pip install mcpi
运行D:\1workplace\2企业项目\我的世界\python_MC编程安装包\1.18.2中的spigot-1.18.2.jar即可启动local server。
修改目录下的eula.txt中eula=true
通过网盘分享的文件:python_MC编程安装包
链接: https://pan.baidu.com/s/1GTcyvG7YWbW4P0qL0S6JOQ?pwd=1234 提取码: 1234
启动Spigot服务器(.jar文件的文件名可能不同)java -jar spigot-1.18.2.jar,或者直接双击spigot-1.18.2.jar
这样子本地服务器就起来了。
打开PCL的Plain Craft Launcher 2.exe(D:\1workplace\2企业项目\我的世界\PCL 正式版 2.10.3)
-
启动Minecraft Java版并进入一个世界(单人/多人模式均可),我进的是多人模式
-
如果是单人游戏,需要先开启局域网开放:
要看到***,joined the game
以及服务器但要有如下的显示:
打开Trae,打开文件夹,D:\1workplace\2企业项目\我的世界\python_MC编程安装包\MyAdventures,输入如下代码
from mcpi.minecraft import Minecrafttry:mc = Minecraft.create("localhost", 4711)# 获取玩家位置pos = mc.player.getPos()x, y, z = pos.x, pos.y, pos.z# 在玩家位置附近创建方块mc.setBlocks(x, y, z+3, x+5, y+5, z+8, 57) # 57 是钻石块的IDprint("方块已创建在位置: ({}, {}, {})".format(x, y, z))except AttributeError as e:print(f"属性错误: {e}")print("请检查 mcpi 库的文档,确认正确的方法名来获取玩家位置。")
except Exception as e:print(f"发生错误: {e}")
如果显示没有MCPI,那就是要pip install mcpi,
在服务器端输入op cys,这样子玩家cys设置为管理者,则可以输入管理码,
会报错,
File "d:\1workplace\2企业项目\我的世界\python_MC编 程安装包\MyAdventures\testMC.py", line 2, in <module>
mc = Minecraft.create("localhost", 4711)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\cys2025\.conda\envs\stategrid\Lib\site-packages\mcpi\minecraft.py", line 376, in create
return Minecraft(Connection(address, port))
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\cys2025\.conda\envs\stategrid\Lib\site-packages\mcpi\connection.py", line 17, in __init__
self.socket.connect((address, port))
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接
这个原因是RaspberryJuice没起得来,要把RaspberryJuice服务启动起来,可以这么操作:
netsh advfirewall firewall add rule name="MCPI" dir=in action=allow protocol=TCP localport=4711
然后重启服务器,java -jar spigot-1.18.2.jar或者运行Arun1.bat
要有如下界面,想办法把要把RaspberryJuice服务启动起来!!
造房子的代码如下:
''' 萌新小屋 1 '''
import mcpi.minecraft as minecraft
import mcpi.block as block
from math import *
mc = minecraft.Minecraft.create("localhost", 4711)origin_pos = mc.player.getTilePos()
# 5*6木制底板
mc.setBlocks(origin_pos.x - 1, origin_pos.y - 1, origin_pos.z - 1, origin_pos.x + 4, origin_pos.y - 1, origin_pos.z + 3, block.WOOD_PLANKS.id)# 墙壁
woodType = 1 # Spruce (up/down)
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z - 1, origin_pos.x, origin_pos.y + 2, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y, origin_pos.z - 1, origin_pos.x + 3, origin_pos.y + 2, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z + 3, origin_pos.x, origin_pos.y + 2, origin_pos.z + 3, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y, origin_pos.z + 3, origin_pos.x + 3, origin_pos.y + 2, origin_pos.z + 3, block.WOOD.id,woodType)
woodType = 0 # Oak (up/down)
mc.setBlocks(origin_pos.x - 1, origin_pos.y, origin_pos.z - 1, origin_pos.x - 1, origin_pos.y + 2, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z - 1, origin_pos.x + 4, origin_pos.y + 2, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x - 1, origin_pos.y, origin_pos.z + 3, origin_pos.x - 1, origin_pos.y + 2, origin_pos.z + 3, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z + 3, origin_pos.x + 4, origin_pos.y + 2, origin_pos.z + 3, block.WOOD.id,woodType)
woodType = 4 # Oak (east/west)
# mc.setBlocks(origin_pos.x + 1, origin_pos.y, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 2, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y + 2, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y, origin_pos.z + 3, origin_pos.x + 2, origin_pos.y, origin_pos.z + 3, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 2, origin_pos.z + 3, origin_pos.x + 2, origin_pos.y + 2, origin_pos.z + 3, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 4, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y + 4, origin_pos.z - 1, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 4, origin_pos.z + 3, origin_pos.x + 2, origin_pos.y + 4, origin_pos.z + 3, block.WOOD.id,woodType)
woodType = 8 # Oak (north/south)
mc.setBlocks(origin_pos.x - 1, origin_pos.y, origin_pos.z, origin_pos.x - 1, origin_pos.y, origin_pos.z + 2, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 2, origin_pos.z, origin_pos.x - 1, origin_pos.y + 2, origin_pos.z + 2, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z, origin_pos.x + 4, origin_pos.y, origin_pos.z + 2, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 2, origin_pos.z, origin_pos.x + 4, origin_pos.y + 2, origin_pos.z + 2, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 3, origin_pos.z - 1, origin_pos.x + 3, origin_pos.y + 3, origin_pos.z + 3, block.WOOD.id,woodType)
mc.setBlocks(origin_pos.x, origin_pos.y + 3, origin_pos.z - 1, origin_pos.x, origin_pos.y + 3, origin_pos.z + 3, block.WOOD.id,woodType)# 屋顶
stairType = 0 # Oak (Ascending east)
mc.setBlocks(origin_pos.x - 2, origin_pos.y + 2, origin_pos.z - 2, origin_pos.x - 2, origin_pos.y + 2, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 3, origin_pos.z - 2, origin_pos.x - 1, origin_pos.y + 3, origin_pos.z + 4, block.STAIRS_WOOD.id)
mc.setBlocks(origin_pos.x, origin_pos.y + 4, origin_pos.z - 2, origin_pos.x, origin_pos.y + 4, origin_pos.z + 4, block.STAIRS_WOOD.id)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 5, origin_pos.z - 2, origin_pos.x + 1, origin_pos.y + 5, origin_pos.z + 4, block.STAIRS_WOOD.id)
stairType = 1 # Oak (Ascending west)
mc.setBlocks(origin_pos.x + 5, origin_pos.y + 2, origin_pos.z - 2, origin_pos.x + 5, origin_pos.y + 2, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 3, origin_pos.z - 2, origin_pos.x + 4, origin_pos.y + 3, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 4, origin_pos.z - 2, origin_pos.x + 3, origin_pos.y + 4, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 2, origin_pos.y + 5, origin_pos.z - 2, origin_pos.x + 2, origin_pos.y + 5, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
stairType = 4 # Ascending east (upside down)
for i in range(2,5):j = 6 - imc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z - 2, block.STAIRS_WOOD.id, stairType)mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
stairType = 5 # Ascending west (upside down)
for i in range(-1,2):j = i + 3mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z - 2, block.STAIRS_WOOD.id, stairType)mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z + 4, block.STAIRS_WOOD.id, stairType)
# 房顶
plankType = 3 # Jungle
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 4, origin_pos.z, origin_pos.x + 2, origin_pos.y + 4, origin_pos.z + 2, block.WOOD_PLANKS.id, plankType)
# 窗户 GLASS_PANE
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 1, origin_pos.z, origin_pos.x - 1, origin_pos.y + 1, origin_pos.z + 2, block.GLASS.id)
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 1, origin_pos.z, origin_pos.x + 4, origin_pos.y + 1, origin_pos.z + 2, block.GLASS.id)
# 门
mc.setBlocks(origin_pos.x + 1, origin_pos.y, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y, origin_pos.z - 1, block.DOOR_WOOD.id, 0)
AI编程:提出如下prompt,构建20阶楼梯如下:
代码如下:
''' 萌新小屋 1 - 复杂二层房子 '''
import mcpi.minecraft as minecraft
import mcpi.block as block
from math import *
mc = minecraft.Minecraft.create("localhost", 4711)origin_pos = mc.player.getTilePos()
# 7*9木制底板 (扩展基础)
mc.setBlocks(origin_pos.x - 2, origin_pos.y - 1, origin_pos.z - 2, origin_pos.x + 5, origin_pos.y - 1, origin_pos.z + 4, block.WOOD_PLANKS.id)# 第一层墙壁
woodType = 1 # Spruce (up/down)
# 前墙
mc.setBlocks(origin_pos.x - 1, origin_pos.y, origin_pos.z - 2, origin_pos.x - 1, origin_pos.y + 3, origin_pos.z - 2, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z - 2, origin_pos.x + 4, origin_pos.y + 3, origin_pos.z - 2, block.WOOD.id, woodType)
# 后墙
mc.setBlocks(origin_pos.x - 1, origin_pos.y, origin_pos.z + 4, origin_pos.x - 1, origin_pos.y + 3, origin_pos.z + 4, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z + 4, origin_pos.x + 4, origin_pos.y + 3, origin_pos.z + 4, block.WOOD.id, woodType)
# 侧墙
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z - 2, origin_pos.x + 3, origin_pos.y + 3, origin_pos.z - 2, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z + 4, origin_pos.x + 3, origin_pos.y + 3, origin_pos.z + 4, block.WOOD.id, woodType)woodType = 0 # Oak (up/down)
# 前墙
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z - 2, origin_pos.x, origin_pos.y + 3, origin_pos.z - 2, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y, origin_pos.z - 2, origin_pos.x + 3, origin_pos.y + 3, origin_pos.z - 2, block.WOOD.id, woodType)
# 后墙
mc.setBlocks(origin_pos.x, origin_pos.y, origin_pos.z + 4, origin_pos.x, origin_pos.y + 3, origin_pos.z + 4, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y, origin_pos.z + 4, origin_pos.x + 3, origin_pos.y + 3, origin_pos.z + 4, block.WOOD.id, woodType)# 第二层地板
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 3, origin_pos.z - 1, origin_pos.x + 4, origin_pos.y + 3, origin_pos.z + 3, block.WOOD_PLANKS.id, 1) # Spruce planks# 第二层墙壁
woodType = 5 # Birch (up/down)
# 前墙
mc.setBlocks(origin_pos.x, origin_pos.y + 4, origin_pos.z - 1, origin_pos.x, origin_pos.y + 6, origin_pos.z - 1, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 4, origin_pos.z - 1, origin_pos.x + 3, origin_pos.y + 6, origin_pos.z - 1, block.WOOD.id, woodType)
# 后墙
mc.setBlocks(origin_pos.x, origin_pos.y + 4, origin_pos.z + 3, origin_pos.x, origin_pos.y + 6, origin_pos.z + 3, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 4, origin_pos.z + 3, origin_pos.x + 3, origin_pos.y + 6, origin_pos.z + 3, block.WOOD.id, woodType)
# 侧墙
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 4, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y + 6, origin_pos.z - 1, block.WOOD.id, woodType)
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 4, origin_pos.z + 3, origin_pos.x + 2, origin_pos.y + 6, origin_pos.z + 3, block.WOOD.id, woodType)# 屋顶 (调整以适应新尺寸)
stairType = 0 # Oak (Ascending east)
mc.setBlocks(origin_pos.x - 3, origin_pos.y + 4, origin_pos.z - 3, origin_pos.x - 3, origin_pos.y + 4, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x - 2, origin_pos.y + 5, origin_pos.z - 3, origin_pos.x - 2, origin_pos.y + 5, origin_pos.z + 5, block.STAIRS_WOOD.id)
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 6, origin_pos.z - 3, origin_pos.x - 1, origin_pos.y + 6, origin_pos.z + 5, block.STAIRS_WOOD.id)
mc.setBlocks(origin_pos.x, origin_pos.y + 7, origin_pos.z - 3, origin_pos.x, origin_pos.y + 7, origin_pos.z + 5, block.STAIRS_WOOD.id)stairType = 1 # Oak (Ascending west)
mc.setBlocks(origin_pos.x + 6, origin_pos.y + 4, origin_pos.z - 3, origin_pos.x + 6, origin_pos.y + 4, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 5, origin_pos.y + 5, origin_pos.z - 3, origin_pos.x + 5, origin_pos.y + 5, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 6, origin_pos.z - 3, origin_pos.x + 4, origin_pos.y + 6, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 7, origin_pos.z - 3, origin_pos.x + 3, origin_pos.y + 7, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)stairType = 4 # Ascending east (upside down)
for i in range(3, 6):j = 9 - imc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z - 3, block.STAIRS_WOOD.id, stairType)mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)stairType = 5 # Ascending west (upside down)
for i in range(-2, 1):j = i + 5mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z - 3, block.STAIRS_WOOD.id, stairType)mc.setBlock(origin_pos.x + i, origin_pos.y + j, origin_pos.z + 5, block.STAIRS_WOOD.id, stairType)# 房顶顶部
plankType = 3 # Jungle
mc.setBlocks(origin_pos.x + 1, origin_pos.y + 6, origin_pos.z - 1, origin_pos.x + 2, origin_pos.y + 6, origin_pos.z + 3, block.WOOD_PLANKS.id, plankType)# 窗户 GLASS_PANE
# 第一层窗户
mc.setBlocks(origin_pos.x - 1, origin_pos.y + 1, origin_pos.z - 1, origin_pos.x - 1, origin_pos.y + 2, origin_pos.z + 1, block.GLASS.id)
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 1, origin_pos.z - 1, origin_pos.x + 4, origin_pos.y + 2, origin_pos.z + 1, block.GLASS.id)
# 第二层窗户
mc.setBlocks(origin_pos.x, origin_pos.y + 5, origin_pos.z - 1, origin_pos.x, origin_pos.y + 5, origin_pos.z - 1, block.GLASS.id)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 5, origin_pos.z - 1, origin_pos.x + 3, origin_pos.y + 5, origin_pos.z - 1, block.GLASS.id)
mc.setBlocks(origin_pos.x, origin_pos.y + 5, origin_pos.z + 3, origin_pos.x, origin_pos.y + 5, origin_pos.z + 3, block.GLASS.id)
mc.setBlocks(origin_pos.x + 3, origin_pos.y + 5, origin_pos.z + 3, origin_pos.x + 3, origin_pos.y + 5, origin_pos.z + 3, block.GLASS.id)# 门
mc.setBlocks(origin_pos.x + 1, origin_pos.y, origin_pos.z - 2, origin_pos.x + 2, origin_pos.y + 1, origin_pos.z - 2, block.DOOR_WOOD.id, 0)# 楼梯 (从第一层到第二层)
mc.setBlocks(origin_pos.x + 4, origin_pos.y, origin_pos.z, origin_pos.x + 4, origin_pos.y + 3, origin_pos.z, block.STAIRS_WOOD.id, 3) # Oak stairs ascending south# 二楼阳台
mc.setBlocks(origin_pos.x + 4, origin_pos.y + 4, origin_pos.z - 1, origin_pos.x + 5, origin_pos.y + 4, origin_pos.z + 1, block.WOOD_PLANKS.id, 2) # Birch planks
mc.setBlocks(origin_pos.x + 5, origin_pos.y + 1, origin_pos.z - 1, origin_pos.x + 5, origin_pos.y + 3, origin_pos.z + 1, block.FENCE.id)# 20阶楼梯
stair_x, stair_y, stair_z = origin_pos.x + 7, origin_pos.y, origin_pos.z
for i in range(20):mc.setBlock(stair_x + i, stair_y + i, stair_z, block.STAIRS_WOOD.id, 3) # Oak stairs ascending south
以上都没有颜色,接下来是彩虹的建造:
Java 版本(1.12及以下)设计的旧版本中,方块是通过数字ID和数据值(如 35, 14
)来标识的,但是Minecraft 1.18.2 使用了命名空间ID:从 Minecraft 1.13 开始,游戏引入了“扁平化”(Flattening),废除了数字ID,改用字符串ID(如 minecraft:red_wool
)。mcpi
库发送的基于数字ID的指令对 1.18.2 的游戏核心是无效的。上述juicyraspberrypie更新到最新版本(也就是最后一个版本)juicyraspberrypie-1.18.1.jar,必须以字符串ID形式给出:
代码如下:
# 导入所需的库
import mcpi.minecraft as minecraft
from math import sin, pi# --- 现代化的 setBlock 函数 ---
# 既然我们知道插件支持字符串ID,我们就自己封装一个函数来发送它们
def set_block_modern(mc_conn, x, y, z, block_string):"""使用底层连接直接发送字符串ID来设置方块"""mc_conn.send(b"world.setBlock", int(x), int(y), int(z), block_string)# --- 主程序 ---
try:mc = minecraft.Minecraft.create()
except ConnectionRefusedError:print("错误:无法连接到 Minecraft。")exit()# 使用现代的字符串ID定义颜色,更清晰!
colors = ["minecraft:red_wool","minecraft:orange_wool","minecraft:yellow_wool","minecraft:lime_wool","minecraft:blue_wool","minecraft:light_blue_wool", # 用浅蓝代表靛色"minecraft:purple_wool"
]height = 60
width = 128try:pos = mc.player.getTilePos()x_start, y_start, z_start = pos.x, pos.y, pos.z + width // 2 + 15
except Exception as e:print(f"获取玩家位置失败: {e}")x_start, y_start, z_start = 0, 64, 0mc.postToChat("§a正在使用现代方法生成彩色虹!§r")for x in range(width):for color_index in range(len(colors)):rel_x = x - width // 2y = y_start + sin((x / width) * pi) * height + color_index# 获取当前循环的颜色字符串current_color_string = colors[len(colors) - 1 - color_index]# 使用我们自制的现代函数来放置方块!set_block_modern(mc.conn, x_start + rel_x, y, z_start, current_color_string)mc.postToChat("§b真正的彩色虹生成完毕!§r")
彩虹生成完毕!(腾讯元宝和Qwen都没有给出正确的code,最后是gemini2.5-pro给出的)