Add chairs and wall graphics v2 #7
57
environment.md
Normal file
57
environment.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Raport 1
|
||||||
|
|
||||||
|
**Wybrany temat:** Automatyczny kelner
|
||||||
|
|
||||||
|
**Członkowie zespołu:** Marcin Jerzy Dobrowalski, Paweł Lewcki, Dominik Zawadzki, Maksymilian Kierski
|
||||||
|
|
||||||
|
**Czas prac:** 04.03.2020 - 08.04.2020
|
||||||
|
|
||||||
|
**Link do repozytorium projektu:** https://git.wmi.amu.edu.pl/s444427/Sztuczna_Inteligencja_2020
|
||||||
|
|
||||||
|
## Założenia Projektu
|
||||||
|
|
||||||
|
1. Stworzenie symulacji pracy automatycznego kelnera
|
||||||
|
2. Praca agenta, opiera się o metody naucznia maszynowego
|
||||||
|
3. Środowisko działania symulacji jest oparte na macierzy
|
||||||
|
4. Środowisko generowane jest na bazie pliku tesktowego
|
||||||
|
5. Kelner porusza się tylko po predefiniowanych polach macierzy
|
||||||
|
6. Kelner potrafi rozpoznawać pola marzecierzy z predefiniowanymi elementami takimi jak klient, stół, krzesło, bar, ściana
|
||||||
|
7. Kelner sprawdza stan stolika (pusty, nowi goście, starzy goście, po gościach)
|
||||||
|
8. Kelner obsługuje gości (doradza danie, przyjmuję zamówienie, serwuje danie, sprząta stolik)
|
||||||
|
9. Kelner porusza się w optymalny sposób
|
||||||
|
10. Kelner odbiera gotowe dania z baru i zanosi je do gości
|
||||||
|
|
||||||
|
## Środowisko agenta i reprezentacja wiedzy
|
||||||
|
|
||||||
|
Środowisko oparte jest na macierzy. Macierz z poczególnymi polami środowiska tworzona jest na podstawie pliku tekstowego simulation_1.txt. Pola macierzy zawierają objekty reprezentujące elemnty środowiska. Każdy z obiektów ma swoje poszczególne atrybuty, odpowiedzialne za sposób interakcji agenta względem nich. Agent potrafi porszać się na poczególnych polach pomocą WSAD.
|
||||||
|
|
||||||
|
* [main.py](main.py) - plik startowy
|
||||||
|
* [matrix.py](src/matrix.py) - klasa macierzy
|
||||||
|
* [tile.py](src/tile.py) - klasa pola macierzy
|
||||||
|
* [graphics.py](src/graphics.py) - klasa grafiki
|
||||||
|
* [waiter.py](src/waiter.py) - klasa agenta
|
||||||
|
|
||||||
|
![Raport screen](resources/raport.jpg "Raport screen")
|
||||||
|
|
||||||
|
## Instalacja i uruchomienie
|
||||||
|
|
||||||
|
Wymagania:
|
||||||
|
|
||||||
|
```
|
||||||
|
module: pygames
|
||||||
|
Python: 3.7.7
|
||||||
|
```
|
||||||
|
|
||||||
|
macOS / Linux
|
||||||
|
|
||||||
|
```
|
||||||
|
pygames
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Windows
|
||||||
|
|
||||||
|
```
|
||||||
|
pygames
|
||||||
|
python main.py
|
||||||
|
```
|
7
main.py
7
main.py
@ -1,14 +1,15 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from src.graphics import *
|
from src.graphics import *
|
||||||
from src.waiter import Waiter
|
from src.waiter import *
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# SETUP
|
# SETUP
|
||||||
pygame.init()
|
pygame.init()
|
||||||
clock = pygame.time.Clock()
|
clock = pygame.time.Clock()
|
||||||
fps = 40
|
fps = 40
|
||||||
waiter = Waiter()
|
|
||||||
graphics = Graphics()
|
graphics = Graphics()
|
||||||
|
waiter = Waiter(graphics)
|
||||||
|
|
||||||
# init functions
|
# init functions
|
||||||
graphics.drawBackground(waiter.matrix)
|
graphics.drawBackground(waiter.matrix)
|
||||||
@ -28,7 +29,7 @@ if __name__ == "__main__":
|
|||||||
break
|
break
|
||||||
|
|
||||||
graphics.clear(waiter.X, waiter.Y)
|
graphics.clear(waiter.X, waiter.Y)
|
||||||
waiter.update(event)
|
waiter.update(event, graphics)
|
||||||
graphics.update(waiter.X, waiter.Y)
|
graphics.update(waiter.X, waiter.Y)
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
clock.tick(fps)
|
clock.tick(fps)
|
||||||
|
BIN
resources/images/chair-back.png
Normal file
BIN
resources/images/chair-back.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
resources/images/chair-front.png
Normal file
BIN
resources/images/chair-front.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
BIN
resources/images/chair-left.png
Normal file
BIN
resources/images/chair-left.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
BIN
resources/images/chair-right.png
Normal file
BIN
resources/images/chair-right.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
BIN
resources/images/wall.png
Normal file
BIN
resources/images/wall.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.8 KiB |
BIN
resources/raport.jpg
Normal file
BIN
resources/raport.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 306 KiB |
15
resources/simulations/simulation_1.txt
Normal file
15
resources/simulations/simulation_1.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
______________
|
||||||
|
______________
|
||||||
|
__PW_____PW___
|
||||||
|
_USWP___USWP__
|
||||||
|
__OWS____OWSI_
|
||||||
|
__PWO____PWO__
|
||||||
|
_USW____USW___
|
||||||
|
__OWP____OWP__
|
||||||
|
__PWS____PWSI_
|
||||||
|
_USWO___USWO__
|
||||||
|
__OW_____OW___
|
||||||
|
______________
|
||||||
|
______________
|
||||||
|
BBBBB_________
|
||||||
|
FFFFB_________
|
8
resources/simulations/simulation_2.txt
Normal file
8
resources/simulations/simulation_2.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
X___TXFX
|
||||||
|
T_X_X__X
|
||||||
|
X_X_X_XX
|
||||||
|
T_X____T
|
||||||
|
X_X_XX_X
|
||||||
|
X_X____T
|
||||||
|
T_X_XXXX
|
||||||
|
XXX____W
|
2
resources/simulations/simulation_3.txt
Normal file
2
resources/simulations/simulation_3.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
__X
|
||||||
|
___
|
BIN
src/__pycache__/graphics.cpython-37.pyc
Normal file
BIN
src/__pycache__/graphics.cpython-37.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/matrix.cpython-37.pyc
Normal file
BIN
src/__pycache__/matrix.cpython-37.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/tile.cpython-37.pyc
Normal file
BIN
src/__pycache__/tile.cpython-37.pyc
Normal file
Binary file not shown.
BIN
src/__pycache__/waiter.cpython-37.pyc
Normal file
BIN
src/__pycache__/waiter.cpython-37.pyc
Normal file
Binary file not shown.
@ -5,23 +5,28 @@ class Graphics:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.image = {
|
self.image = {
|
||||||
'floor': pygame.image.load('../resources/images/floor.jpg'),
|
'floor': pygame.image.load('../resources/images/floor.jpg'),
|
||||||
'table': pygame.image.load('../resources/images/table.png'),
|
'wall': pygame.image.load('../resources/images/wall.png'), #
|
||||||
|
'bar': pygame.image.load('../resources/images/table3.png'), #
|
||||||
|
'bar_floor': pygame.image.load('../resources/images/waiter.png'),
|
||||||
|
'table': pygame.image.load('../resources/images/table3.png'),
|
||||||
'waiter': pygame.image.load('../resources/images/waiter.png'),
|
'waiter': pygame.image.load('../resources/images/waiter.png'),
|
||||||
'table2': pygame.image.load('../resources/images/table2.png'),
|
'chair_front': pygame.image.load('../resources/images/chair-front.png'), #
|
||||||
'table3': pygame.image.load('../resources/images/table3.png')
|
'chair_back': pygame.image.load('../resources/images/chair-back.png'), #
|
||||||
|
'chair_left': pygame.image.load('../resources/images/chair-left.png'), #
|
||||||
|
'chair_right': pygame.image.load('../resources/images/chair-right.png') #
|
||||||
}
|
}
|
||||||
self.block_size = 50
|
self.block_size = 50
|
||||||
self.height = 15
|
self.height = 15
|
||||||
self.width = 14
|
self.width: int = 14
|
||||||
self.screen = pygame.display.set_mode((self.block_size * self.width, self.block_size * self.height))
|
self.screen = pygame.display.set_mode((self.block_size * self.width, self.block_size * self.height))
|
||||||
|
|
||||||
def drawBackground(self, matrix):
|
def drawBackground(self, matrix):
|
||||||
for y in range(15):
|
for y in range(self.height):
|
||||||
for x in range(14):
|
for x in range(self.width):
|
||||||
self.screen.blit(self.image['floor'], (x * self.block_size, y * self.block_size))
|
self.screen.blit(self.image['floor'], (x * self.block_size, y * self.block_size))
|
||||||
|
|
||||||
for y in range(15):
|
for y in range(self.height):
|
||||||
for x in range(14):
|
for x in range(self.width):
|
||||||
self.screen.blit(self.image[matrix.get_type(x, y)], (x * self.block_size, y * self.block_size))
|
self.screen.blit(self.image[matrix.get_type(x, y)], (x * self.block_size, y * self.block_size))
|
||||||
|
|
||||||
def clear(self, x, y):
|
def clear(self, x, y):
|
||||||
|
@ -2,19 +2,44 @@ from src.tile import Tile
|
|||||||
|
|
||||||
|
|
||||||
class Matrix:
|
class Matrix:
|
||||||
def __init__(self):
|
def __init__(self, graphics):
|
||||||
self.matrix = []
|
self.matrix = []
|
||||||
for x in range(14):
|
self.set_default_matrix(graphics)
|
||||||
self.matrix.append([0] * 15)
|
self.set_default_restaurant(graphics)
|
||||||
|
|
||||||
for x in range(14):
|
def set_default_matrix(self, graphics):
|
||||||
for y in range(15):
|
for x in range(graphics.width):
|
||||||
self.matrix[x][y] = Tile(type_='floor', watch_through=1)
|
self.matrix.append([0] * graphics.height)
|
||||||
self.matrix[1][0].type = 'table3'
|
|
||||||
self.matrix[1][0].walk_through = 0
|
for x in range(graphics.width):
|
||||||
|
for y in range(graphics.height):
|
||||||
|
self.matrix[x][y] = Tile(type_='floor')
|
||||||
|
|
||||||
|
def set_default_restaurant(self, graphics):
|
||||||
|
lines = [line.rstrip('\n') for line in open('../resources/simulations/simulation_1.txt')]
|
||||||
|
symbols = {
|
||||||
|
'_': 'floor',
|
||||||
|
'W': 'wall',
|
||||||
|
'S': 'table',
|
||||||
|
'B': 'bar',
|
||||||
|
'F': 'bar_floor',
|
||||||
|
'P': 'chair_front',
|
||||||
|
'O': 'chair_back',
|
||||||
|
'I': 'chair_left',
|
||||||
|
'U': 'chair_right',
|
||||||
|
'X': 'waiter'
|
||||||
|
}
|
||||||
|
|
||||||
|
for x in range(graphics.width):
|
||||||
|
for y in range(graphics.height):
|
||||||
|
sign = lines[y][x]
|
||||||
|
self.matrix[x][y] = Tile(symbols[sign])
|
||||||
|
|
||||||
def get_type(self, x, y):
|
def get_type(self, x, y):
|
||||||
return self.matrix[x][y].type
|
return self.matrix[x][y].type
|
||||||
|
|
||||||
def walk_through(self, x, y):
|
def walk_through(self, x, y):
|
||||||
return self.matrix[x][y].walk_through
|
return self.matrix[x][y].walk_through
|
||||||
|
|
||||||
|
def watch_through(self, x, y):
|
||||||
|
return self.matrix[x][y].watch_through
|
||||||
|
18
src/tile.py
18
src/tile.py
@ -1,7 +1,17 @@
|
|||||||
# TILE
|
# TILE
|
||||||
class Tile:
|
class Tile:
|
||||||
def __init__(self, type_, watch_through):
|
def __init__(self, type_):
|
||||||
self.watch_through = watch_through
|
|
||||||
self.walk_through = 1
|
|
||||||
self.action_required = 0
|
|
||||||
self.type = type_
|
self.type = type_
|
||||||
|
|
||||||
|
if self.type == 'wall':
|
||||||
|
self.watch_through = 0
|
||||||
|
self.walk_through = 0
|
||||||
|
elif self.type == 'table' or self.type == 'bar' or self.type == 'chair':
|
||||||
|
self.watch_through = 1
|
||||||
|
self.walk_through = 0
|
||||||
|
else:
|
||||||
|
self.walk_through = 1
|
||||||
|
self.watch_through = 1
|
||||||
|
|
||||||
|
self.action_required = 0
|
||||||
|
|
||||||
|
@ -1,30 +1,32 @@
|
|||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
from src.matrix import Matrix
|
from src.matrix import Matrix
|
||||||
|
|
||||||
|
|
||||||
# WAITER
|
# WAITER
|
||||||
class Waiter(pygame.sprite.Sprite):
|
class Waiter(pygame.sprite.Sprite):
|
||||||
def __init__(self):
|
def __init__(self, graphics):
|
||||||
pygame.sprite.Sprite.__init__(self)
|
pygame.sprite.Sprite.__init__(self)
|
||||||
self.X = 0
|
self.X = 0
|
||||||
self.Y = 0
|
self.Y = 0
|
||||||
self.frame = 0
|
self.frame = 0
|
||||||
self.matrix = Matrix()
|
self.matrix = Matrix(graphics=graphics)
|
||||||
|
|
||||||
# Borders
|
# Borders
|
||||||
def move(self, x, y):
|
def move(self, x, y, graphics):
|
||||||
if 0 <= self.X + x <= 13 and 0 <= self.Y + y <= 14:
|
if 0 <= self.X + x <= graphics.width - 1 and 0 <= self.Y + y <= graphics.height - 1:
|
||||||
if self.matrix.walk_through(self.X + x, self.Y + y) == 1:
|
if self.matrix.walk_through(self.X + x, self.Y + y) == 1:
|
||||||
self.X += x
|
self.X += x
|
||||||
self.Y += y
|
self.Y += y
|
||||||
|
|
||||||
def update(self, event):
|
def update(self, event, graphics):
|
||||||
if event.type == pygame.KEYDOWN:
|
if event.type == pygame.KEYDOWN:
|
||||||
if event.key == pygame.K_LEFT:
|
if event.key == pygame.K_LEFT:
|
||||||
self.move(-1, 0)
|
self.move(-1, 0, graphics)
|
||||||
if event.key == pygame.K_RIGHT:
|
if event.key == pygame.K_RIGHT:
|
||||||
self.move(1, 0)
|
self.move(1, 0, graphics)
|
||||||
if event.key == pygame.K_UP:
|
if event.key == pygame.K_UP:
|
||||||
self.move(0, -1)
|
self.move(0, -1, graphics)
|
||||||
if event.key == pygame.K_DOWN:
|
if event.key == pygame.K_DOWN:
|
||||||
self.move(0, 1)
|
self.move(0, 1, graphics)
|
||||||
|
print(self.X, self.Y)
|
||||||
|
Loading…
Reference in New Issue
Block a user