
Код для авто сбора всех ресурсов в игре Main Основная функция Основная логика работы моего кода строится вокруг вычисления чисел Фибоначчи. Эти числа я использую как пороговые значения для проверки количества определённых предметов. В зависимости от условий и флагов (treasure_flag и polyculture_flag), выполняются автоматизированные функции для добычи, посадки, полива и других действий. Вычисление чисел Фибоначчи:Используется функция next_fibonacci_after, которая вычисляет следующее число Фибоначчи после текущего значения current_number.Это значение я использую как ориентир для проверки количества ресурсов.Проверки и запуск действий:Если treasure_flag включён, проверяется количество Items.Gold и, при необходимости, запускается функция поиска сокровищ. Для каждого ресурса я прописал отдельные условия. Например, если предметов Items.Bone меньше числа Фибоначчи, запускается функция их автоматического сбора.Работа с культурами:Флаг polyculture_flag определяет, выращивать ли сразу несколько культур. Если он включён, запускается соответствующая функция для работы с поликультурами. В остальных случаях я делаю проверки на количество конкретных предметов и запускаю функции для их автоматизированного производства. treasure_flag = True polyculture_flag = False current_number = 1 while True: next_number = next_fibonacci_after(current_number) if treasure_flag: if num_items(Items.Gold) < next_number: maze_avto_start(next_number) if num_items(Items.Bone) < next_number: bone_avto_start(next_number) if num_items(Items.Cactus) < next_number and num_items(Items.Pumpkin) > 20: cactus_avto_start(next_number) if num_items(Items.Pumpkin) < next_number and num_items(Items.Carrot) > 20: pumpkin_avto_start(next_number) if polyculture_flag: if num_items(Items.Hay) < next_number and num_items(Items.Wood) < next_number and num_items(Items.Carrot) < next_number: polyculture_avto_start(next_number) else: if num_items(Items.Carrot) < next_number and num_items(Items.Hay) > 20 and num_items(Items.Wood) > 20: carrot_avto_start(next_number) if num_items(Items.Wood) < next_number: tree_avto_start(next_number) if num_items(Items.Hay) < next_number: hay_avto_start(next_number) current_number = next_number Util Вспомогательные функции Для удобства я создал функции, которые выполняют вспомогательные задачи: initial_till Подготавливает землю для посадки, проходя через всё игровое поле. fill_water Заполняет запасы воды, если они заканчиваются. goTo Позволяет персонажу перемещаться к указанным координатам. next_fibonacci_after Получение числа Фибоначчи. def initial_till(): for i in range(get_world_size()): for i in range(get_world_size()): till() move(North) move(East) def fill_water(): while True: if get_water() == 1 or num_items(Items.Water) == 0: break if num_items(Items.Water) > 0: use_item(Items.Water) def goTo(xCoord, yCoord): if get_pos_x() > xCoord: goRight = xCoord + get_world_size() - get_pos_x() else: goRight = xCoord - get_pos_x() if get_pos_x() > xCoord: goLeft = get_pos_x() - xCoord else: goLeft = get_pos_x() + get_world_size() - xCoord if get_pos_y() > yCoord: goUp = yCoord + get_world_size() - get_pos_y() else: goUp = yCoord - get_pos_y() if get_pos_y() > yCoord: goDown = get_pos_y() - yCoord else: goDown = get_pos_y() + get_world_size() - yCoord if goLeft < goRight: for a in range(goLeft): move(West) else: for b in range(goRight): move(East) if goDown < goUp: for c in range(goDown): move(South) else: for d in range(goUp): move(North) def next_fibonacci_after(n): a, b = 0, 1 while a <= n: a, b = b, a + b return a Grass Трава hay_avto_start Очищает поле. Выполняет автоматический сбор сена до достижения указанного количества. def hay_avto_start(num): clear() while True: if num_items(Items.Hay) > num: break fill_water() if get_entity_type() == Entities.Grass: if can_harvest(): harvest() pass else: pass Tree Деревья tree_avto_start Подготавливает почву, высаживает деревья, поливает их и собирает древесину. def tree_avto_start(num): clear() initial_till() while True: if num_items(Items.Wood) > num: break for i in range(get_world_size()): for j in range(get_world_size()): fill_water() if get_entity_type() == Entities.Tree: if can_harvest(): harvest() plant(Entities.Tree) else: plant(Entities.Tree) move(North) move(East) Carrot Морковь carrot_avto_start Собирает морковь, пока её количество не достигнет порогового значения. Учитывает наличие сена и древесины для продолжения работы. def carrot_avto_start(num): clear() initial_till() while True: if num_items(Items.Carrot) > num or num_items(Items.Hay) < 20 or num_items(Items.Wood) < 20: break for i in range(get_world_size()): for j in range(get_world_size()): fill_water() if get_entity_type() == Entities.Carrot: if can_harvest(): harvest() plant(Entities.Carrot) else: plant(Entities.Carrot) move(North) move(East) Pumpkin Тыква pumpkin_avto_start Использует дополнительную логику для проверки готовых клеток и автоматического сбора урожая. def find_and_plant_unready(ready_cells): for i in range(get_world_size()): for j in range(get_world_size()): if (i, j) in ready_cells: continue goTo(i, j) if get_entity_type() == Entities.Pumpkin and can_harvest(): ready_cells.add((i, j)) elif get_entity_type() != Entities.Pumpkin: plant(Entities.Pumpkin) fill_water() if len(ready_cells) == get_world_size()**2: return True return False def pumpkin_avto_start(num): clear() initial_till() while True: if num_items(Items.Pumpkin) > num or num_items(Items.Carrot) < 20: break ready_cells = set() all_ready = False while not all_ready: all_ready = find_and_plant_unready(ready_cells) goTo(0, 0) harvest() Cactus Кактус cactus_avto_start Включает сортировку измерений для оптимизации сбора и выращивания кактусов. def cactus_avto_start(num): clear() cache = {} initial_till() while True: if num_items(Items.Cactus) > num or num_items(Items.Pumpkin) < 20: break tradeIfLower(Items.Cactus, get_world_size()**2) for i in range(get_world_size()): for j in range(get_world_size()): plant(Entities.Cactus) cache[(i,j)] = measure() fill_water() move(North) move(East) #sort columns for h in range(get_world_size()): count = 0 for i in range(get_world_size() - 1): sorted = True for s in range(get_world_size() - 1): if cache[h,s] > cache[h,s + 1]: sorted = False break if sorted == True: break for j in range(get_world_size() - count - 1): if cache[h,j + 1] < cache[h,j]: swap(North) cache[(h,j)] = measure() cache[(h,j + 1)] = measure(North) move(North) goTo(h,0) count += 1 move(East) #sort rows for h in range(get_world_size()): count = 0 for i in range(get_world_size() - 1): sorted = True for s in range(get_world_size() - 1): if cache[s,h] > cache[s + 1,h]: sorted = False break if sorted == True: break for j in range(get_world_size() - count - 1): if cache[j + 1,h] < cache[j,h]: swap(East) cache[(j,h)] = measure() cache[(j + 1,h)] = measure(East) move(East) goTo(0,h) count += 1 move(North) harvest() Bone Кости bone_cycle Использует шляпу динозавра для сбора костей. Весь код запускается отдельным файлом. Код просто водит дрона по всему полю. Да, не оптимально, однако это наилегкайший способ собирать максимум костей за раз def calculate_pair_steps(world_size): return (world_size - 6) // 2 + 2 def try_move(direction): return move(direction) def go_to_origin(): while get_pos_x() != 0: try_move(West) # Move vertically toward Y=0 while get_pos_y() != 0: try_move(South) def return_and_reset(): change_hat(Hats.Straw_Hat) go_to_origin() change_hat(Hats.Dinosaur_Hat) perform_dino_pattern() def repeat_move(direction, steps): for _ in range(steps): if not try_move(direction): # If a move fails, reset and indicate failure to the caller return_and_reset() return False return True def perform_dino_pattern(): world_size = get_world_size() max_index = world_size - 1 pair_steps = calculate_pair_steps(world_size) while True: # Climb to the top edge (Y = max_index) if not repeat_move(North, max_index): return # Run to the right edge (X = max_index) if not repeat_move(East, max_index): return # Drop one row to start the sweep pairs if not repeat_move(South, 1): return # Perform pair_steps times: sweep left, step down, sweep right, step down for _ in range(pair_steps): # Sweep left across most of the row if not repeat_move(West, max_index - 1): return # Move down a single row if not repeat_move(South, 1): return # Sweep right across most of the next row if not repeat_move(East, max_index - 1): return # Move down a single row to continue the pattern if not repeat_move(South, 1): return # After the pairs, move back to the leftmost edge to finish the loop if not repeat_move(West, max_index): return def bone_cycle(): world_size = get_world_size() # If the world size is odd, reduce it by 1 to make it even if world_size % 2 == 1: set_world_size(world_size - 1) world_size -= 1 # Visual preparation and positioning change_hat(Hats.Straw_Hat) go_to_origin() change_hat(Hats.Dinosaur_Hat) # Run the pattern repeatedly until the environment prevents movement while True: perform_dino_pattern() harvest() change_hat(Hats.Straw_Hat) bone_cycle() Maze Лабиринт maze_avto_start Создаёт лабиринт и ищет сокровища, собирая золото. def create_maze(): clear() plant(Entities.Bush) while True: if num_items(Items.Weird_Substance) > get_world_size()**2: use_item(Items.Weird_Substance, get_world_size()**2) return 1 else: for i in range(get_world_size()): for j in range(get_world_size()): plant(Entities.Bush) use_item(Items.Fertilizer) move(North) move(East) for i in range(get_world_size()): for j in range(get_world_size()): harvest() move(North) move(East) return 0 return 1 def treasure_hunt(): dir = West x = get_pos_x() y = get_pos_y() while True: move(dir) x2 = get_pos_x() y2 = get_pos_y() if x==x2 and y==y2: if dir==West: dir = North elif dir==North: dir = East elif dir==East: dir = South elif dir==South: dir = West else: x = get_pos_x() y = get_pos_y() if dir==West: dir = South elif dir==North: dir = West elif dir==East: dir = North elif dir==South: dir = East if get_entity_type()==Entities.Treasure: harvest() return 1 def maze_avto_start(num): while True: if num_items(Items.Gold) > num: break if create_maze(): if treasure_hunt(): continue Polyculture Поликультуры polyculture_avto_start Автоматически управляет посадкой нескольких культур одновременно. def polyculture_avto_start(num): clear() entity_list = [Entities.Tree, Entities.Carrot] while True: if num_items(Items.Hay) > num and num_items(Items.Wood) < num and num_items(Items.Carrot) < num: break plant_companion, (x, y) = get_companion() goTo(x, y) if can_harvest(): harvest() if plant_companion in entity_list: if get_ground_type() == Grounds.Grassland: till() plant(plant_companion) else: if get_ground_type() == Grounds.Soil: till() plant(plant_companion) fill_water() Заключение

Я не программист. Код был написан для автоматизации сбора ресурсов в игре, при покупке всех улучшений в игре хотя бы на 1. Да, не каждая функция настроена так, чтобы выполнять свою задачу максимально эффективно, но тут уже как получилось. По большей части код писал сам, что не понимал - искал решения в интернете. Можно добавить авто покупку улучшений, что бы полностью автоматизировать игру, но я уже решил с этим не заморачиваться. Спасибо что уделили время. spawn_drone Дальше будут скрипты исключительно для многопоточности. Писал человек с опытом в программировании, но питон впервые в глаза увидел, поэтому как получилось Идея команды spawn_drone довольно проста, если вы знакомы с многопоточностью в программировании. Есть основной поток и пул потоков. При вызове spawn_drone нужно передать команду которую другой дрон(поток) должен выполнить и при нужде вернуть результат через команду wait_for. Те spawn_drone это как команда подчиненному - сказал что сделать, он сделает. И ждать его не обязательно Код тестировался и писался исключительно при 32-х дронах, поэтому не уверен что будет при меньшем их количестве. Utils + Main file 3 файла на 3 отдельные команды def go_to(x, y): pos_x = get_pos_x() if pos_x > x: if get_world_size() - pos_x + x > pos_x - x: while get_pos_x() != x: move(West) else: while get_pos_x() != x: move(East) elif pos_x < x: if get_world_size() - x + pos_x > x - pos_x: while get_pos_x() != x: move(East) else: while get_pos_x() != x: move(West) pos_y = get_pos_y() if pos_y > y: if get_world_size() - pos_y + y > pos_y - y: while get_pos_y() != y: move(South) else: while get_pos_y() != y: move(North) elif pos_y < y: if get_world_size() - y + pos_y > y - pos_y: while get_pos_y() != y: move(North) else: while get_pos_y() != y: move(South) def execute_by_row(func): drones = [] for i in range(get_world_size()): spawnded_drone = spawn_drone(func) if not spawnded_drone: func() else: drones.append(spawnded_drone) move(North) for drone in drones: wait_for(drone) import go_to import execute_by_row def change_ground(ground_type): go_to.go_to(0, 0) def task(): for j in range(get_world_size()): if can_harvest(): harvest() if get_ground_type() != ground_type: till() move(East) execute_by_row.execute_by_row(task) def change_ground_if_needed(ground_type): if ground_type != None and get_ground_type() != ground_type: change_ground(ground_type) И также файл main который и отвечает за запуск всех остальных циклов. Обратите внимание что есть коллекция которая содержит в себе вызов цикла и количество раз которое нужно запустить этот вызов import go_to import execute_by_row import change_ground import grass_cycle import grass_and_tree_cycle import carrot_cycle import pumpkin_cycle import sunflower_cycle import solve_labyrinth import cactus_cycle harvest() change_hat(Hats.Straw_Hat) go_to.go_to(0, 0) cycle_order = [ (grass_and_tree_cycle.grass_and_tree_cycle, Grounds.Grassland, 1), (sunflower_cycle.sunflower_cycle, Grounds.Soil, 1), (carrot_cycle.carrot_cycle, Grounds.Soil, 1), (pumpkin_cycle.pumpkin_cycle, Grounds.Soil, 1), (cactus_cycle.cactus_cycle, Grounds.Soil, 1), (solve_labyrinth.solve_labyrinth, None, 1) ] while True: for cycle in cycle_order: change_ground.change_ground_if_needed(cycle[1]) for i in range(cycle[2]): cycle[0]() if can_harvest(): def task(): for j in range(get_world_size()): harvest() move(East) execute_by_row.execute_by_row(task) Grass cycle Довольно примитивный код исключительно для фарма травы import go_to import execute_by_row def grass_cycle(): go_to.go_to(0, 0) def task(): for j in range(get_world_size()): harvest() move(East) execute_by_row.execute_by_row(task) Grass and tree cycle Скрипт похож на предыдущий. Тут же мы используем Fertilizer, Water и Weird_Substance. Одно для фарма субстанции для лабиринта, вода же используется из-за того что иногда не хватает деревьям скорости роста (возможно это не так, но лучше пусть будет) import go_to def grass_and_tree_cycle(): go_to.go_to(0, 0) drones = [] for i in range(get_world_size()): def task(): for j in range(get_world_size()): harvest() if (i % 2 == 0 and j % 2 == 0) or (i % 2 == 1 and j % 2 == 1): plant(Entities.Tree) if get_water() < 0.75: use_item(Items.Water) if random() > random(): use_item(Items.Fertilizer) use_item(Items.Weird_Substance) move(East) spawnded_drone = spawn_drone(task) if not spawnded_drone: task() else: drones.append(spawnded_drone) move(North) for drone in drones: wait_for(drone) Carrot cycle Еще один довольно простой цикл import go_to import execute_by_row def carrot_cycle(): go_to.go_to(0, 0) def task(): for j in range(get_world_size()): harvest() plant(Entities.Carrot) if get_water() < 0.75: use_item(Items.Water) move(East) execute_by_row.execute_by_row(task) Pumpkin cycle Этот скрипт выглядит страшно, но работает довольно просто Для начала мы создаем коллекцию которая содержит каждую клетку нашей строки в которой находится дрон. Таким образом мы каждому дрону даем отдельную строку в которой он работает Далее начинается вечный цикл пока наша коллекция содержит хотя бы один елемент мы делаем следующее. Идем по списку и проверяем растение. Если оно выросло, то не трогаем и убираем поле из списка Если нет, садим тыкву и поливаем при нужде Таким образом мы убеждаемся что каждая тыква выросла перед тем как собрать полное поле тыкв import go_to import execute_by_row def pumpkin_cycle(): go_to.go_to(0, 0) drones = [] for i in range(get_world_size()): def task(): go_to.go_to(i, 0) list_to_plant = [] for j in range(get_world_size()): list_to_plant.append((i, j)) while len(list_to_plant) != 0: temp_list = list_to_plant[:] for item in list_to_plant: go_to.go_to(item[0], item[1]) if can_harvest(): temp_list.remove(item) continue plant(Entities.Pumpkin) if get_water() < 0.75: use_item(Items.Water) list_to_plant = temp_list spawnded_drone = spawn_drone(task) if not spawnded_drone: task() else: drones.append(spawnded_drone) move(East) for drone in drones: wait_for(drone) harvest() Sunflower cycle Еще один цикл который выглядит страшно, но по сути довольно прост для понимания. Высаживаем поле подсолнухов. Дальше нам нужно их собрать в обратном порядке по размеру цветка, поэтому сортируем через алгоритм Хоара (quick sort) и после посылаем дрона собрать нужный цветок для каждого элемента цикла import go_to def sunflower_cycle(): go_to.go_to(0, 0) drones = [] list_with_power = [] for i in range(get_world_size()): def plant_sunflowers(): list = [] for j in range(get_world_size()): if can_harvest(): harvest() plant(Entities.Sunflower) list.append((i, j, measure())) move(East) return list spawnded_drone = spawn_drone(plant_sunflowers) if not spawnded_drone: list_with_power = list_with_power + plant_sunflowers() else: drones.append(spawnded_drone) move(North) for drone in drones: list_with_power = list_with_power + wait_for(drone) list_with_power = quicksort(list_with_power) for el in list_with_power: def harvest_sunflower(): go_to.go_to(el[1], el[0]) harvest() while not spawn_drone(harvest_sunflower): do_a_flip() def quicksort(arr): # Base case: lists with 0 or 1 element are already sorted if len(arr) <= 1: return arr # Choose pivot (middle element) pivot = arr[len(arr) // 2] pivot_val = pivot[2] # Partition into three lists left = [] middle = [] right = [] for item in arr: item_val = item[2] if item_val > pivot_val: left.append(item) elif item_val == pivot_val: middle.append(item) else: right.append(item) # Recursively sort and combine return quicksort(left) + middle + quicksort(right) Cactus cycle В целом алгоритм похож на предыдущий алгоритм с кактусами. Единственная разница в том что вместо Bubble sort используется Shaker sort, тк мы не можем позволить себе движение просто так. И непросредственно многопоточность так же присутствует import go_to def cactus_cycle(): go_to.go_to(0, 0) drones = [] for i in range(get_world_size()): def planth_cactuses(): for j in range(get_world_size()): plant(Entities.Cactus) move(East) spawnded_drone = spawn_drone(planth_cactuses) if not spawnded_drone: planth_cactuses() else: drones.append(spawnded_drone) move(North) for drone in drones: wait_for(drone) #sort columns drones = [] for column in range(get_world_size()): def sort_column(): start = 0 end = get_world_size() - 1 swapped = True go_to.go_to(column, 0) while swapped == True: swapped = False for j in range(start, end): if measure(North) > measure(): swap(North) swapped = True if j != end - 1: move(North) if swapped == False: break swapped = False end = end - 1 for j in range(end, start, -1): if measure(South) < measure(): swap(South) swapped = True if j != start + 1: move(South) start = start + 1 spawnded_drone = spawn_drone(sort_column) if not spawnded_drone: sort_column() else: drones.append(spawnded_drone) move(East) for drone in drones: wait_for(drone) #sort rows drones = [] for row in range(get_world_size()): def sort_column(): start = 0 end = get_world_size() - 1 swapped = True go_to.go_to(0, row) while swapped == True: swapped = False for j in range(start, end): if measure(East) > measure(): swap(East) swapped = True if j != end - 1: move(East) if swapped == False: break swapped = False end = end - 1 for j in range(end, start, -1): if measure() < measure(West): swap(West) swapped = True if j != start + 1: move(West) start = start + 1 spawnded_drone = spawn_drone(sort_column) if not spawnded_drone: sort_column() else: drones.append(spawnded_drone) move(North) for drone in drones: wait_for(drone) harvest()
2026-02-19 16:00:05 发布在
编程农场
说点好听的...
收藏
0
0
