2017-01-14 2 views
-1

Я использую 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") 

Он строит участок отрицательной координаты столбца (первый цикл цикла) и отправляет строку в чат. Затем он немедленно отправляет вторую строку, пропуская второй цикл цикла (положительная координатная часть столбца). Что я делаю не так?

+3

Попробуйте ввести код отладки. например 'print (« fat_pillar() активирован! »)', 'print (« skinny_pillar успешно создан! »)', 'print (biomex)' внутри каждой функции, чтобы увидеть, активируются ли функции с правильными значениями, как они должны. – ooknosi

+0

Сам цикл for запускается, поэтому вам нужно смотреть глубже. У вас есть отличное предложение добавить заявления о печати ... что-нибудь это показало? – tdelaney

ответ

0

Итак, я пошел добавлять текст для отображения для каждой вещи, как предлагалось, и обнаружил, что весь код будет работать просто отлично, даже вошел в начало второго цикла до biomex = random.randint(a, b) текста, который я добавил до того, «получил 117, получил b 107». Из этого я понял, что проблема заключалась в упорядочении a и b. Во втором цикле он делает b более низким и более высоким, что противоположно первому циклу. Для этого тоже работаю все, что мне нужно было сделать, это обменять a и b, чтобы нижнее число было первым, а большее число было последним biomex = random.randint(b, a) Я думаю, что это странно, что python просто прекратил выполнение кода, не отображая сообщение об ошибке для меня , Если бы это было, я, вероятно, мог бы заметить это раньше.

Смежные вопросы