import pygame import prefs from classes.beerKeg import BeerKeg from classes.coffeMachine import CoffeMachine from classes.table import Table from pygame.locals import K_w, K_s, K_a, K_d, K_q, K_e, K_r, K_b,K_g from classes.cell import Cell from classes.agent import Agent from collections import deque import threading import time import random from classes.data.klient import Klient from classes.data.klient import Klient import xml.etree.ElementTree as ET from decisiontree import predict_client pygame.init() window = pygame.display.set_mode((prefs.WIDTH, prefs.HEIGHT)) pygame.display.set_caption("Game Window") table_coords = [(4, 4), (4, prefs.GRID_SIZE-5), (prefs.GRID_SIZE-5, 4), (prefs.GRID_SIZE-5, prefs.GRID_SIZE-5)] from classes.data.data_initializer import clients chosen_coords = random.choice(table_coords) chosen_index = random.randint(0, len(table_coords)-1) chosen_coords = table_coords[chosen_index] klientx_target = chosen_coords[0] + 1 klienty_target = chosen_coords[1] + 1 # klientx_target = 16 # klienty_target = 16 print("klientx_target:", klientx_target) print("klienty_target:", klienty_target) def initBoard(): wall_probability = 0.001 global cells cells = [] for i in range(prefs.GRID_SIZE): row = [] for j in range(prefs.GRID_SIZE): waga = random.choices([1, 4, 5], weights=[0.7, 0.1, 0.1], k=1)[0] cell = Cell(i, j, waga) if (i, j) not in table_coords: if waga == 5: cell.prepareTexture("sprites/plama.png") if waga == 4: cell.prepareTexture("sprites/dywan.png") if random.random() < wall_probability: cell.prepareTexture("sprites/wall.png") cell.blocking_movement = True row.append(cell) cells.append(row) for i in range(prefs.GRID_SIZE): for j in range(prefs.GRID_SIZE): if i == 0 or j==0 or j==prefs.GRID_SIZE-1 or (i == prefs.GRID_SIZE-1 and j != 17): cells[i][j].prepareTexture("sprites/wall.png") cells[i][j].blocking_movement = True cells[6][6].interactableItem = BeerKeg(cells[6][6], "Beer Keg") cells[4][10].interactableItem = CoffeMachine(cells[4][10], "Coffe Machine") cells[4][4].interactableItem = Table(cells[4][4], "Table") cells[4][prefs.GRID_SIZE-5].interactableItem = Table(cells[4][prefs.GRID_SIZE-5], "Table") cells[prefs.GRID_SIZE-5][4].interactableItem = Table(cells[prefs.GRID_SIZE-5][4], "Table") cells[prefs.GRID_SIZE-5][prefs.GRID_SIZE-5].interactableItem = Table(cells[prefs.GRID_SIZE-5][prefs.GRID_SIZE-5], "Table") # cells[9][9].waga = 2 # cells[9][8].waga = 10 # cells[8][8].waga = 10 # cells[prefs.SPAWN_POINT[0]+1][prefs.SPAWN_POINT[1]].waga = 100 # cells[prefs.SPAWN_POINT[0]][prefs.SPAWN_POINT[1]-1].waga = 100 # cells[9][7].waga = 2 # cells[10][6].waga = 2 # cells[7][7].waga = 2 def draw_grid(window, cells, agent): for i in range(prefs.GRID_SIZE): for j in range(prefs.GRID_SIZE): cells[i][j].update(window) if(cells[i][j].interactableItem): cells[i][j].interactableItem.update(window) if(not cells[i][j].blocking_movement): cells[i][j].blit_text(cells[i][j].waga, i*50+6, j*52+6, 12,window) font = pygame.font.SysFont('Comic Sans MS', 30) scoreText = font.render("Score: {}".format(str(round(agent.score,2))), 1, (0, 0, 0)) multiplierText = font.render("Multiplier: {}".format(str(round(agent.multiplier,2))), 1, (0, 0, 0)) window.blit(scoreText, (0, 0)) window.blit(multiplierText, (0, 50)) initBoard() agent = Agent(prefs.SPAWN_POINT[0], prefs.SPAWN_POINT[1], cells) klient = Klient(prefs.GRID_SIZE-1, 17,cells) target_x, target_y = klientx_target-1, klienty_target def watekDlaSciezkiAgenta(): time.sleep(3) while True: if len(path) > 0: element = path.pop(0) print(element) if element == "left": agent.rotate_left() if element == "right": agent.rotate_right() if element == "forward": agent.move_direction() elif isinstance(element, tuple): # Check if it's a tuple indicating movement coordinates x, y = element agent.moveto(x, y) time.sleep(1) def watekDlaSciezkiKlienta(): assigned = False time.sleep(3) while True: if len(path2) > 0: element2 = path2.pop(0) print(element2) if element2 == "left": klient.rotate_left() if element2 == "right": klient.rotate_right() if element2 == "forward": klient.move_direction() elif isinstance(element2, tuple): # Check if it's a tuple indicating movement coordinates x, y = element2 klient.moveto(x, y) if not assigned and klient.current_cell == cells[klientx_target][klienty_target]: klient.przyStoliku = True klient.stolik = klient.current_cell random_client_data = random.choice(clients) prediction = predict_client(random_client_data) print("\nClient data:") print(random_client_data) print("Prediction (Adult):", prediction) assigned = True if assigned: break time.sleep(1) path2 = klient.bfs2(klientx_target, klienty_target) print("Najkrótsza ścieżka:", path2) watek = threading.Thread(target=watekDlaSciezkiKlienta) watek.daemon = True watek.start() path = agent.bfs2(target_x, target_y) print("Najkrótsza ścieżka:", path) watek = threading.Thread(target=watekDlaSciezkiAgenta) watek.daemon = True watek.start() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() if keys[K_w] and not agent.moved: agent.move_up() if keys[K_s] and not agent.moved: agent.move_down() if keys[K_a] and not agent.moved: agent.move_left() if keys[K_d] and not agent.moved: agent.move_right() if not any([keys[K_w], keys[K_s], keys[K_a], keys[K_d]]): agent.moved = False if keys[K_q]: agent.rotate_left() if keys[K_e]: agent.rotate_right() if keys[K_r]: agent.move_direction() if keys[K_b]: path = agent.bfs2(target_x, target_y) print("Najkrótsza ścieżka:", path) watek = threading.Thread(target=watekDlaSciezkiAgenta) watek.daemon = True watek.start() if pygame.key.get_pressed()[pygame.K_e]: if agent.current_cell.interactableItem and pygame.time.get_ticks() - agent.last_interact_time > 500: agent.last_interact_time = pygame.time.get_ticks() agent.current_cell.interactableItem.interact(agent) window.fill((255, 0, 0)) draw_grid(window, cells, agent) agent.update(window) klient.update(window) pygame.display.update() time.sleep(0.1) pygame.quit()