Advertisement
Orleon

Untitled

Dec 26th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.98 KB | None | 0 0
  1. import time
  2. import random
  3. import threading
  4. import minecraftstuff as minecraftstuff
  5. from mcpi.minecraft import Minecraft
  6. mc = Minecraft.create()
  7.  
  8. ARENAX = 10          #Ширина арены
  9. ARENAZ = 20          #Длина арены
  10. ARENAY = 3           #Глубина арены
  11.  
  12. def createArena(pos):
  13.    # Создаём игровое поле из травы
  14.    mc.setBlocks(pos.x - 1, pos.y, pos.z - 1,
  15.                 pos.x + ARENAX + 1, pos.y - 3, pos.z + ARENAZ + 1, 2)
  16.     # Создаём стеклянные стенки
  17.    mc.setBlocks(pos.x - 1, pos.y + 1, pos.z - 1,
  18.                 pos.x + ARENAX + 1, pos.y + ARENAY, pos.z + ARENAZ + 1, 20)
  19.    mc.setBlocks(pos.x, pos.y + 1, pos.z,
  20.                 pos.x + ARENAX, pos.y + ARENAY, pos.z + ARENAZ, 0)
  21.  
  22. def theWall(arenaPos, wallZPos, sleep):    #Функция для создания стены
  23.    wallPos = arenaPos.clone()      #Клонируем координаты арены
  24.    wallPos.y += 1
  25.    wallPos.z += wallZPos
  26.    #Создаём каркас для стены
  27.    wallShape = minecraftstuff.MinecraftShape(mc, wallPos)
  28.    #Заполняем каркас блоками
  29.    wallShape.setBlocks(0, 1, 0, ARENAX, ARENAY - 1, 0, 45)
  30.    while not gameOver:           #Двигаем стену, пока игра не закончилась
  31.        wallShape.moveBy(0, 1, 0)   #Вверх
  32.        time.sleep(1)
  33.        wallShape.moveBy(0, -1, 0)  #Вниз
  34.        time.sleep(sleep)
  35.  
  36.  
  37. def theRiver(arenaPos, riverZPos):
  38.    RIVERWIDTH = 4                  #Ширина рва
  39.    BRIDGEWIDTH = 2                 #Ширина платформы
  40.    # Создаём ров и заполняем его водой
  41.    mc.setBlocks(arenaPos.x, arenaPos.y - 2, arenaPos.z + riverZPos,
  42.                 arenaPos.x + ARENAX, arenaPos.y,
  43.                 arenaPos.z + riverZPos + RIVERWIDTH - 1,
  44.                 0)
  45.  
  46.    mc.setBlocks(arenaPos.x, arenaPos.y - 2, arenaPos.z + riverZPos,
  47.                 arenaPos.x + ARENAX, arenaPos.y - 2,
  48.                 arenaPos.z + riverZPos + RIVERWIDTH - 1,
  49.                 8)
  50.    # Получаем координаты платформы и перемещаем её
  51.    bridgePos = arenaPos.clone()
  52.    bridgePos.z += riverZPos + 1
  53.    bridgeShape = minecraftstuff.MinecraftShape(mc, bridgePos)
  54.    bridgeShape.setBlocks(0, 0, 0,
  55.                          BRIDGEWIDTH - 1, 0, RIVERWIDTH - 3,
  56.                          5)
  57.    steps = ARENAX - BRIDGEWIDTH + 1
  58.    while not gameOver:
  59.        for left in range(0, steps):
  60.            bridgeShape.moveBy(1, 0, 0)
  61.            time.sleep(1)
  62.        for right in range(0, steps):
  63.            bridgeShape.moveBy(-1, 0, 0)
  64.            time.sleep(1)
  65.  
  66.  
  67.  
  68. def theHoles(arenaPos, holesZPos):     #Функция для создания ям
  69.    HOLES = 15                          #Количество ям
  70.    HOLESWIDTH = 3                      #Глубина ям
  71.    holePos = arenaPos.clone()          #клонируем координаты арены
  72.    while not gameOver:
  73.        holes = []                      #Список с координатами ям
  74.        for count in range(0, HOLES):
  75.            x = random.randint(arenaPos.x, arenaPos.x + ARENAX)
  76.            z = random.randint(arenaPos.z + holesZPos, arenaPos.z + holesZPos + HOLESWIDTH)
  77.            holePos.x = x
  78.            holePos.z = z
  79.            holes.append(holePos.clone())#добавляем координаты новой ямы в список
  80.        for hole in holes:
  81.            mc.setBlock(hole.x, hole.y, hole.z, 35, 15)  #Помечаем чёрной шерстью
  82.        time.sleep(0.25)
  83.  
  84.        for hole in holes:              #Создаём ямы
  85.            mc.setBlocks(hole.x, hole.y, hole.z, hole.x, hole.y - 2, hole.z, 0)
  86.        time.sleep(2)
  87.  
  88.        for hole in holes:              #Закапываем ямы
  89.            mc.setBlocks(hole.x, hole.y, hole.z, hole.x, hole.y - 2, hole.z, 2)
  90.        time.sleep(2)
  91.  
  92.  
  93.  
  94. def createDiamonds(arenaPos, number):   #Функция создания алмазов
  95.    for diamond in range(0, number):
  96.       x = random.randint(arenaPos.x, arenaPos.x + ARENAX)
  97.       z = random.randint(arenaPos.z, arenaPos.z + ARENAZ)
  98.       mc.setBlock(x, arenaPos.y + 1, z, 57) #Ставим алмаз на полученное место
  99.  
  100.  
  101. gameOver = False
  102. arenaPos = mc.player.getTilePos()
  103. createArena(arenaPos)
  104.  
  105. WALLZ = 10                          #Расстояние от края поля до стены
  106. wall_t = threading.Thread(target = theWall, args = (arenaPos, WALLZ, 1))
  107. wall_t.start()                      #Запускаем поток с движением стены
  108.  
  109. WALLZ2 = 12                          #Расстояние от края поля до стены
  110. wall_t2 = threading.Thread(target = theWall, args = (arenaPos, WALLZ2, 1))
  111. wall_t2.start()                      #Запускаем поток с движением стены
  112.  
  113.  
  114. RIVERZ = 4                          #Ширина реки
  115. river_t = threading.Thread(target = theRiver,args = (arenaPos, RIVERZ))
  116. river_t = threading.Thread(target = theRiver,args = (arenaPos, RIVERZ))
  117. river_t.start()        #Запускаем поток с движением платформы над рекой
  118.  
  119.  
  120. HOLESZ = 15                         #Количество ям
  121. holes_t = threading.Thread(target = theHoles, args = (arenaPos, HOLESZ))
  122. holes_t.start()              #Запускаем поток с ямами
  123.  
  124. LEVELS = 3                          #Количество уровней
  125. DIAMONDS = [3,5,9]                  #Количество алмазов для всех уровней
  126. TIMEOUTS = [30,25,20]               #Время для каждого уровня
  127.  
  128. level = 0                           #Начинаем с 0 уровня
  129. points = 0                          #0 очков
  130.  
  131. #Игровой цикл
  132. while not gameOver:                 #Пока игра не закончилась
  133.    createDiamonds(arenaPos, DIAMONDS[level]) #Создаём алмазы
  134.    diamondsLeft = DIAMONDS[level]            #Сохраняем количество алмазов
  135.  
  136.    #Ставим игрока на начальную позицию
  137.    mc.player.setTilePos(arenaPos.x + 1, arenaPos.y + 1, arenaPos.z + 1)
  138.    start = time.time()      #Запоминаем время начала уровня
  139.    levelComplete = False
  140.  
  141.  
  142.    # Цикл прохождения уровня
  143.    while not gameOver and not levelComplete:
  144.        time.sleep(0.1)    #Ограничиваем скорость цикла
  145.        # считаем оставшееся время
  146.        secondsLeft = TIMEOUTS[level] - (time.time() - start)
  147.        #Получаем удары по блокам мечом
  148.        hits = mc.events.pollBlockHits()
  149.        for hit in hits:
  150.            blockHitType = mc.getBlock(hit.pos.x, hit.pos.y, hit.pos.z)
  151.            if blockHitType == 57: #Если ударили по алмазу
  152.                mc.setBlock(hit.pos.x, hit.pos.y, hit.pos.z, 0)
  153.                diamondsLeft -= 1
  154.        if secondsLeft < 0:         #Если время вышло
  155.            gameOver = True
  156.            mc.postToChat("Время вышло...")
  157.        pos = mc.player.getTilePos()
  158.        if pos.y < arenaPos.y:      #Если игрок провалился
  159.            mc.player.setPos(arenaPos.x + 1, arenaPos.y + 1, arenaPos.z + 1)
  160.        #Если игрок собрал все алмазы и дошел до противоположного края поля
  161.        if pos.z == arenaPos.z + ARENAZ and diamondsLeft == 0:
  162.            levelComplete = True
  163.        if levelComplete:
  164.            points = points + (DIAMONDS[level] * int(secondsLeft))
  165.            mc.postToChat("Уровень завершён. Очков: " + str(points))
  166.            level = level + 1
  167.            #Если прошли все уровни
  168.            if level == LEVELS:
  169.                gameOver = True
  170.                mc.postToChat("Поздравляем! Все уровни завершены!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement