146 lines
3.6 KiB
Python
146 lines
3.6 KiB
Python
|
|
import os
|
|||
|
|
from builders import TextFileMazeBuilder
|
|||
|
|
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
|
|||
|
|
from solver import MazeSolver
|
|||
|
|
from observers import ConsoleView
|
|||
|
|
from commands import Player
|
|||
|
|
from experiments import run_all_experiments, save_results_to_csv, print_results_table
|
|||
|
|
|
|||
|
|
|
|||
|
|
def create_test_mazes():
|
|||
|
|
os.makedirs("mazes", exist_ok=True)
|
|||
|
|
|
|||
|
|
small = """##########
|
|||
|
|
#S #
|
|||
|
|
# ### ## #
|
|||
|
|
# # #
|
|||
|
|
### # ####
|
|||
|
|
# # #
|
|||
|
|
# ### # #
|
|||
|
|
# # #
|
|||
|
|
# # E#
|
|||
|
|
##########"""
|
|||
|
|
|
|||
|
|
medium = """####################
|
|||
|
|
#S #
|
|||
|
|
# # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # #
|
|||
|
|
# E#
|
|||
|
|
####################"""
|
|||
|
|
|
|||
|
|
large = """##############################
|
|||
|
|
#S #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# #
|
|||
|
|
# # # # # # # # # # # # # # #
|
|||
|
|
# E#
|
|||
|
|
##############################"""
|
|||
|
|
|
|||
|
|
empty = "S" + " " * 28 + "E"
|
|||
|
|
|
|||
|
|
no_exit = """#######
|
|||
|
|
#S #
|
|||
|
|
# ### #
|
|||
|
|
# # #
|
|||
|
|
#######"""
|
|||
|
|
|
|||
|
|
with open("mazes/small.txt", "w") as f:
|
|||
|
|
f.write(small)
|
|||
|
|
with open("mazes/medium.txt", "w") as f:
|
|||
|
|
f.write(medium)
|
|||
|
|
with open("mazes/large.txt", "w") as f:
|
|||
|
|
f.write(large)
|
|||
|
|
with open("mazes/empty.txt", "w") as f:
|
|||
|
|
f.write(empty)
|
|||
|
|
with open("mazes/no_exit.txt", "w") as f:
|
|||
|
|
f.write(no_exit)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
def demo_maze_solver():
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("ДЕМОНСТРАЦИЯ РАБОТЫ MAZE SOLVER")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
view = ConsoleView()
|
|||
|
|
|
|||
|
|
maze = builder.build_from_file("mazes/small.txt")
|
|||
|
|
view.update("maze_loaded", {"maze": maze})
|
|||
|
|
|
|||
|
|
strategies = [
|
|||
|
|
("BFS", BFSStrategy(), "BFS"),
|
|||
|
|
("DFS", DFSStrategy(), "DFSs"),
|
|||
|
|
("A*", AStarStrategy(), "A*")
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
for name, strategy, description in strategies:
|
|||
|
|
solver = MazeSolver(maze, strategy)
|
|||
|
|
view.update("search_start", {"algorithm": description})
|
|||
|
|
|
|||
|
|
path, stats = solver.solve()
|
|||
|
|
|
|||
|
|
if stats.path_found:
|
|||
|
|
view.update("path_found", {"maze": maze, "path": path, "stats": stats})
|
|||
|
|
else:
|
|||
|
|
view.update("no_path", {"stats": stats})
|
|||
|
|
|
|||
|
|
|
|||
|
|
def demo_player_controls():
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("Command + Observer")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
builder = TextFileMazeBuilder()
|
|||
|
|
view = ConsoleView()
|
|||
|
|
maze = builder.build_from_file("mazes/small.txt")
|
|||
|
|
|
|||
|
|
player = Player(maze.start)
|
|||
|
|
|
|||
|
|
view.update("maze_loaded", {"maze": maze})
|
|||
|
|
view.render(maze, player_position=player.current_cell)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def run_experiments():
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("ЭКСПЕРИМЕНТАЛЬНОЕ СРАВНЕНИЕ АЛГОРИТМОВ")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
maze_files = [
|
|||
|
|
"mazes/small.txt",
|
|||
|
|
"mazes/medium.txt",
|
|||
|
|
"mazes/large.txt",
|
|||
|
|
"mazes/empty.txt",
|
|||
|
|
"mazes/no_exit.txt"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
results = run_all_experiments(maze_files, repeats=5)
|
|||
|
|
save_results_to_csv(results)
|
|||
|
|
print_results_table(results)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
print("Объектно-ориентированная реализация с паттернами")
|
|||
|
|
print("Паттерны: Builder, Strategy, Observer, Command")
|
|||
|
|
|
|||
|
|
create_test_mazes()
|
|||
|
|
demo_maze_solver()
|
|||
|
|
demo_player_controls()
|
|||
|
|
run_experiments()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|