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 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)] 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 # Wybierz kolor dla płytki na podstawie jej położenia row.append(cell) cells.append(row) # Test # Na potrzeby prezentacji tworzę sobie prostokątne ściany na które nie da się wejść # x1 = 3 # y1 = 6 # for i in range(x1, x1+4): # for j in range(y1, y1+2): # cells[i][j].prepareTexture("sprites/wall.png") # cells[i][j].blocking_movement = True 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) target_x, target_y = 18, 18 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) 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) pygame.display.update() time.sleep(0.1) pygame.quit()