161 lines
4.5 KiB
Python
161 lines
4.5 KiB
Python
# Import the pygame module
|
|
import pygame
|
|
# Import pygame.locals for easier access to key coordinates
|
|
from pygame.locals import (
|
|
K_UP,
|
|
K_LEFT,
|
|
K_RIGHT,
|
|
K_ESCAPE,
|
|
KEYDOWN,
|
|
QUIT
|
|
)
|
|
|
|
|
|
# Import other files from project
|
|
import field as F
|
|
import node as N
|
|
import plant as P
|
|
import src.colors as C
|
|
import src.dimensions as D
|
|
import AI.GeneticAlgorithm as ga
|
|
import AI.neural_network as nn
|
|
import tractor as T
|
|
from src import mapschema as maps
|
|
|
|
if __name__ == "__main__":
|
|
# Initialize pygame
|
|
pygame.init()
|
|
|
|
# Name the window
|
|
pygame.display.set_caption("Inteligentny Traktor")
|
|
|
|
# Create the screen object
|
|
# The size is determined by the constant SCREEN_WIDTH and SCREEN_HEIGHT
|
|
screen = pygame.display.set_mode((D.SCREEN_WIDTH, D.SCREEN_HEIGHT))
|
|
|
|
# Define the map of the field
|
|
mapschema = maps.createField()
|
|
|
|
# Create field array
|
|
field = []
|
|
|
|
# Populate the field array
|
|
for row in range(D.GSIZE):
|
|
field.append([])
|
|
for column in range(D.GSIZE):
|
|
fieldbit = F.Field(row, column, mapschema[column][row])
|
|
field[row].append(fieldbit)
|
|
|
|
# genetic_algorithm_setup(field)
|
|
num_of_plants = 0
|
|
plant_pops = []
|
|
best_plant_pop = []
|
|
|
|
goal_gen = 100
|
|
best_plant_pop, plant_pops, num_of_plants, fitness = ga.genetic_algorithm_setup(field, plant_pops, goal_gen)
|
|
|
|
net = nn.Net()
|
|
nn.load_network_from_structure(net)
|
|
net.eval()
|
|
|
|
# Create Tractor object
|
|
tractor = T.Tractor(field, [0, 0])
|
|
|
|
# Define the map of plants
|
|
mapschema = maps.createPlants()
|
|
|
|
# Create plants array
|
|
plants = []
|
|
|
|
# Populate the plants array
|
|
for row in range(D.GSIZE):
|
|
plants.append([])
|
|
for column in range(D.GSIZE):
|
|
if best_plant_pop[column][row] != "":
|
|
plantbit = P.Plant(field[row][column], best_plant_pop[column][row])
|
|
plants[row].append(plantbit)
|
|
else:
|
|
plants[row].append(0)
|
|
|
|
# Create list for tractor instructions
|
|
path = []
|
|
|
|
# Variable to keep the main loop running
|
|
RUNNING = True
|
|
|
|
# Variable conroling timed eventes
|
|
TICKER = 0
|
|
|
|
# Initialize clock
|
|
clock = pygame.time.Clock()
|
|
|
|
# Main loop
|
|
while RUNNING:
|
|
|
|
for event in pygame.event.get():
|
|
# Did the user hit a key?
|
|
if event.type == KEYDOWN:
|
|
# Was it the Escape key? If so, stop the loop.
|
|
if event.key == K_ESCAPE:
|
|
RUNNING = False
|
|
# Did the user click the window close button? If so, stop the loop.
|
|
elif event.type == QUIT:
|
|
RUNNING = False
|
|
|
|
# Create key Node that will be used to calculate tractor instructions
|
|
processor = N.Node(field, tractor.position, tractor.direction)
|
|
|
|
# If path is empty or nonexistent, create new one
|
|
if path is None or len(path) == 0:
|
|
path = processor.findPathToPlant()
|
|
|
|
# control tractor by poping instructions from path list
|
|
if path is not None:
|
|
if path[0] == "move":
|
|
tractor.move()
|
|
elif path[0] == "left":
|
|
tractor.rotate_left()
|
|
elif path[0] == "right":
|
|
tractor.rotate_right()
|
|
elif path[0] == "hydrate":
|
|
tractor.hydrate(field)
|
|
elif path[0] == "fertilize":
|
|
if plants[tractor.position[1]][tractor.position[0]]:
|
|
tractor.fertilize(field, plants, nn.result_from_network(net, plants[tractor.position[0]][tractor.position[1]].testimage))
|
|
path.pop(0)
|
|
|
|
|
|
# Set the screen background
|
|
screen.fill(C.DBROWN)
|
|
|
|
# Draw the field
|
|
for row in range(D.GSIZE):
|
|
for column in range(D.GSIZE):
|
|
screen.blit(field[row][column].surf, field[row][column].rect)
|
|
|
|
# Draw the tactor
|
|
screen.blit(tractor.surf, tractor.rect)
|
|
|
|
# Plants grow with every 10th tick, then they are drawn
|
|
for row in plants:
|
|
for plant in row:
|
|
if plant != 0:
|
|
plant.tick()
|
|
plant.grow()
|
|
screen.blit(plant.surf, plant.rect)
|
|
|
|
# Field are drying with every 100th tick
|
|
if TICKER == 0:
|
|
for row in range(D.GSIZE):
|
|
for column in range(D.GSIZE):
|
|
field[row][column].dehydrate()
|
|
|
|
# Increment ticker
|
|
TICKER = (TICKER + 1) % 100
|
|
|
|
# Update the screen
|
|
pygame.display.flip()
|
|
|
|
# Ensure program maintains a stable framerate
|
|
clock.tick(35)
|