This commit is contained in:
s464923 2024-06-10 09:09:19 +02:00
parent dd721993cd
commit 243e5f0656

View File

@ -3,18 +3,16 @@ import numpy as np
import pygame import pygame
# Wymiary planszy # Wymiary planszy
rows, cols = 10, 10 # Ustalona liczba wierszy i kolumn rows, cols = 10, 10
size = 64 # Rozmiar pojedynczego pola na planszy size = 64
# Klasa reprezentująca planszę # Klasa reprezentująca planszę
class Board: class Board:
def __init__(self): def __init__(self):
self.board = [] # Tablica reprezentująca planszę self.board = []
self.vegetables = [] # Tablica przechowująca warzywa na planszy self.vegetables = []
self.soil_features = None # Cechy gleby (wilgotność, temperatura itp.) self.vegetable_names = []
self.vegetable_names = [] # Tablica przechowująca nazwy warzyw na planszy self.load_images()
self.load_images() # Ładowanie obrazów warzyw i innych elementów planszy self.generate_board()
self.generate_board() # Generowanie początkowej planszy
# Metoda do ładowania obrazów # Metoda do ładowania obrazów
def load_images(self): def load_images(self):
@ -84,19 +82,9 @@ class Board:
self.vegetables[row][col] = vegetable_image self.vegetables[row][col] = vegetable_image
self.vegetable_names[row][col] = vegetable_type self.vegetable_names[row][col] = vegetable_type
self.soil_features = self.generate_soil_features() # Generowanie cech gleby
# Metoda do generowania cech gleby # Metoda do generowania cech gleby
def generate_soil_features(self):
return {
"wilgotnosc_gleby": random.randint(30, 70),
"temperatura_gleby": random.randint(13, 26),
"opady_deszczu": random.randint(0, 11),
"wiek_rosliny": random.randint(1, 9),
"proc_ekspo_na_swiatlo": random.randint(10, 90),
"pora_dnia": random.randint(8, 20),
"pora_roku": random.randint(1, 4)
}
# Metoda oceniająca jakość planszy # Metoda oceniająca jakość planszy
def evaluate(self): def evaluate(self):
@ -146,7 +134,6 @@ class Board:
new_board.board = [row[:] for row in self.board] new_board.board = [row[:] for row in self.board]
new_board.vegetables = [row[:] for row in self.vegetables] new_board.vegetables = [row[:] for row in self.vegetables]
new_board.vegetable_names = [row[:] for row in self.vegetable_names] new_board.vegetable_names = [row[:] for row in self.vegetable_names]
new_board.soil_features = self.soil_features.copy()
return new_board return new_board
# Sprawdza, czy dane pole zawiera warzywo # Sprawdza, czy dane pole zawiera warzywo
@ -218,15 +205,15 @@ def save_board_as_image(board, filename):
board.draw_cubes(surface) board.draw_cubes(surface)
pygame.image.save(surface, filename) pygame.image.save(surface, filename)
# Parametry algorytmu
pop_size = 50 # Rozmiar populacji pop_size = 50
generations = 300 # Liczba generacji generations = 300
mutation_rate = 0.03 # Wskaźnik mutacji mutation_rate = 0.03
# Inicjalizacja Pygame # Inicjalizacja Pygame
pygame.init() pygame.init()
win = pygame.display.set_mode((cols * size, rows * size)) # Ustawienie rozmiaru okna win = pygame.display.set_mode((cols * size, rows * size))
pygame.display.set_caption('Generated Board') # Ustawienie tytułu okna pygame.display.set_caption('Generated Board')
# Generowanie najlepszej planszy # Generowanie najlepszej planszy
best_board = genetic_algorithm(pop_size, generations, mutation_rate) best_board = genetic_algorithm(pop_size, generations, mutation_rate)
@ -237,21 +224,21 @@ pygame.display.update()
# Zapisywanie planszy do pliku # Zapisywanie planszy do pliku
np.save('generated_board.npy', best_board.board) np.save('generated_board.npy', best_board.board)
save_board_as_image(best_board, 'generated_board.png') # Zapisz planszę jako obraz PNG save_board_as_image(best_board, 'generated_board.png')
# Utrzymanie okna otwartego do zamknięcia przez użytkownika # Utrzymanie okna otwartego do zamknięcia przez użytkownika
run = True run = True
needs_redraw = True # Flaga informująca, czy trzeba przerysować planszę needs_redraw = True
while run: while run:
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
run = False run = False
elif event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.KEYDOWN: elif event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.KEYDOWN:
needs_redraw = True # Przerysowanie planszy w przypadku kliknięcia myszą lub naciśnięcia klawisza needs_redraw = True
if needs_redraw: if needs_redraw:
best_board.draw_cubes(win) best_board.draw_cubes(win)
pygame.display.flip() pygame.display.flip()
needs_redraw = False # Wyłącz przerysowywanie do momentu kolejnego zdarzenia needs_redraw = False
pygame.quit() pygame.quit()