nowe klasy i drzewo fix

This commit is contained in:
Zuzanna Myszczuk 2023-06-26 20:22:48 +02:00
parent b9fee0a480
commit 47465989b2
12 changed files with 376 additions and 237 deletions

View File

@ -3,6 +3,6 @@
"", "",
"\\decisionTree" "\\decisionTree"
], ],
"SelectedNode": "\\decisionTree\\decisionTree.sav", "SelectedNode": "\\decisionTree\\treemaker.py",
"PreviewInSolutionExplorer": false "PreviewInSolutionExplorer": false
} }

Binary file not shown.

Binary file not shown.

View File

@ -1,11 +1,13 @@
class Field: class Field:
def __init__(self, fieldType, plantType, isWet, wetTime, isFertilized, fertilizedTime): def __init__(self, fieldType, plantType, isWet, wetTime, isFertilized, fertilizedTime):
self.fieldType =fieldType # good/bad self.fieldType = fieldType # good/bad
self.plantType =plantType # wheat/carrot/cabbage self.plantType = plantType # wheat/carrot/cabbage
self.isWet =isWet # yes/no self.isWet = isWet # yes/no
self.wetTime =wetTime # number self.wetTime = wetTime # number
self.isFertilized =isFertilized # yes/no self.isFertilized = isFertilized # yes/no
self.fertilizedTime =fertilizedTime # number self.fertilizedTime = fertilizedTime # number
class Plant: class Plant:
def __init__(self, plantType, growthState): def __init__(self, plantType, growthState):
@ -22,3 +24,15 @@ class Player:
x = 0 x = 0
y = 0 y = 0
rotation = 0 rotation = 0
class Watering:
def __init__(self, rain, planted, temperature, sunny, snowy, moist, rotten, dayTime ):
self.rain = rain # yes/no
self.planted = planted # yes/no
self.temperature = temperature # good/bad
self.sunny = sunny
self.snowy = snowy # yes/no
self.moist = moist # yes/no
self.rotten = rotten # yes/no
self.dayTime = dayTime # 1 2 3 4

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
#from sklearn.datasets import load_iris # from sklearn.datasets import load_iris
from sklearn.tree import export_text from sklearn.tree import export_text
from sklearn.tree import DecisionTreeClassifier from sklearn.tree import DecisionTreeClassifier
@ -8,7 +9,7 @@ import joblib
X1 = [] X1 = []
view = [] view = []
with open("decisionTree/database.txt", 'r') as f: with open("database.txt", 'r') as f:
for line in f: for line in f:
line = line.strip() line = line.strip()
test_list = [int(i) for i in line] test_list = [int(i) for i in line]
@ -52,14 +53,14 @@ with open("decisionTree/database.txt", 'r') as f:
view.append(x) view.append(x)
X1.append(test_list) X1.append(test_list)
f = open("decisionTree/learning_set.txt", "w") #zapisuje atrybuty s³ownie f = open("learning_set.txt", "w") # zapisuje atrybuty s?ownie
for i in view: for i in view:
f.write(str(i)+"\n") f.write(str(i)+"\n")
f.close() f.close()
Y1 = [] Y1 = []
with open("decisionTree/decissions.txt", 'r') as f: #czyta decyzje with open("decissions.txt", 'r') as f: # czyta decyzje
for line in f: for line in f:
line = line.strip() line = line.strip()
test = int(line) test = int(line)
@ -67,9 +68,9 @@ with open("decisionTree/decissions.txt", 'r') as f: #czyta decyzje
dataset = X1 dataset = X1
decision = Y1 decision = Y1
labels = ['Rain','Plant','Temperature','Sun','Snow','Moisture','Rotten','Time'] labels = ['Rain', 'Plant', 'Temperature', 'Sun', 'Snow', 'Moisture', 'Rotten', 'Time']
model = DecisionTreeClassifier(random_state=0, max_depth=20).fit(dataset, decision) model = DecisionTreeClassifier(random_state=0, max_depth=20).fit(dataset, decision)
filename = 'decisionTree/decisionTree.sav' filename = 'decisionTree.sav'
print("Model trained") print("Model trained")
print("Decision tree:") print("Decision tree:")
print(export_text(model, feature_names=labels)) print(export_text(model, feature_names=labels))

556
main.py
View File

@ -1,9 +1,19 @@
import joblib
import numpy as np
import pygame import pygame
import random
from genetic_algorithm import genetic_algorithm
import torch
from torch import nn
from torchvision import datasets, transforms
from torchvision.transforms import Lambda
from PIL import Image
import astar import astar
from classes import Field, Plant, Fertilizer, Player from classes import Field, Player, Watering
from bfs import Node from bfs import Istate, succ
from bfs import Istate, print_moves, succ
from bfs import graphsearch from bfs import graphsearch
from board import Grid, Box, Obstacle, getGridBoxes, gridObjects from board import Grid, Box, Obstacle, getGridBoxes, gridObjects
from screen import SCREEN from screen import SCREEN
@ -14,8 +24,81 @@ from screen import SCREEN
Ucelu = False Ucelu = False
SCREENX = 500 SCREENX = 500
SCREENY = 500 SCREENY = 500
device = torch.device('cpu')
model1 = nn.Sequential(nn.Linear(30000, 10000), nn.ReLU(), nn.Linear(10000, 10000), nn.ReLU(), nn.Linear(10000, 10000), nn.Linear(10000, 4), nn.LogSoftmax(dim=-1)).to(device)
# model1.load_state_dict(torch.load("./NN/trained"))
pygame.display.set_caption('Inteligentny Traktor') pygame.display.set_caption('Inteligentny Traktor')
plants = [[], [], []]
plants[0].append(Image.open("NN/w1.png"))
plants[0].append(Image.open("NN/w2.png"))
plants[0].append(Image.open("NN/w3.png"))
plants[1].append(Image.open("NN/c1.png"))
plants[1].append(Image.open("NN/c2.png"))
plants[1].append(Image.open("NN/c3.png"))
plants[2].append(Image.open("NN/ca1.png"))
plants[2].append(Image.open("NN/ca2.png"))
plants[2].append(Image.open("NN/ca3.png"))
b = [Image.open("NN/b1.png").convert('RGBA'), Image.open("NN/b2.png").convert('RGBA'), Image.open("NN/b3.png").convert('RGBA')]
def generate(water, fertilizer, plantf):
if water == 1:
new_im = Image.new('RGB', (100, 100),
(160 + random.randint(-10, 10), 80 + random.randint(-10, 10), 40 + random.randint(-10, 10)))
tmp = plants[plantf][random.randint(0, 2)].resize(
(25 + random.randint(-10, 25), 25 + random.randint(-10, 25))).rotate(random.randint(0, 359))
new_im.paste(tmp, (random.randint(0, 50), random.randint(0, 50)), tmp)
if fertilizer:
tmp = b[random.randint(0, 2)].resize(
(20 + random.randint(0, 25), 20 + random.randint(0, 25))).rotate(random.randint(0, 359))
new_im.paste(tmp, (random.randint(25, 75), random.randint(25, 75)), tmp)
else:
if fertilizer:
new_im = Image.new('RGB', (100, 100),
(
50 + random.randint(-10, 10), 25 + random.randint(-10, 10),
0 + random.randint(-10, 10)))
tmp = plants[plantf][random.randint(0, 2)].resize(
(25 + random.randint(-10, 25), 25 + random.randint(-10, 25))).rotate(random.randint(0, 359))
new_im.paste(tmp, (random.randint(0, 50), random.randint(0, 50)), tmp)
tmp = b[random.randint(0, 2)].resize(
(20 + random.randint(0, 25), 20 + random.randint(0, 25))).rotate(random.randint(0, 359))
new_im.paste(tmp, (random.randint(25, 75), random.randint(25, 75)), tmp)
else:
if random.randint(0, 1) == 1:
new_im = Image.new('RGB', (100, 100),
(50 + random.randint(-10, 10), 25 + random.randint(-10, 10),
0 + random.randint(-10, 10)))
else:
new_im = Image.new('RGB', (100, 100),
(160 + random.randint(-10, 10), 80 + random.randint(-10, 10),
40 + random.randint(-10, 10)))
if random.randint(0, 1) == 1: # big
tmp = plants[plantf][random.randint(0, 2)].resize(
(75 + random.randint(-10, 25), 75 + random.randint(-10, 25))).rotate(random.randint(0, 359))
new_im.paste(tmp, (random.randint(0, 15), random.randint(0, 15)), tmp)
else:
tmp = plants[plantf][random.randint(0, 2)].resize(
(random.randint(10, 80), random.randint(10, 80))).rotate(random.randint(0, 359))
datas = tmp.getdata()
new_image_data = []
for item in datas:
# change all white (also shades of whites) pixels to yellow
if item[0] in list(range(190, 256)):
new_image_data.append(
(random.randint(0, 10), 255 + random.randint(-150, 0), random.randint(0, 10)))
else:
new_image_data.append(item)
# update image data
tmp.putdata(new_image_data)
new_im.paste(tmp, (random.randint(0, 30), random.randint(0, 30)), tmp)
return new_im
# COLORS # COLORS
WHITE = (255, 255, 255) WHITE = (255, 255, 255)
@ -43,18 +126,19 @@ obstacles = 1
# BFS Variables # BFS Variables
startNode = Istate(1, 1, 1)
goalNode = [1, 1]
startNode = Istate( 1,1,1)
goalNode = [1,1]
graph = dict() graph = dict()
pathFound = [] # Store the path in a list box index to draw on later pathFound = [] # Store the path in a list box index to draw on later
def drawGrid(sizex,sizey): wheat_path = []
carrot_path = []
cabbage_path = []
def drawGrid(sizex, sizey):
spaceX = SCREENX // sizex spaceX = SCREENX // sizex
spaceY = SCREENY // sizey spaceY = SCREENY // sizey
width = 2
counter = 1 counter = 1
for i in range(sizex): for i in range(sizex):
@ -63,16 +147,18 @@ def drawGrid(sizex,sizey):
g = Grid(50 + i*50, 50 + j*50, spaceX, spaceY) g = Grid(50 + i*50, 50 + j*50, spaceX, spaceY)
gridObjects[counter] = g gridObjects[counter] = g
counter += 1 counter += 1
def generateGraph(row,col):
def generateGraph(row, col):
# This function generates a graph based on the gridObjects instantiated! # This function generates a graph based on the gridObjects instantiated!
sample_graph = {'A':['B','C','E'], # sample_graph = {'A': ['B', 'C', 'E'],
'B':['A','D','E'], # 'B': ['A', 'D', 'E'],
'C':['A','F','G'], # 'C': ['A', 'F', 'G'],
'D':['B'], # 'D': ['B'],
'E':['A','B','D'], # 'E': ['A', 'B', 'D'],
'F':['C'], # 'F': ['C'],
'G':['C'] # 'G': ['C']
} # }
miniG = {} miniG = {}
for grid in range(len(gridObjects)): for grid in range(len(gridObjects)):
@ -133,12 +219,13 @@ def generateGraph(row,col):
return miniG2 return miniG2
def drawGraph(pathF):
#Draws the path given the path-list
global Ucelu
#print(pathF)
if (Ucelu == False): def drawGraph(pathF):
# Draws the path given the path-list
global Ucelu
# print(pathF)
if not Ucelu:
for grid in pathF: for grid in pathF:
# g = gridObjects[grid] # Get the grid-box object mentioned in the path # g = gridObjects[grid] # Get the grid-box object mentioned in the path
# x = g.x # x = g.x
@ -151,9 +238,9 @@ def drawGraph(pathF):
if grid == 'rotate_right': if grid == 'rotate_right':
player.rotation = (player.rotation - 90) % 360 player.rotation = (player.rotation - 90) % 360
if grid == 'rotate_left': if grid == 'rotate_left':
player.rotation = (player.rotation + 90) %360 player.rotation = (player.rotation + 90) % 360
#( player.rotation) # (player.rotation)
if grid == 'move': if grid == 'move':
if player.rotation == 0: if player.rotation == 0:
@ -169,49 +256,11 @@ def drawGraph(pathF):
if player.y > 0: if player.y > 0:
player.y = player.y - 1 player.y = player.y - 1
# if player.x < (x/50 - 1):
# a = 1
# if player.x > (x/50 - 1):
# a =2
# if player.y < (y/50 - 1):
# a =3
# if player.y > (y/50 - 1):
# a =4
#
# if a==1:
# # player.x = x/50 - 1
# player.rotation = 0
# if a==2:
# # player.x = x/50 - 1
# player.rotation = 180
# if a==3:
# # player.y = y/50 - 1
# player.rotation = 270
# if a==4:
# # player.y = y/50 - 1
# player.rotation = 90
# tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
# if player.rotation == 180:
# tmpImg = pygame.transform.flip(tmpImg, True, True)
# tmpImg = pygame.transform.flip(tmpImg, True, False)
#
# #player is seen on the way
# SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y))
# pygame.display.update()
# # pygame.time.wait(300)
# player.y = y/50 - 1
# player.x = x/50 - 1
# -----------------------------
i = 0 i = 0
while i < len(T): while i < len(T):
j = 0 j = 0
while j < len(T[i]): while j < len(T[i]):
#color = (255, 255, 255, 0) # color = (255, 255, 255, 0)
if T[i][j].isWet == 0: if T[i][j].isWet == 0:
# a = 1 # a = 1
color = (160, 80, 40, 0) color = (160, 80, 40, 0)
@ -219,7 +268,7 @@ def drawGraph(pathF):
# a = 1 # a = 1
color = (50, 25, 0, 0) color = (50, 25, 0, 0)
#Covers 'player' on the way # Covers 'player' on the way
pygame.draw.rect(SCREEN, color, pygame.Rect(50 + 50 * i, 50 + 50 * j, 50, 50)) pygame.draw.rect(SCREEN, color, pygame.Rect(50 + 50 * i, 50 + 50 * j, 50, 50))
if T[i][j].plantType == 1: if T[i][j].plantType == 1:
SCREEN.blit(imgWheat, (50 + 50 * i, 50 + 50 * j)) SCREEN.blit(imgWheat, (50 + 50 * i, 50 + 50 * j))
@ -237,7 +286,6 @@ def drawGraph(pathF):
for obs in obstacleObjects: for obs in obstacleObjects:
obstacleObjects[obs].draw() obstacleObjects[obs].draw()
for bx in boxObjects: for bx in boxObjects:
boxObjects[bx].draw() boxObjects[bx].draw()
@ -252,30 +300,21 @@ def drawGraph(pathF):
tmpImg = pygame.transform.flip(tmpImg, True, True) tmpImg = pygame.transform.flip(tmpImg, True, True)
tmpImg = pygame.transform.flip(tmpImg, True, False) tmpImg = pygame.transform.flip(tmpImg, True, False)
#player is seen on the way # player is seen on the way
SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y)) SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y))
# --------------------------------------
# tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
# # if flip:
# # if flip == True:
# if player.rotation == 180:
# tmpImg = pygame.transform.flip(tmpImg, True, True)
# tmpImg = pygame.transform.flip(tmpImg, True, False)
#
# SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y))
pygame.display.update() pygame.display.update()
pygame.time.wait(300) pygame.time.wait(300)
SCREEN.fill((WHITE)) SCREEN.fill(WHITE)
# pygame.time.wait(50) # pygame.time.wait(50)
# pygame.draw.rect(SCREEN, WHITE, pygame.Rect(x, y, sx, sy)) # pygame.draw.rect(SCREEN, WHITE, pygame.Rect(x, y, sx, sy))
Ucelu = True Ucelu = True
def UIHandler(mouseObj):
def UIHandler():
# drawGrid(GRIDX, GRIDY) # drawGrid(GRIDX, GRIDY)
global Ucelu global Ucelu
drawGrid(10,10) drawGrid(10, 10)
for grid in gridObjects: for grid in gridObjects:
gridObjects[grid].draw() gridObjects[grid].draw()
@ -288,9 +327,9 @@ def UIHandler(mouseObj):
if pathFound: if pathFound:
drawGraph(pathFound) drawGraph(pathFound)
# Ucelu = False
def eventHandler(kbdObj,mouseObj):
def eventHandler(kbdObj, mouseObj):
global boxes global boxes
global obstacles global obstacles
global startNode global startNode
@ -299,7 +338,7 @@ def eventHandler(kbdObj,mouseObj):
global Ucelu global Ucelu
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
running = False pygame.quit()
if event.type == pygame.KEYDOWN: if event.type == pygame.KEYDOWN:
pygame.time.wait(DELAY) pygame.time.wait(DELAY)
@ -345,15 +384,10 @@ def eventHandler(kbdObj,mouseObj):
# If Key_f is pressed, set goal node # If Key_f is pressed, set goal node
if kbdObj[pygame.K_f]: if kbdObj[pygame.K_f]:
gBox = getGridBoxes(int(len(gridObjects))) gBox = getGridBoxes(int(len(gridObjects)))
# gBox = getGridBoxes()
#x = mouseObj[0]
#y = mouseObj[1]
# x = gBox.x
# y = gBox.y
sx = gBox.sx sx = gBox.sx
sy = gBox.sy sy = gBox.sy
# ----------------------------------------
mseX = mouseObj[0] mseX = mouseObj[0]
mseY = mouseObj[1] mseY = mouseObj[1]
@ -363,42 +397,71 @@ def eventHandler(kbdObj,mouseObj):
y = g.y y = g.y
sx = g.sx sx = g.sx
sy = g.sy sy = g.sy
if mseX > x and mseX < x + sx: if x < mseX < x + sx:
if mseY > y and mseY < y + sy: if y < mseY < y + sy:
posX = x posX = x
posY = y posY = y
gridBox = grid
# SCREEN.blit(imgTree, (posX, posY))
# ---------------------------------------
bo = Box(posX, posY, sx, sy, BLUE) bo = Box(posX, posY, sx, sy, BLUE)
boxObjects[boxes] = bo boxObjects[boxes] = bo
# boxes += 1
boxes = 1 boxes = 1
# goalNode = GRIDX*GRIDX
# goalNode = (10 * (x + 1) + (y + 1) - 10)
# goalNode.state = int(10 * (posX/50 ) + (posY/50) - 10)
# goalNode[0] = int((posX/50)
# goalNode[1] = int(posY/50) - 10
goalNode = [int(posX/50), int(posY/50)] goalNode = [int(posX/50), int(posY/50)]
# goalNode = [10,10]
print(' goalNode x=', goalNode[0], 'goalNode y=', goalNode[1]) # drzewo decyzyjne:
W = np.random.randint(2, size=(10, 10, 8))
# Wczytywanie modelu z pliku
labels = ['Rain', 'Planted', 'Temperature', 'Sun', 'Snow', 'Moisture', 'Rotten', 'Time']
loaded_model = joblib.load('decisionTree/decisionTreeFinal.sav')
sample = W[goalNode[0]-1][goalNode[1]-1]
# Klasyfikacja przy użyciu wczytanego modelu
predicted_class = loaded_model.predict([sample])
print(labels)
print(sample)
print('Predicted class:', predicted_class)
# Decyzja dotycząca podlania grządek na podstawie przewidzianej etykiety
if predicted_class == [1]:
print('Podlej grządkę')
else:
print('Nie podlewaj grządki')
# pygame.display.update() print('goalNode x = ', goalNode[0], 'goalNode y = ', goalNode[1])
# goalNode = (x/sx) * (y/sy)
# Delay to avoid multiple spawning of objects # Delay to avoid multiple spawning of objects
pygame.time.wait(DELAY) pygame.time.wait(DELAY)
# If Key_x is pressed, spawn tree if kbdObj[pygame.K_t]:
w = random.randint(0, 1)
f = random.randint(0, 1)
print(w)
print(f)
img = generate(w, f, random.randint(0, 2))
img.save('./test/00/test.png')
data_transform = transforms.Compose([
transforms.Resize(size=(100, 100)),
transforms.RandomHorizontalFlip(p=0.5),
transforms.ToTensor(),
Lambda(lambda x: x.flatten())
])
datasets.ImageNet
train_data = datasets.ImageFolder(root="./test",
transform=data_transform,
target_transform=None)
model1.eval()
res = model1(train_data[0][0])
if res[0] == res.max():
print("0 0")
if res[1] == res.max():
print("0 1")
if res[2] == res.max():
print("1 0")
if res[3] == res.max():
print("1 1")
# img.show()
if kbdObj[pygame.K_x]: if kbdObj[pygame.K_x]:
obs = Obstacle(mouseObj) obs = Obstacle(mouseObj)
obstacleObjects[obstacles] = obs obstacleObjects[obstacles] = obs
@ -417,44 +480,22 @@ def eventHandler(kbdObj,mouseObj):
y = g.y y = g.y
sx = g.sx sx = g.sx
sy = g.sy sy = g.sy
if mseX > x and mseX < x + sx: if x < mseX < x + sx:
if mseY > y and mseY < y + sy: if y < mseY < y + sy:
posX = x posX = x
posY = y posY = y
T[int((posX/50)-1)][int((posY/50)-1)].plantType=4 T[int((posX/50)-1)][int((posY/50)-1)].plantType = 4
pygame.display.update() pygame.display.update()
pygame.time.wait(DELAY) pygame.time.wait(DELAY)
# if Key_SPACE is pressed, start the magic # if Key_SPACE is pressed, start the magic
if kbdObj[pygame.K_SPACE]: if kbdObj[pygame.K_SPACE]:
Ucelu = False Ucelu = False
gBox = getGridBoxes(1)
x = gBox.x
y = gBox.y
sx = gBox.sx
sy = gBox.sy
x = (player.x +1) * 50
y = (player.y +1) * 50
# tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
# SCREEN.blit(tmpImg, (50 + 50 * player.x, 50 + 50 * player.y))
# pygame.display.update()
#when on it keeps flashing - among others
#bo = Box(x, y, sx, sy, RED)
#boxObjects[boxes] = bo
# boxes += 1
boxes = 1 boxes = 1
# startNode.state = (10 * (player.x + 1) + (player.y + 1) - 10)
startNode.x = player.x + 1 startNode.x = player.x + 1
startNode.y = player.y + 1 startNode.y = player.y + 1
@ -467,17 +508,14 @@ def eventHandler(kbdObj,mouseObj):
elif player.rotation == 270: elif player.rotation == 270:
startNode.direction = 4 startNode.direction = 4
print(' startNode x=', startNode.x, 'startNode y= ', startNode.y, 'startNode direction =', startNode.direction) print('startNode x = ', startNode.x, 'startNode y = ', startNode.y, 'startNode direction = ', startNode.direction)
graph = generateGraph(GRIDY,GRIDX) graph = generateGraph(GRIDY, GRIDX)
print(graph) print(graph)
# if startNode != goalNode:
if startNode.x != goalNode[0] or startNode.y != goalNode[1]: if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
elem = []
move_list = (graphsearch(goalNode, startNode)) # przeszukiwanie grafu wszerz
move_list = (graphsearch([], [], goalNode, startNode)) # przeszukiwanie grafu wszerz
pathFound = move_list pathFound = move_list
@ -489,32 +527,11 @@ def eventHandler(kbdObj,mouseObj):
pygame.time.wait(DELAY) pygame.time.wait(DELAY)
# startNode = goalNode # startNode = goalNode
if kbdObj[pygame.K_b]: if kbdObj[pygame.K_b]:
Ucelu = False Ucelu = False
gBox = getGridBoxes(1)
x = gBox.x
y = gBox.y
sx = gBox.sx
sy = gBox.sy
x = (player.x +1) * 50
y = (player.y +1) * 50
# tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
# SCREEN.blit(tmpImg, (50 + 50 * player.x, 50 + 50 * player.y))
# pygame.display.update()
#when on it keeps flashing - among others
#bo = Box(x, y, sx, sy, RED)
#boxObjects[boxes] = bo
# boxes += 1
boxes = 1 boxes = 1
# startNode.state = (10 * (player.x + 1) + (player.y + 1) - 10)
startNode.x = player.x + 1 startNode.x = player.x + 1
startNode.y = player.y + 1 startNode.y = player.y + 1
@ -527,24 +544,12 @@ def eventHandler(kbdObj,mouseObj):
elif player.rotation == 270: elif player.rotation == 270:
startNode.direction = 4 startNode.direction = 4
print(' startNode x=', startNode.x, 'startNode y= ', startNode.y, 'startNode direction =', startNode.direction) print('startNode x = ', startNode.x, 'startNode y = ', startNode.y, 'startNode direction = ', startNode.direction)
# startNode = (((player.x + 1)*10 - 9) * (player.y + 1) ) graph = generateGraph(GRIDY, GRIDX)
# startNode = 2
# tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
# SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y))
# pygame.display.update()
# Delay to avoid multiple spawning of objects
#pygame.time.wait(DELAY)
graph = generateGraph(GRIDY,GRIDX)
print(graph) print(graph)
# if startNode != goalNode:
if startNode.x != goalNode[0] or startNode.y != goalNode[1]: if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
elem = []
move_list = (astar.graphsearch([], astar.f, [], goalNode, startNode, T, succ)) # przeszukiwanie grafu wszerz move_list = (astar.graphsearch([], astar.f, [], goalNode, startNode, T, succ)) # przeszukiwanie grafu wszerz
@ -555,17 +560,150 @@ def eventHandler(kbdObj,mouseObj):
print(move_list) print(move_list)
print('\n') print('\n')
# Delay to avoid multiple spawning of objects
pygame.time.wait(DELAY)
# else: if kbdObj[pygame.K_g]:
# startNode = (10 * (player.x + 1) + (player.y + 1) - 10)
# Ucelu = True global wheat_path
if not wheat_path:
wheat = [(player.x+1, player.y+1), (4, 3), (6, 3), (7, 3), (9, 3), (10, 3), (5, 4), (5, 5), (6, 5), (10, 5), (3, 6), (4, 6), (6, 7), (7, 7), (8, 7)]
wheat_path = genetic_algorithm(wheat, player)
print("Best wheat path:", wheat_path)
if T[player.x][player.y].plantType != 0:
T[player.x][player.y].plantType = 0
if len(wheat_path) > 1:
Ucelu = False
boxes = 1
startNode.x = player.x + 1
startNode.y = player.y + 1
if player.rotation == 0:
startNode.direction = 1
elif player.rotation == 90:
startNode.direction = 2
elif player.rotation == 180:
startNode.direction = 3
elif player.rotation == 270:
startNode.direction = 4
generateGraph(GRIDY, GRIDX)
goalNode = [wheat_path[1][0], wheat_path[1][1]]
if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
move_list = astar.graphsearch([], astar.f, [], goalNode, startNode, T, succ) # przeszukiwanie grafu wszerz
pathFound = move_list
wheat_path.pop(0)
# Delay to avoid multiple spawning of objects # Delay to avoid multiple spawning of objects
pygame.time.wait(DELAY) pygame.time.wait(DELAY)
#With it it keeps going, if without it turns off else:
print("All wheat collected!")
if kbdObj[pygame.K_h]:
global carrot_path
if not carrot_path:
carrot = [(player.x+1, player.y+1), (3, 1), (9, 2), (1, 3), (5, 3), (4, 4), (6, 4), (7, 4), (8, 4), (3, 5), (9, 5), (6, 6), (10, 10)]
carrot_path = genetic_algorithm(carrot, player)
print("Best carrot path:", carrot_path)
if T[player.x][player.y].plantType != 0:
T[player.x][player.y].plantType = 0
if len(carrot_path) > 1:
Ucelu = False
boxes = 1
startNode.x = player.x + 1
startNode.y = player.y + 1
if player.rotation == 0:
startNode.direction = 1
elif player.rotation == 90:
startNode.direction = 2
elif player.rotation == 180:
startNode.direction = 3
elif player.rotation == 270:
startNode.direction = 4
generateGraph(GRIDY, GRIDX)
goalNode = [carrot_path[1][0], carrot_path[1][1]]
if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
move_list = astar.graphsearch([], astar.f, [], goalNode, startNode, T, succ) # przeszukiwanie grafu wszerz
pathFound = move_list
carrot_path.pop(0)
# Delay to avoid multiple spawning of objects
pygame.time.wait(DELAY)
else:
print("All carrot collected!")
if kbdObj[pygame.K_j]:
global cabbage_path
if not cabbage_path:
cabbage = [(player.x+1, player.y+1), (5, 1), (5, 2), (8, 3), (1, 4), (2, 4), (1, 5), (4, 5), (9, 6), (1, 8), (2, 8), (3, 8), (4, 8), (5, 8)]
cabbage_path = genetic_algorithm(cabbage, player)
print("Best cabbage path:", cabbage_path)
if T[player.x][player.y].plantType != 0:
T[player.x][player.y].plantType = 0
if len(cabbage_path) > 1:
Ucelu = False
boxes = 1
startNode.x = player.x + 1
startNode.y = player.y + 1
if player.rotation == 0:
startNode.direction = 1
elif player.rotation == 90:
startNode.direction = 2
elif player.rotation == 180:
startNode.direction = 3
elif player.rotation == 270:
startNode.direction = 4
generateGraph(GRIDY, GRIDX)
goalNode = [cabbage_path[1][0], cabbage_path[1][1]]
if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
move_list = astar.graphsearch([], astar.f, [], goalNode, startNode, T, succ) # przeszukiwanie grafu wszerz
pathFound = move_list
cabbage_path.pop(0)
# Delay to avoid multiple spawning of objects
pygame.time.wait(DELAY)
else:
print("All cabbage collected!")
# Ucelu = False
T = [[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,2,1,0,0,0),Field(1,3,0,0,0,0),Field(0,3,0,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,3,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)], T = [[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,2,1,0,0,0),Field(1,3,0,0,0,0),Field(0,3,0,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,3,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)],
[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,0,1,0,0,0),Field(1,3,1,0,0,0),Field(0,0,0,0,0,0),Field(0,0,0,0,0,0),Field(0,0,0,0,0,0),Field(1,3,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)], [Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,0,1,0,0,0),Field(1,3,1,0,0,0),Field(0,0,0,0,0,0),Field(0,0,0,0,0,0),Field(0,0,0,0,0,0),Field(1,3,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)],
@ -576,20 +714,7 @@ T = [[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,2,1,0,0,0),Field(1,3,0,0,0,0
[Field(1,0,0,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,2,0,0,0,0),Field(0,0,1,0,0,0),Field(0,0,1,0,0,0),Field(0,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)], [Field(1,0,0,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,2,0,0,0,0),Field(0,0,1,0,0,0),Field(0,0,1,0,0,0),Field(0,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)],
[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,3,1,0,0,0),Field(1,2,1,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(0,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)], [Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,3,1,0,0,0),Field(1,2,1,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(0,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)],
[Field(1,0,0,0,0,0),Field(0,2,0,0,0,0),Field(1,1,0,0,0,0),Field(1,0,1,0,0,0),Field(0,2,1,0,0,0),Field(0,3,0,0,0,0),Field(0,0,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)], [Field(1,0,0,0,0,0),Field(0,2,0,0,0,0),Field(1,1,0,0,0,0),Field(1,0,1,0,0,0),Field(0,2,1,0,0,0),Field(0,3,0,0,0,0),Field(0,0,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)],
[Field(1,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,0,0,0,0,0),Field(0,1,1,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,1,0,0,0)]] [Field(1,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,0,0,0,0,0),Field(0,1,1,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,2,1,0,0,0)]]
#T = [[Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,2,1,0,0,0),Field(1,3,0,0,0,0),Field(0,3,0,0,0,0),Field(0,0,1,0,0,0),Field(0,3,0,0,0,0),Field(1,0,1,0,0,0),Field(1,3,0,0,0,0),Field(1,2,1,0,0,0)],
# [Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,0,1,0,0,0),Field(1,3,1,0,0,0),Field(0,0,0,0,0,0),Field(0,0,0,0,0,0),Field(0,2,0,0,0,0),Field(1,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,1,0,0,0,0)],
# [Field(0,2,1,0,0,0),Field(0,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,0,0,0,0,0),Field(0,2,1,0,0,0),Field(0,1,1,0,0,0),Field(0,2,0,0,0,0),Field(1,0,0,0,0,0),Field(1,0,0,0,0,0),Field(1,1,0,0,0,0)],
# [Field(1,0,1,0,0,0),Field(0,0,1,0,0,0),Field(1,1,1,0,0,0),Field(1,2,0,0,0,0),Field(0,3,1,0,0,0),Field(0,1,0,0,0,0),Field(0,0,0,0,0,0),Field(1,2,0,0,0,0),Field(1,0,0,0,0,0),Field(1,0,0,0,0,0)],
# [Field(1,3,0,0,0,0),Field(0,3,1,0,0,0),Field(1,2,1,0,0,0),Field(1,1,1,0,0,0),Field(0,1,1,0,0,0),Field(0,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,0,1,0,0,0),Field(1,3,0,0,0,0),Field(1,0,1,0,0,0)],
# [Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,1,1,0,0,0),Field(1,2,0,0,0,0),Field(0,1,0,0,0,0),Field(0,2,0,0,0,0),Field(0,1,0,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0),Field(1,1,1,0,0,0)],
# [Field(1,0,0,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,2,0,0,0,0),Field(0,0,1,0,0,0),Field(0,0,1,0,0,0),Field(0,1,0,0,0,0),Field(1,2,1,0,0,0),Field(1,2,1,0,0,0),Field(1,0,0,0,0,0)],
# [Field(1,0,0,0,0,0),Field(0,0,1,0,0,0),Field(1,3,1,0,0,0),Field(1,2,1,0,0,0),Field(0,0,1,0,0,0),Field(0,0,0,0,0,0),Field(0,1,1,0,0,0),Field(1,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,1,1,0,0,0)],
# [Field(1,0,0,0,0,0),Field(0,2,0,0,0,0),Field(1,1,0,0,0,0),Field(1,0,1,0,0,0),Field(0,2,1,0,0,0),Field(0,3,0,0,0,0),Field(0,0,0,0,0,0),Field(1,0,0,0,0,0),Field(1,2,1,0,0,0),Field(1,2,1,0,0,0)],
# [Field(1,0,1,0,0,0),Field(0,0,0,0,0,0),Field(1,1,1,0,0,0),Field(1,0,0,0,0,0),Field(0,1,1,0,0,0),Field(0,0,1,0,0,0),Field(0,1,0,0,0,0),Field(1,1,1,0,0,0),Field(1,0,1,0,0,0),Field(1,0,0,0,0,0)]]
# ========================================================================================= # =========================================================================================
@ -608,12 +733,12 @@ while running:
for event in pygame.event.get(): for event in pygame.event.get():
kbd = pygame.key.get_pressed() kbd = pygame.key.get_pressed()
mse = pygame.mouse.get_pos() mse = pygame.mouse.get_pos()
UIHandler(mse) UIHandler()
eventHandler(kbd, mse) eventHandler(kbd, mse)
pygame.display.update() pygame.display.update()
# CLOCK.tick(FPS) # CLOCK.tick(FPS)
#screen.fill((175, 255, 50, 0)) # screen.fill((175, 255, 50, 0))
# SCREEN.fill((WHITE)) # SCREEN.fill((WHITE))
imgWheat = pygame.image.load('img/wheat.png') imgWheat = pygame.image.load('img/wheat.png')
@ -635,7 +760,9 @@ while running:
else: else:
# a = 1 # a = 1
color = (50, 25, 0, 0) color = (50, 25, 0, 0)
#colour from the beginning # colour from the beginning
pygame.draw.rect(SCREEN, color, pygame.Rect(50 + 50 * i, 50 + 50 * j, 50, 50))
if T[i][j].plantType == 0:
pygame.draw.rect(SCREEN, color, pygame.Rect(50 + 50 * i, 50 + 50 * j, 50, 50)) pygame.draw.rect(SCREEN, color, pygame.Rect(50 + 50 * i, 50 + 50 * j, 50, 50))
if T[i][j].plantType == 1: if T[i][j].plantType == 1:
SCREEN.blit(imgWheat, (50 + 50 * i, 50 + 50 * j)) SCREEN.blit(imgWheat, (50 + 50 * i, 50 + 50 * j))
@ -646,10 +773,13 @@ while running:
if T[i][j].plantType == 4: if T[i][j].plantType == 4:
SCREEN.blit(imgTree, (50 + 50 * i, 50 + 50 * j)) SCREEN.blit(imgTree, (50 + 50 * i, 50 + 50 * j))
j = j + 1 j = j + 1
i = i + 1 i = i + 1
font = pygame.font.SysFont('comicsans', 22)
labelx = font.render('temp:22 |rain:none |snow:none |sun:cloudy |time:evening', True, (0, 0, 0))
SCREEN.blit(labelx, (10, 10))
i = 0 i = 0
while i < len(T)+1: while i < len(T)+1:
pygame.draw.line(SCREEN, (0, 0, 0), (50 + i * 50, 50), (50 + i * 50, 50 + len(T) * 50), 1) pygame.draw.line(SCREEN, (0, 0, 0), (50 + i * 50, 50), (50 + i * 50, 50 + len(T) * 50), 1)
@ -660,35 +790,29 @@ while running:
obstacleObjects[obs].draw() obstacleObjects[obs].draw()
# if startNode.state != goalNode.state: # if startNode.state != goalNode.state:
if startNode.x != goalNode[0] or startNode.y != goalNode[1] : if startNode.x != goalNode[0] or startNode.y != goalNode[1]:
for bx in boxObjects: for bx in boxObjects:
boxObjects[bx].draw() boxObjects[bx].draw()
tmpImg = pygame.transform.rotate(imgPlayer, player.rotation) tmpImg = pygame.transform.rotate(imgPlayer, player.rotation)
if player.rotation == 180: if player.rotation == 180:
tmpImg = pygame.transform.flip(tmpImg, True, True) tmpImg = pygame.transform.flip(tmpImg, True, True)
tmpImg = pygame.transform.flip(tmpImg, True, False) tmpImg = pygame.transform.flip(tmpImg, True, False)
#player seen at the beginning # player seen at the beginning
SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y)) SCREEN.blit(tmpImg, (55 + 50 * player.x, 55 + 50 * player.y))
label = font.render('F - cel | X - drzewo', True, (0, 0, 0))
# if Ucelu == False: label1 = font.render('ARROWS - ręczne poruszanie', True, (0, 0, 0))
# for bx in boxObjects: label2 = font.render('A - lewo | D - prawo | W - ruch', True, (0, 0, 0))
# boxObjects[bx].draw() label3 = font.render('SPACE - BFS | B - A*', True, (0, 0, 0))
label4 = font.render('G - GA pszenica | H - GA marchewki | J - GA kapusty', True, (0, 0, 0))
SCREEN.blit(label, (10, 555))
font = pygame.font.SysFont('comicsans', 18) SCREEN.blit(label1, (10, 580))
label = font.render('f- punkt końcowy, x- drzewa, spacja- uruchomienie', 1, (0, 0, 0)) SCREEN.blit(label2, (10, 605))
label1 = font.render('strzałki-ręczne poruszanie traktorem,', 1, (0, 0, 0))
label2 = font.render('a- obrót w lewo, d- w prawo, w-ruch naprzód', 1, (0, 0, 0))
label3 = font.render('b - uruchom A*', 1, (0, 0, 0))
SCREEN.blit(label, (10, 570))
SCREEN.blit(label1, (10, 590))
SCREEN.blit(label2, (10, 610))
SCREEN.blit(label3, (10, 630)) SCREEN.blit(label3, (10, 630))
SCREEN.blit(label4, (10, 655))
# pygame.display.flip() # pygame.display.flip()