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 是钻石块的ID print(\"方块已创建在位置: ({}, {}, {})\".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
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 minecraftimport mcpi.block as blockfrom 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 - i mc.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 + 3 mc.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 # Junglemc.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_PANEmc.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 minecraftimport mcpi.block as blockfrom 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 - i mc.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 + 5 mc.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 # Junglemc.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 planksmc.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.zfor 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 minecraftfrom 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 = 60width = 128try: pos = mc.player.getTilePos() x_start, y_start, z_start = pos.x, pos.y, pos.z + width // 2 + 15except 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 // 2 y = 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给出的)