Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import random
- import threading
- import minecraftstuff as minecraftstuff
- from mcpi.minecraft import Minecraft
- mc = Minecraft.create()
- ARENAX = 10 #Ширина арены
- ARENAZ = 20 #Длина арены
- ARENAY = 3 #Глубина арены
- def createArena(pos):
- # Создаём игровое поле из травы
- mc.setBlocks(pos.x - 1, pos.y, pos.z - 1,
- pos.x + ARENAX + 1, pos.y - 3, pos.z + ARENAZ + 1, 2)
- # Создаём стеклянные стенки
- mc.setBlocks(pos.x - 1, pos.y + 1, pos.z - 1,
- pos.x + ARENAX + 1, pos.y + ARENAY, pos.z + ARENAZ + 1, 20)
- mc.setBlocks(pos.x, pos.y + 1, pos.z,
- pos.x + ARENAX, pos.y + ARENAY, pos.z + ARENAZ, 0)
- def theWall(arenaPos, wallZPos, sleep): #Функция для создания стены
- wallPos = arenaPos.clone() #Клонируем координаты арены
- wallPos.y += 1
- wallPos.z += wallZPos
- #Создаём каркас для стены
- wallShape = minecraftstuff.MinecraftShape(mc, wallPos)
- #Заполняем каркас блоками
- wallShape.setBlocks(0, 1, 0, ARENAX, ARENAY - 1, 0, 45)
- while not gameOver: #Двигаем стену, пока игра не закончилась
- wallShape.moveBy(0, 1, 0) #Вверх
- time.sleep(1)
- wallShape.moveBy(0, -1, 0) #Вниз
- time.sleep(sleep)
- def theRiver(arenaPos, riverZPos):
- RIVERWIDTH = 4 #Ширина рва
- BRIDGEWIDTH = 2 #Ширина платформы
- # Создаём ров и заполняем его водой
- mc.setBlocks(arenaPos.x, arenaPos.y - 2, arenaPos.z + riverZPos,
- arenaPos.x + ARENAX, arenaPos.y,
- arenaPos.z + riverZPos + RIVERWIDTH - 1,
- 0)
- mc.setBlocks(arenaPos.x, arenaPos.y - 2, arenaPos.z + riverZPos,
- arenaPos.x + ARENAX, arenaPos.y - 2,
- arenaPos.z + riverZPos + RIVERWIDTH - 1,
- 8)
- # Получаем координаты платформы и перемещаем её
- bridgePos = arenaPos.clone()
- bridgePos.z += riverZPos + 1
- bridgeShape = minecraftstuff.MinecraftShape(mc, bridgePos)
- bridgeShape.setBlocks(0, 0, 0,
- BRIDGEWIDTH - 1, 0, RIVERWIDTH - 3,
- 5)
- steps = ARENAX - BRIDGEWIDTH + 1
- while not gameOver:
- for left in range(0, steps):
- bridgeShape.moveBy(1, 0, 0)
- time.sleep(1)
- for right in range(0, steps):
- bridgeShape.moveBy(-1, 0, 0)
- time.sleep(1)
- def theHoles(arenaPos, holesZPos): #Функция для создания ям
- HOLES = 15 #Количество ям
- HOLESWIDTH = 3 #Глубина ям
- holePos = arenaPos.clone() #клонируем координаты арены
- while not gameOver:
- holes = [] #Список с координатами ям
- for count in range(0, HOLES):
- x = random.randint(arenaPos.x, arenaPos.x + ARENAX)
- z = random.randint(arenaPos.z + holesZPos, arenaPos.z + holesZPos + HOLESWIDTH)
- holePos.x = x
- holePos.z = z
- holes.append(holePos.clone())#добавляем координаты новой ямы в список
- for hole in holes:
- mc.setBlock(hole.x, hole.y, hole.z, 35, 15) #Помечаем чёрной шерстью
- time.sleep(0.25)
- for hole in holes: #Создаём ямы
- mc.setBlocks(hole.x, hole.y, hole.z, hole.x, hole.y - 2, hole.z, 0)
- time.sleep(2)
- for hole in holes: #Закапываем ямы
- mc.setBlocks(hole.x, hole.y, hole.z, hole.x, hole.y - 2, hole.z, 2)
- time.sleep(2)
- def createDiamonds(arenaPos, number): #Функция создания алмазов
- for diamond in range(0, number):
- x = random.randint(arenaPos.x, arenaPos.x + ARENAX)
- z = random.randint(arenaPos.z, arenaPos.z + ARENAZ)
- mc.setBlock(x, arenaPos.y + 1, z, 57) #Ставим алмаз на полученное место
- gameOver = False
- arenaPos = mc.player.getTilePos()
- createArena(arenaPos)
- WALLZ = 10 #Расстояние от края поля до стены
- wall_t = threading.Thread(target = theWall, args = (arenaPos, WALLZ, 1))
- wall_t.start() #Запускаем поток с движением стены
- WALLZ2 = 12 #Расстояние от края поля до стены
- wall_t2 = threading.Thread(target = theWall, args = (arenaPos, WALLZ2, 1))
- wall_t2.start() #Запускаем поток с движением стены
- RIVERZ = 4 #Ширина реки
- river_t = threading.Thread(target = theRiver,args = (arenaPos, RIVERZ))
- river_t = threading.Thread(target = theRiver,args = (arenaPos, RIVERZ))
- river_t.start() #Запускаем поток с движением платформы над рекой
- HOLESZ = 15 #Количество ям
- holes_t = threading.Thread(target = theHoles, args = (arenaPos, HOLESZ))
- holes_t.start() #Запускаем поток с ямами
- LEVELS = 3 #Количество уровней
- DIAMONDS = [3,5,9] #Количество алмазов для всех уровней
- TIMEOUTS = [30,25,20] #Время для каждого уровня
- level = 0 #Начинаем с 0 уровня
- points = 0 #0 очков
- #Игровой цикл
- while not gameOver: #Пока игра не закончилась
- createDiamonds(arenaPos, DIAMONDS[level]) #Создаём алмазы
- diamondsLeft = DIAMONDS[level] #Сохраняем количество алмазов
- #Ставим игрока на начальную позицию
- mc.player.setTilePos(arenaPos.x + 1, arenaPos.y + 1, arenaPos.z + 1)
- start = time.time() #Запоминаем время начала уровня
- levelComplete = False
- # Цикл прохождения уровня
- while not gameOver and not levelComplete:
- time.sleep(0.1) #Ограничиваем скорость цикла
- # считаем оставшееся время
- secondsLeft = TIMEOUTS[level] - (time.time() - start)
- #Получаем удары по блокам мечом
- hits = mc.events.pollBlockHits()
- for hit in hits:
- blockHitType = mc.getBlock(hit.pos.x, hit.pos.y, hit.pos.z)
- if blockHitType == 57: #Если ударили по алмазу
- mc.setBlock(hit.pos.x, hit.pos.y, hit.pos.z, 0)
- diamondsLeft -= 1
- if secondsLeft < 0: #Если время вышло
- gameOver = True
- mc.postToChat("Время вышло...")
- pos = mc.player.getTilePos()
- if pos.y < arenaPos.y: #Если игрок провалился
- mc.player.setPos(arenaPos.x + 1, arenaPos.y + 1, arenaPos.z + 1)
- #Если игрок собрал все алмазы и дошел до противоположного края поля
- if pos.z == arenaPos.z + ARENAZ and diamondsLeft == 0:
- levelComplete = True
- if levelComplete:
- points = points + (DIAMONDS[level] * int(secondsLeft))
- mc.postToChat("Уровень завершён. Очков: " + str(points))
- level = level + 1
- #Если прошли все уровни
- if level == LEVELS:
- gameOver = True
- mc.postToChat("Поздравляем! Все уровни завершены!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement