Я использую API для использования кода python в minecraft. У меня два столба тощий и толстый, оба размера по размеру. Я пытаюсь сделать их построенными в квадратной области в несколько случайных местах. Весь мой код работает нормально до самого нижнего. Он запускает первую запись цикла «1 из 20 полных», но затем пропускает вторую и отправляет строку «2 из 20 полных» в игровой чат. Почему он пропускает второй цикл?python пропускает мой второй цикл for
from mcpi.minecraft import Minecraft
mc = Minecraft.create()
import random
import time
определяет, как построить тощий столб
def skinny_pillar(height, blockType):
global biomex
global biomez
y = mc.getHeight(biomex, biomez)
if (height == 3):
height = 2
if (height == 5):
height = 4
#Check it won't hit into anything
count = 0
block1 = mc.getBlock(biomex - 3, y, biomez)
block2 = mc.getBlock(biomex + 3, y, biomez)
block3 = mc.getBlock(biomex, y, biomez - 3)
block4 = mc.getBlock(biomex, y, biomez + 3)
while (count != 1):
if (block1 != 0):
biomex += 1
elif (block2 != 0):
biomex -= 1
elif (block3 != 0):
biomez += 1
elif (block4 != 0):
biomez -= 1
else:
count += 1
#Base of the pillar
baseHeight = height
mc.setBlocks(biomex - 1, y, biomez - 1, biomex + 1, y + baseHeight, biomez + 1, blockType)
mc.setBlocks(biomex - 2, y, biomez, biomex + 2, y + baseHeight + 1, biomez, blockType)
mc.setBlocks(biomex, y, biomez - 2, biomex, y + baseHeight + 1, biomez + 2, blockType)
#2nd layer of the pillar
secondHeight = height * 3
mc.setBlocks(biomex - 1, y, biomez, biomex + 1, y + secondHeight + 1, biomez, blockType)
mc.setBlocks(biomex, y, biomez - 1, biomex, y + secondHeight + 1, biomez + 1, blockType)
#Point of the pillar
pointHeight = height * 6
mc.setBlocks(biomex, y, biomez, biomex, y + pointHeight, biomez, blockType)
#Randomlly choose if the pillar will have a rock on top and only put it on the taller ones
rock = random.randint(1, 100)
if (height >= 4):
if (rock >= 70):
#Layer one
mc.setBlocks(biomex - 1, y + pointHeight, biomez - 1, biomex + 1, y + pointHeight, biomez + 1, blockType)
mc.setBlocks(biomex, y + pointHeight, biomez - 2, biomex, y + pointHeight, biomez + 2, blockType)
#Layer two
mc.setBlocks(biomex - 2, y + pointHeight + 1, biomez - 1, biomex + 2, y + pointHeight + 1, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 1, biomez - 2, biomex + 1, y + pointHeight + 1, biomez + 2, blockType)
mc.setBlocks(biomex, y + pointHeight + 1, biomez - 3, biomex, y + pointHeight + 1, biomez + 3, blockType)
#Layer three
mc.setBlocks(biomex - 2, y + pointHeight + 2, biomez - 2, biomex + 2, y + pointHeight + 2, biomez + 2, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 2, biomez - 3, biomex + 1, y + pointHeight + 2, biomez + 3, blockType)
mc.setBlocks(biomex , y + pointHeight + 2, biomez - 4, biomex, y + pointHeight + 2, biomez + 4, blockType)
#Layer four
mc.setBlocks(biomex - 2, y + pointHeight + 3, biomez - 1, biomex + 2, y + pointHeight + 3, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 3, biomez - 2, biomex + 1, y + pointHeight + 3, biomez + 2, blockType)
mc.setBlocks(biomex, y + pointHeight + 3, biomez - 3, biomex, y + pointHeight + 3, biomez + 3, blockType)
#Layer five
mc.setBlocks(biomex - 1, y + pointHeight + 4, biomez - 1, biomex + 1, y + pointHeight + 4, biomez + 1, blockType)
mc.setBlocks(biomex, y + pointHeight + 4, biomez - 2, biomex, y + pointHeight + 4, biomez + 2, blockType)
определяет, как построить жира столб
def fat_pillar(height, blockType):
global biomex
global biomez
y = mc.getHeight(biomex, biomez)
if (height == 3):
height = 2
if (height == 5):
height = 4
#Check it won't hit into anything
count = 0
while (count != 1):
block1 = mc.getBlock(biomex - 5, y, biomez)
block2 = mc.getBlock(biomex + 5, y, biomez)
block3 = mc.getBlock(biomex, y, biomez - 5)
block4 = mc.getBlock(biomex, y, biomez + 5)
if (block1 != 0):
biomex += 1
elif (block2 != 0):
biomex -= 1
elif (block3 != 0):
biomez += 1
elif (block4 != 0):
biomez -= 1
else:
count += 1
#Base of the pillar
baseHeight = height/2
mc.setBlocks(biomex - 3, y, biomez - 2, biomex + 3, y + baseHeight - 1, biomez + 2, blockType)
mc.setBlocks(biomex - 2, y, biomez - 3, biomex + 2, y + baseHeight - 1, biomez + 3, blockType)
mc.setBlocks(biomex, y, biomez - 4, biomex, y + baseHeight - 1, biomez + 4, blockType)
mc.setBlocks(biomex - 4, y, biomez, biomex + 4, y + baseHeight - 1, biomez, blockType)
#2nd layer of the pillar
secondHeight = height
mc.setBlocks(biomex - 2, y, biomez - 1, biomex + 2, y + secondHeight, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y, biomez - 2, biomex + 1, y + secondHeight, biomez + 2, blockType)
mc.setBlocks(biomex - 3, y, biomez - 1, biomex + 3, y + secondHeight - 1, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y, biomez - 3, biomex + 1, y + secondHeight - 1, biomez + 3, blockType)
#3rd layer of the pillar
thirdHeight = height * 2
mc.setBlocks(biomex - 1, y, biomez - 1, biomex + 1, y + thirdHeight, biomez + 1, blockType)
mc.setBlocks(biomex, y, biomez - 1, biomex, y + thirdHeight + 1, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y, biomez, biomex + 1, y + thirdHeight + 1, biomez, blockType)
#Point of the pillar
pointHeight = height * 3
mc.setBlocks(biomex, y, biomez, biomex, y + pointHeight, biomez, blockType)
#Randomlly choose if the pillar will have a rock on top and only put it on the taller ones
rock = random.randint(1, 100)
if (height >= 4):
if (rock >= 70):
#Layer one
mc.setBlocks(biomex - 1, y + pointHeight, biomez - 1, biomex + 1, y + pointHeight, biomez + 1, blockType)
mc.setBlocks(biomex, y + pointHeight, biomez - 2, biomex, y + pointHeight, biomez + 2, blockType)
#Layer two
mc.setBlocks(biomex - 2, y + pointHeight + 1, biomez - 1, biomex + 2, y + pointHeight + 1, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 1, biomez - 2, biomex + 1, y + pointHeight + 1, biomez + 2, blockType)
mc.setBlocks(biomex, y + pointHeight + 1, biomez - 3, biomex, y + pointHeight + 1, biomez + 3, blockType)
#Layer three
mc.setBlocks(biomex - 2, y + pointHeight + 2, biomez - 2, biomex + 2, y + pointHeight + 2, biomez + 2, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 2, biomez - 3, biomex + 1, y + pointHeight + 2, biomez + 3, blockType)
mc.setBlocks(biomex , y + pointHeight + 2, biomez - 4, biomex, y + pointHeight + 2, biomez + 4, blockType)
#Layer four
mc.setBlocks(biomex - 2, y + pointHeight + 3, biomez - 1, biomex + 2, y + pointHeight + 3, biomez + 1, blockType)
mc.setBlocks(biomex - 1, y + pointHeight + 3, biomez - 2, biomex + 1, y + pointHeight + 3, biomez + 2, blockType)
mc.setBlocks(biomex, y + pointHeight + 3, biomez - 3, biomex, y + pointHeight + 3, biomez + 3, blockType)
#Layer five
mc.setBlocks(biomex - 1, y + pointHeight + 4, biomez - 1, biomex + 1, y + pointHeight + 4, biomez + 1, blockType)
mc.setBlocks(biomex, y + pointHeight + 4, biomez - 2, biomex, y + pointHeight + 4, biomez + 2, blockType)
получает позицию игроков, которые все сосредоточенный вокруг.
pos = mc.player.getTilePos()
x = pos.x
z = pos.z
Я разбиваю площадь квадрата (биома) на несколько столбцов. Это первое. Остальное было бы таким же кодом, как это, но с немного отличающимся расположением координат.
#Make the first column of the biome
c = z -50
d = z -40
for i in range(-50, 0, 10):
a = x + i
b = x + (i + 10)
biomex = random.randint(a, b)
biomez = random.randint(c, d)
pillar = random.randint(1, 2)
if (pillar == 1):
fat_pillar(random.randint(2, 6), 1)
else:
skinny_pillar(random.randint(2, 6), 1)
time.sleep(0.5)
mc.postToChat("1 of 20 complete")
for i in range(50, 0, -10):
a = x + i
b = x + (i - 10)
biomex = random.randint(a, b)
biomez = random.randint(c, d)
pillar = random.randint(1, 2)
if (pillar == 1):
fat_pillar(random.randint(2, 6), 1)
else:
skinny_pillar(random.randint(2, 6), 1)
time.sleep(0.5)
mc.postToChat("2 of 20 complete")
Он строит участок отрицательной координаты столбца (первый цикл цикла) и отправляет строку в чат. Затем он немедленно отправляет вторую строку, пропуская второй цикл цикла (положительная координатная часть столбца). Что я делаю не так?
Попробуйте ввести код отладки. например 'print (« fat_pillar() активирован! »)', 'print (« skinny_pillar успешно создан! »)', 'print (biomex)' внутри каждой функции, чтобы увидеть, активируются ли функции с правильными значениями, как они должны. – ooknosi
Сам цикл for запускается, поэтому вам нужно смотреть глубже. У вас есть отличное предложение добавить заявления о печати ... что-нибудь это показало? – tdelaney