本文主要是介绍在Minecraft里使用python生成一个通天DNA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近发现可以用python代码玩Minecraft,于是想尝试一下,搭建环境对于我这种没玩过的同学来说可能有一点小复杂,下面我总结了两种方式:
- 在单人模式里调用python脚本(无服务器):
在我的世界中用 python 编程(作者:野马和云图) - 使用Spigot搭建服务器并进入多人模式:
PYTHON玩转我的世界(1)——环境搭建(作者:非零非非零)
两位作者写的都很好并且两个环境我都已经安装好了,下面先来看看两种方式的效果如何以及两种方式的区别
在单人模式里调用python脚本(无服务器)
按T打开对话窗口,输入 /py + 想要执行的文件名(不加.py后缀)即可执行:
dna_mc
使用Spigot搭建服务器并进入多人模式
按T打开对话窗口,输入 /p list 查看可执行程序列表:
输入 /p + 想要执行的文件名(不加.py后缀)即可执行:
完整操作请看视频:
minecraeft_rainbow
两种打开方式的区别
其实细心的朋友就会发现,两者的区别主要体现在命令的不同:
单人模式下是 /py
多人模式下是 /p
在实际写代码时两种方式的不同
在单人模式下,代码修改后可以马上生效:
原来循环的次数是240,这里我调到了12,再次运行时,马上生效
而在多人模式下则需要重启服务器才能生效!
因此,我果断抛弃了需要服务器的打开方式,另外,开启服务器的同时,电脑有可能顶不住,很卡,这也是我放弃这个方式的理由(当然,这种方式不能完全抛弃,在某些时候还是会用上的)
在单人模式里自动生成一个通天DNA
下面回归正题,开始上代码:
from mine import *
from drawing import *
from random import choice
代码的开头导入了两个文件,以及一个random资源库,这两个文件分别对应这两个文件:
简单看了一下,就是一些封装的文件,这里不一定要把底层代码搞懂,会用即可
mc = Minecraft()
drawing = Drawing(mc)
pos = mc.player.getTilePos()
这三行是在Minecraft里调用的核心,作用就是连接到游戏中,并且获取人物位置
下面是定义这个DNA的结构:
radius = 10
A = block.WOOL_ORANGE
C = block.WOOL_GREEN
G = block.WOOL_BLUE
T = block.WOOL_REDblocks = { "A":(A,T), "C":(C,G), "T":(T,A), "G":(G,C) }
# sequence taken from somewhere in chromosome 5, retrieved via Wolfram Alpha
sequence = "CAAAAGTGTGGGGAAATTAATTTGGGAATTACTCTCCTCATTGAAAAATATCTCATTTGCTAAAATAAGACAGTAAAACAGTACAGTTTAAATATTTATAAAAATAGGAAAGTTTGGCAAAAAGAGAGGAGTACACACCTGTGACTACTGAGTTGCTGTGAAAATTTCATTTCCTGATACAAAATTGTCTAAAGCACTTG"
- radius表示半径,赋值为10,也就是10个方块的长度;
- ATCG这些是DNA的组成,这里用颜色来分类;
- 另外,DNA是双螺旋结构,因此blocks定义了组合规则;
- 最后的sequence就是这条DNA的序列了。
下面用一个for循环:
prev = None
skip = 2
for y in range(240):theta = y * pi / (skip*10) #计算角度,pi即Πprint("theta:",theta)y1 = pos.y + yx1 = pos.x - radius * cos(theta)x2 = pos.x + radius * cos(theta)z1 = pos.z + radius * sin(theta)z2 = pos.z - radius * sin(theta)if y % skip == 0:pair = blocks[sequence[-(y//skip)-1]]drawing.penwidth(1)drawing.line(x1,y1,z1,pos.x,y1,pos.z,pair[0])drawing.line(x2,y1,z2,pos.x,y1,pos.z,pair[1])if prev is not None:drawing.penwidth(2)drawing.line(prev[0],prev[1],prev[2],x1,y1,z1,block.WOOL_WHITE)drawing.line(prev[3],prev[4],prev[5],x2,y1,z2,block.WOOL_WHITE)prev = x1,y1,z1,x2,y1,z2print("x1:%d,y1:%d,z1:%d,x2:%d,y1:%d,z2:%d9"%(x1,y1,z1,x2,y1,z2))
既然DNA是螺旋结构,那么我们需要设置好角度,随着y的增大,这个角度也要做出调整
下面两个if条件语句是生成DNA的:
- 第一个if语句控制间隔,隔一个生成一次
- 第二个if语句用来生成DNA的骨架
下面是调试的输出结果:
完整代码如下:
from mine import *
from drawing import *
from random import choicemc = Minecraft()
drawing = Drawing(mc)
pos = mc.player.getTilePos()radius = 10
A = block.WOOL_ORANGE
C = block.WOOL_GREEN
G = block.WOOL_BLUE
T = block.WOOL_REDblocks = { "A":(A,T), "C":(C,G), "T":(T,A), "G":(G,C) }
# sequence taken from somewhere in chromosome 5, retrieved via Wolfram Alpha
sequence = "CAAAAGTGTGGGGAAATTAATTTGGGAATTACTCTCCTCATTGAAAAATATCTCATTTGCTAAAATAAGACAGTAAAACAGTACAGTTTAAATATTTATAAAAATAGGAAAGTTTGGCAAAAAGAGAGGAGTACACACCTGTGACTACTGAGTTGCTGTGAAAATTTCATTTCCTGATACAAAATTGTCTAAAGCACTTG"prev = None
skip = 2
for y in range(2):theta = y * pi / (skip*10) #计算角度,pi即Πprint("theta:",theta)y1 = pos.y + yx1 = pos.x - radius * cos(theta)x2 = pos.x + radius * cos(theta)z1 = pos.z + radius * sin(theta)z2 = pos.z - radius * sin(theta)if y % skip == 0:pair = blocks[sequence[-(y//skip)-1]]drawing.penwidth(1)drawing.line(x1,y1,z1,pos.x,y1,pos.z,pair[0])drawing.line(x2,y1,z2,pos.x,y1,pos.z,pair[1])if prev is not None:drawing.penwidth(2)drawing.line(prev[0],prev[1],prev[2],x1,y1,z1,block.WOOL_WHITE)drawing.line(prev[3],prev[4],prev[5],x2,y1,z2,block.WOOL_WHITE)prev = x1,y1,z1,x2,y1,z2print("x1:%d,y1:%d,z1:%d,x2:%d,y1:%d,z2:%d9"%(x1,y1,z1,x2,y1,z2))
GitHub地址:https://github.com/arpruss/raspberryjammod
这篇关于在Minecraft里使用python生成一个通天DNA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!