commit 8966fd0e158cd6f605cc7bea42b4d783fe108e2e Author: Konrad Chojnacki Date: Thu Apr 18 13:33:38 2024 +0200 'wozek' diff --git a/ai-wozek/.idea/.gitignore b/ai-wozek/.idea/.gitignore new file mode 100644 index 0000000..eaf91e2 --- /dev/null +++ b/ai-wozek/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/ai-wozek/.idea/inspectionProfiles/profiles_settings.xml b/ai-wozek/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/ai-wozek/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/ai-wozek/.idea/modules.xml b/ai-wozek/.idea/modules.xml new file mode 100644 index 0000000..d1ea2d8 --- /dev/null +++ b/ai-wozek/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ai-wozek/.idea/runConfigurations/wozek.xml b/ai-wozek/.idea/runConfigurations/wozek.xml new file mode 100644 index 0000000..d4f7152 --- /dev/null +++ b/ai-wozek/.idea/runConfigurations/wozek.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/ai-wozek/.idea/wozek.iml b/ai-wozek/.idea/wozek.iml new file mode 100644 index 0000000..fd26e8d --- /dev/null +++ b/ai-wozek/.idea/wozek.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ai-wozek/README.md b/ai-wozek/README.md new file mode 100644 index 0000000..e69de29 diff --git a/ai-wozek/car_parts.png b/ai-wozek/car_parts.png new file mode 100644 index 0000000..4d0bc1e Binary files /dev/null and b/ai-wozek/car_parts.png differ diff --git a/ai-wozek/car_parts.png_Zone.Identifier b/ai-wozek/car_parts.png_Zone.Identifier new file mode 100644 index 0000000..06205ea --- /dev/null +++ b/ai-wozek/car_parts.png_Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://cloudconvert.com/ +HostUrl=https://eu-central.storage.cloudconvert.com/tasks/89fd002d-da8d-428b-8ab9-f34e46a152d2/car_parts.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=cloudconvert-production%2F20240313%2Ffra%2Fs3%2Faws4_request&X-Amz-Date=20240313T125446Z&X-Amz-Expires=86400&X-Amz-Signature=5a6c7c1a4a9ace4b9847c1333519558594ff9acf8eef806f38e598003f86ffca&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22car_parts.png%22&response-content-type=image%2Fpng&x-id=GetObject diff --git a/ai-wozek/clothes.png b/ai-wozek/clothes.png new file mode 100644 index 0000000..4470dec Binary files /dev/null and b/ai-wozek/clothes.png differ diff --git a/ai-wozek/clothes.png_Zone.Identifier b/ai-wozek/clothes.png_Zone.Identifier new file mode 100644 index 0000000..7ab04df --- /dev/null +++ b/ai-wozek/clothes.png_Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://cloudconvert.com/ +HostUrl=https://eu-central.storage.cloudconvert.com/tasks/bed19f02-21bb-4af5-9a42-7cc3365f2bf4/clothes.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=cloudconvert-production%2F20240313%2Ffra%2Fs3%2Faws4_request&X-Amz-Date=20240313T125445Z&X-Amz-Expires=86400&X-Amz-Signature=f4586482e9493741e4b8acf756f10e3f879fc503bf0f4d05c1d4131aee65006a&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22clothes.png%22&response-content-type=image%2Fpng&x-id=GetObject diff --git a/ai-wozek/forklift.png b/ai-wozek/forklift.png new file mode 100644 index 0000000..2502962 Binary files /dev/null and b/ai-wozek/forklift.png differ diff --git a/ai-wozek/forklift.png_Zone.Identifier b/ai-wozek/forklift.png_Zone.Identifier new file mode 100644 index 0000000..d202ca1 --- /dev/null +++ b/ai-wozek/forklift.png_Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://cloudconvert.com/ +HostUrl=https://eu-central.storage.cloudconvert.com/tasks/72d14743-46c1-4131-ad52-b8c020251781/DALL%C2%B7E%202024-03-13%2013.49.29%20-%20A%20cute%2C%20cartoonish%20forklift%20in%20a%20simple%2C%20colorful%20style%2C%20isolated%20on%20a%20white%20background%2C%20suitable%20for%20a%2032x32%20pixels%20square%20format.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=cloudconvert-production%2F20240313%2Ffra%2Fs3%2Faws4_request&X-Amz-Date=20240313T125232Z&X-Amz-Expires=86400&X-Amz-Signature=47f29abd7d2833b597df60a061ece32135317b2715f4a5a5bd731d101328378a&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22DALL%C2%B7E%202024-03-13%2013.49.29%20-%20A%20cute%2C%20cartoonish%20forklift%20in%20a%20simple%2C%20colorful%20style%2C%20isolated%20on%20a%20white%20background%2C%20suitable%20for%20a%2032x32%20pixels%20square%20format.png%22&response-content-type=image%2Fpng&x-id=GetObject diff --git a/ai-wozek/forkliftE.png b/ai-wozek/forkliftE.png new file mode 100644 index 0000000..fcc95b6 Binary files /dev/null and b/ai-wozek/forkliftE.png differ diff --git a/ai-wozek/forkliftN.png b/ai-wozek/forkliftN.png new file mode 100644 index 0000000..542cc93 Binary files /dev/null and b/ai-wozek/forkliftN.png differ diff --git a/ai-wozek/forkliftS.png b/ai-wozek/forkliftS.png new file mode 100644 index 0000000..10b55ec Binary files /dev/null and b/ai-wozek/forkliftS.png differ diff --git a/ai-wozek/forkliftW.png b/ai-wozek/forkliftW.png new file mode 100644 index 0000000..5c9938e Binary files /dev/null and b/ai-wozek/forkliftW.png differ diff --git a/ai-wozek/fruit.png b/ai-wozek/fruit.png new file mode 100644 index 0000000..66a075f Binary files /dev/null and b/ai-wozek/fruit.png differ diff --git a/ai-wozek/fruit.png_Zone.Identifier b/ai-wozek/fruit.png_Zone.Identifier new file mode 100644 index 0000000..31de4cb --- /dev/null +++ b/ai-wozek/fruit.png_Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://cloudconvert.com/ +HostUrl=https://eu-central.storage.cloudconvert.com/tasks/bb36c777-c2d4-47c2-988b-532a79573e35/fruit.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=cloudconvert-production%2F20240313%2Ffra%2Fs3%2Faws4_request&X-Amz-Date=20240313T125445Z&X-Amz-Expires=86400&X-Amz-Signature=f19271408b0122b54201104cb6b223d8421964134753883343dec7c677f11f37&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22fruit.png%22&response-content-type=image%2Fpng&x-id=GetObject diff --git a/ai-wozek/nuclear_waste.png b/ai-wozek/nuclear_waste.png new file mode 100644 index 0000000..826348d Binary files /dev/null and b/ai-wozek/nuclear_waste.png differ diff --git a/ai-wozek/nuclear_waste.png_Zone.Identifier b/ai-wozek/nuclear_waste.png_Zone.Identifier new file mode 100644 index 0000000..f224628 --- /dev/null +++ b/ai-wozek/nuclear_waste.png_Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://cloudconvert.com/ +HostUrl=https://eu-central.storage.cloudconvert.com/tasks/7b680dc5-6ff4-4d66-a9fd-ee8b636e3bf1/nuclear_waste.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=cloudconvert-production%2F20240313%2Ffra%2Fs3%2Faws4_request&X-Amz-Date=20240313T125444Z&X-Amz-Expires=86400&X-Amz-Signature=09442679e02fcce160ea1f20fd133696d8b766e1e728a06c853e03fe9b951e05&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D%22nuclear_waste.png%22&response-content-type=image%2Fpng&x-id=GetObject diff --git a/ai-wozek/wozek.py b/ai-wozek/wozek.py new file mode 100644 index 0000000..b8cde9a --- /dev/null +++ b/ai-wozek/wozek.py @@ -0,0 +1,337 @@ +import pygame +import sys +import random +import os +import time + +class Node(): + def __init__(self,position,rotation,action,parent): + self.position=position + self.rotation=rotation + self.action=action + self.parent=parent + +# Initialize Pygame +pygame.init() + +# Constants +TILE_SIZE = 96 # Size of a square tile in pixels +GRID_WIDTH, GRID_HEIGHT = 16,8 # Grid dimensions +SCREEN_WIDTH, SCREEN_HEIGHT = GRID_WIDTH * TILE_SIZE, GRID_HEIGHT * TILE_SIZE +FPS = 60 # Frames per second + +# Setup display +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) +pygame.display.set_caption('Forklift Game') + +# Clock +clock = pygame.time.Clock() + +# Function to load and scale images +def load_image(name, scale=None): + """Loads an image and optionally scales it.""" + image = pygame.image.load(name).convert_alpha() + if scale: + image = pygame.transform.scale(image, scale) + return image + +# Placeholder for images (will be loaded after video mode set) +forklift_image_full = None +freight_images_full = None + +# Game variables +forklift_pos = [7, 0] +rotation='E'# Adjusted starting position of the forklift +carrying_freight = False +carried_freight = None +freight_positions = {} # Dictionary to keep track of freight positions and types + +# Load images +def load_images(): + global forklift_image_full, freight_images_full + global rotation + if rotation=='E': + forklift_image_full = load_image('forkliftE.png', (TILE_SIZE, TILE_SIZE)) + elif rotation=='W': + forklift_image_full = load_image('forkliftW.png', (TILE_SIZE, TILE_SIZE)) + elif rotation=='N': + forklift_image_full = load_image('forkliftN.png', (TILE_SIZE, TILE_SIZE)) + elif rotation=='S': + forklift_image_full = load_image('forkliftS.png', (TILE_SIZE, TILE_SIZE)) + #forklift_image_full = load_image('forklift.png', (TILE_SIZE, TILE_SIZE)) + freight_images_full = { + 'clothes': load_image('clothes.png', (TILE_SIZE, TILE_SIZE)), + 'fruit': load_image('fruit.png', (TILE_SIZE, TILE_SIZE)), + 'nuclear_waste': load_image('nuclear_waste.png', (TILE_SIZE, TILE_SIZE)), + 'car_parts': load_image('car_parts.png', (TILE_SIZE, TILE_SIZE)), + } + +# Initialize or reset game elements +def init_game(): + freight_positions.clear() + load_images() # Ensure images are loaded after video mode set + reset_truck_bed_freight() + +# Reset freight on the truck bed +def reset_truck_bed_freight(): + types = list(freight_images_full.keys()) + for x in range(12, 16): + freight_positions[(x, 0)] = random.choice(types) + +# Drawing functions +def draw_board(): + screen.fill((255, 255, 255)) + for x in range(GRID_WIDTH): + for y in range(GRID_HEIGHT): + pygame.draw.rect(screen, (0, 0, 0), pygame.Rect(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE), 1) + +def draw_truck_bed_and_racks(): + for x in range(12, 16): + pygame.draw.rect(screen, (0, 0, 255), (x * TILE_SIZE, 0, TILE_SIZE, TILE_SIZE)) + for y in range(5, 8): + for x in range(GRID_WIDTH): + pygame.draw.rect(screen, (165, 42, 42), (x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE)) + + +def draw_forklift_and_freight(): + x, y = forklift_pos + if carrying_freight: + # Draw smaller images when carrying freight + small_size = (TILE_SIZE // 2, TILE_SIZE // 2) + forklift_small = pygame.transform.scale(forklift_image_full, small_size) + freight_small = pygame.transform.scale(freight_images_full[carried_freight], small_size) + screen.blit(forklift_small, (x * TILE_SIZE, y * TILE_SIZE + TILE_SIZE // 2)) + screen.blit(freight_small, (x * TILE_SIZE + TILE_SIZE // 2, y * TILE_SIZE)) + else: + screen.blit(forklift_image_full, (x * TILE_SIZE, y * TILE_SIZE)) + +def draw_freight(): + for (x, y), freight_type in freight_positions.items(): + screen.blit(freight_images_full[freight_type], (x * TILE_SIZE, y * TILE_SIZE)) + +# Game mechanics +def move_forklift(): + global forklift_pos + if(rotation=='E'): + new_pos=[forklift_pos[0]+1,forklift_pos[1]] + elif(rotation=='W'): + new_pos=[forklift_pos[0]-1,forklift_pos[1]] + elif(rotation=='N'): + new_pos=[forklift_pos[0],forklift_pos[1]+1] + elif (rotation == 'S'): + new_pos = [forklift_pos[0], forklift_pos[1] - 1] + #new_pos = [forklift_pos[0] + dx, forklift_pos[1] + dy] + if 0 <= new_pos[0] < GRID_WIDTH and 0 <= new_pos[1] < GRID_HEIGHT: + forklift_pos = new_pos +def rotate_forklift(x): + global rotation + rot=['N','E','S','W'] + rots=rot.index(rotation) + if x=='R': + if rots==0: + x=rot[3] + else: + x=rot[rots-1] + + elif x=='L': + if rots==3: + x=rot[0] + else: + x=rot[rots+1] + rotation=x +def handle_freight(): + global carrying_freight, carried_freight, freight_positions + pos_tuple = tuple(forklift_pos) + if carrying_freight: + if pos_tuple not in freight_positions: + freight_positions[pos_tuple] = carried_freight + carrying_freight = False + carried_freight = None + else: + if pos_tuple in freight_positions: + carried_freight = freight_positions.pop(pos_tuple) + carrying_freight = True + +#searching for successors +def succ(current_node): + current_rotation=current_node.rotation + x=current_node.position[0] + y=current_node.position[1] + successors=[] + if(current_rotation=="N"): + if(y<7): + pos=[] + pos.append(x) + + pos.append(y+1) + action='FW' + successor=Node(pos,current_rotation,action,current_node) + successors.append(successor) + if(x>0): + pos = [] + pos.append(x) + pos.append(y) + new_rotation='W' + action='L' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + if(x<15): + pos = [] + pos.append(x) + pos.append(y) + new_rotation='E' + action='R' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + + + elif (current_rotation == "S"): + if (y > 0): + pos = [] + pos.append(x) + pos.append(y - 1) + action = 'FW' + successor = Node(pos, current_rotation,action,current_node) + successors.append(successor) + if (x > 0): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'E' + action='L' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + if (x < 15): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'W' + action = 'R' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + + elif (current_rotation == "E"): + if (x <15): + pos = [] + pos.append(x+1) + pos.append(y) + action = 'FW' + successor = Node(pos, current_rotation,action,current_node) + successors.append(successor) + if (y <7): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'N' + action='R' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + if (y >0): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'S' + action = 'L' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + + elif (current_rotation == "W"): + if (x > 0): + pos = [] + pos.append(x+1) + pos.append(y) + action = 'FW' + successor = Node(pos, current_rotation,action,current_node) + successors.append(successor) + if (y > 0): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'S' + action='R' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + if (y < 7): + pos = [] + pos.append(x) + pos.append(y) + new_rotation = 'N' + action = 'L' + successor = Node(pos, new_rotation,action,current_node) + successors.append(successor) + + return successors + +#bfs +def bfs(isstate,final): + fringe=[] + fringe.append(isstate) + path=[] + explored=[] + while(True): + if(len(fringe)==0): + return False + node=fringe.pop(0) + if(node.position[0]==final.position[0] and node.position[1]==final.position[1]): + while(node.parent!=None): + path.append(node) + node=node.parent + return path + explored.append(node) + successors=succ(node) + for successor in successors: + if (successor not in fringe and successor not in explored): + fringe.append(successor) + +# Main game loop +def game_loop(): + init_game() + current=Node(forklift_pos,rotation,'start',None) + final=Node([10,6],'N','final',None) + path=bfs(current,final) + path.reverse() + for node in path: + print(node.action) + i=0 + running = True + while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + rotate_forklift('L') + load_images() + elif event.key == pygame.K_RIGHT: + rotate_forklift('R') + load_images() + elif event.key == pygame.K_UP: + move_forklift() + elif event.key == pygame.K_SPACE: + handle_freight() + elif event.key == pygame.K_r: + reset_truck_bed_freight() + + draw_board() + draw_truck_bed_and_racks() + draw_freight() + draw_forklift_and_freight() + pygame.display.flip() + clock.tick(FPS) + if(i