Загрузка данных
def explain_rules(self):
"""Объяснение правил игры"""
rules = [
"Добро пожаловать в викторину-лабиринт!",
"Правила:",
"1. Перед тобой будут стены с вопросами",
"2. Ударь по золотому блоку чтобы получить вопрос",
"3. Ответь в чат цифрой (1-4)",
"4. За правильный ответ откроется проход",
"5. За ошибку теряешь жизнь (всего 3 жизни)",
"6. Пройди все 10 уровней чтобы победить!",
"Удачи!"
]
for line in rules:
mc.postToChat(line)
time.sleep(1)
def build_start_area(self):
"""Построение стартовой площадки"""
self.player_pos = mc.player.getTilePos()
x, y, z = self.player_pos.x, self.player_pos.y, self.player_pos.z
# Очистка области
mc.setBlocks(x-CORRIDOR_WIDTH-1, y-1, z-5,
x+CORRIDOR_WIDTH+1, y+WALL_HEIGHT+1, z+LEVELS*WALL_DISTANCE+10,
AIR_BLOCK)
# Пол
mc.setBlocks(x-CORRIDOR_WIDTH-1, y-1, z-5,
x+CORRIDOR_WIDTH+1, y-1, z+LEVELS*WALL_DISTANCE+10,
FLOOR_BLOCK)
# Боковые стены
mc.setBlocks(x-CORRIDOR_WIDTH, y, z-5,
x-CORRIDOR_WIDTH, y+WALL_HEIGHT, z+LEVELS*WALL_DISTANCE+10,
WALL_BLOCK)
mc.setBlocks(x+CORRIDOR_WIDTH, y, z-5,
x+CORRIDOR_WIDTH, y+WALL_HEIGHT, z+LEVELS*WALL_DISTANCE+10,
WALL_BLOCK)
# Задняя стена (чтобы игрок не мог вернуться)
mc.setBlocks(x-CORRIDOR_WIDTH, y, z-1,
x+CORRIDOR_WIDTH, y+WALL_HEIGHT, z-1,
WALL_BLOCK)
# Стартовая точка
mc.setBlock(x, y, z, START_BLOCK)
# Первая стена
self.build_wall(z + WALL_DISTANCE)
def build_wall(self, wall_z):
"""Построение стены с вопросом"""
x, y, z = self.player_pos.x, self.player_pos.y, wall_z
# Строим стену
mc.setBlocks(x-5, y, z, x+5, y+WALL_HEIGHT, z, WALL_BLOCK)
# Железные ворота (закрытый проход)
self.gate_pos = (x, y, z)
mc.setBlock(x, y, z, GATE_BLOCK)
mc.setBlock(x, y+1, z, GATE_BLOCK)
# Блок вопроса по центру
mc.setBlock(x, y+1, z, QUESTION_BLOCK)
self.current_wall_pos = z
def ask_question(self):
"""Задать вопрос и проверить ответ"""
question_data = self.questions[self.current_level % len(self.questions)]
mc.postToChat(question_data["question"])
for answer in question_data["answers"]:
mc.postToChat(answer)
# Ждем ответа
start_time = time.time()
while time.time() - start_time < 30:
events = mc.events.pollChatPosts()
for event in events:
try:
answer = int(event.message)
if 1 <= answer <= 4:
if answer == question_data["correct"]:
praise = random.choice(question_data["praise"])
mc.postToChat(praise)
return True
else:
return False
except ValueError:
pass
time.sleep(0.1)
return False
def open_gate(self):
"""Открыть проход в стене"""
if self.gate_pos:
x, y, z = self.gate_pos
mc.setBlock(x, y, z, AIR_BLOCK)
mc.setBlock(x, y+1, z, AIR_BLOCK)
mc.postToChat("Проход открыт! Иди дальше!")
def check_player_progress(self):
"""Проверка прогресса игрока"""
pos = mc.player.getTilePos()
# Если игрок прошёл через стену
if self.current_wall_pos and pos.z > self.current_wall_pos:
self.current_level += 1
if self.current_level >= LEVELS:
# Финиш
mc.setBlock(pos.x, pos.y, pos.z + 5, FINISH_BLOCK)
mc.postToChat("Поздравляем! Ты прошел все уровни!")
time.sleep(5)
self.reset_game()
else:
# Строим следующую стену
self.build_wall(pos.z + WALL_DISTANCE)
mc.postToChat(f"Уровень {self.current_level}! Ответь на вопрос чтобы пройти дальше!")
def reset_game(self):
"""Сброс игры"""
self.current_level = 0
self.lives = LIVES
self.build_start_area()
mc.postToChat("Игра началась заново!")
def run(self):
"""Основной цикл игры"""
self.build_start_area()
self.explain_rules()
while True:
# Проверяем, ударил ли игрок блок вопроса
hits = mc.events.pollBlockHits()
for hit in hits:
hit_block = mc.getBlock(hit.pos.x, hit.pos.y, hit.pos.z)
if hit_block == QUESTION_BLOCK:
correct = self.ask_question()
if correct:
self.open_gate()
else:
self.lives -= 1
mc.postToChat(f"Неверно! Осталось {self.lives} жизней.")
if self.lives <= 0:
mc.postToChat("Игра окончена! Начинаем заново.")
time.sleep(3)
self.reset_game()
# Проверяем прогресс игрока
self.check_player_progress()
time.sleep(0.1)
# Запуск игры
if __name__ == "__main__":
game = LabyrinthGame()
game.run()