Reorganising files:

- added AI dictionary with AI classes and functions
- added src directory with raw data or simple classes
- removed unused libraries
This commit is contained in:
Lewy 2021-06-14 23:54:30 +02:00
parent 3067eda937
commit f993a577f4
61 changed files with 661 additions and 682 deletions

87
AI/decision_tree.py Normal file
View File

@ -0,0 +1,87 @@
# used in Plant
def decision_tree(plant):
if plant.field.hydration == 4:
if plant.is_healthy == 1:
if plant.field.tractor_there == 0:
if plant.ticks == 0:
return 0
elif plant.ticks == 1:
return 1
elif plant.field.tractor_there == 1:
return 0
elif plant.is_healthy == 0:
return 0
elif plant.field.hydration == 2:
if plant.species == "sorrel":
if plant.ticks == 1:
if plant.is_healthy == 1:
return 1
elif plant.is_healthy == 0:
return 0
elif plant.ticks == 0:
return 0
elif plant.species == "potato":
return 0
elif plant.species == "wheat":
return 0
elif plant.species == "strawberry":
return 0
elif plant.field.hydration == 1:
if plant.species == "potato":
return 0
elif plant.species == "strawberry":
if plant.ticks == 1:
return -1
elif plant.ticks == 0:
return 0
elif plant.species == "wheat":
return 0
elif plant.species == "sorrel":
if plant.is_healthy == 0:
return 0
elif plant.is_healthy == 1:
if plant.field.tractor_there == 0:
if plant.ticks == 0:
return 0
elif plant.ticks == 1:
return 1
elif plant.field.tractor_there == 1:
return 0
elif plant.field.hydration == 3:
if plant.ticks == 1:
if plant.field.tractor_there == 0:
if plant.is_healthy == 1:
if plant.species == "potato":
if plant.field.fertility == 1:
return 1
elif plant.field.fertility == 0:
return 0
elif plant.species == "strawberry":
return 1
elif plant.species == "sorrel":
return 1
elif plant.species == "wheat":
return 1
elif plant.is_healthy == 0:
return 0
elif plant.field.tractor_there == 1:
return 0
elif plant.ticks == 0:
return 0
elif plant.field.hydration == 5:
if plant.field.tractor_there == 1:
return 0
elif plant.field.tractor_there == 0:
if plant.is_healthy == 0:
return 0
elif plant.is_healthy == 1:
if plant.ticks == 1:
return 1
elif plant.ticks == 0:
return 0
elif plant.field.hydration == 0:
if plant.ticks == 0:
return 0
elif plant.ticks == 1:
return -1

View File

@ -1,16 +1,7 @@
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as f
import torch.optim as optim
import numpy as np
from matplotlib.pyplot import imshow
import os
import PIL import PIL
import numpy as np import torchvision.transforms as transforms
import neural_network
from matplotlib.pyplot import imshow from AI import neural_network
# Create the model # Create the model
model = neural_network.Net() model = neural_network.Net()
@ -22,10 +13,10 @@ neural_network.load_network_from_structure(model)
transform = transforms.Compose([neural_network.Negative(), transforms.ToTensor()]) transform = transforms.Compose([neural_network.Negative(), transforms.ToTensor()])
# load your image(s) # load your image(s)
img = PIL.Image.open('test\\0_100.jpg') img = PIL.Image.open('../src/test/0_100.jpg')
img2 = PIL.Image.open('test\\1_100.jpg') img2 = PIL.Image.open('../src/test/1_100.jpg')
img3 = PIL.Image.open('test\\4_100.jpg') img3 = PIL.Image.open('../src/test/4_100.jpg')
img4 = PIL.Image.open('test\\5_100.jpg') img4 = PIL.Image.open('../src/test/5_100.jpg')
# Transform # Transform
input = transform(img) input = transform(img)

View File

@ -1,15 +1,18 @@
from cases import *
from collections import Counter
import operator
from types import prepare_class
import numpy as np
import copy import copy
import operator
from collections import Counter
import numpy as np
from src.cases import *
class Node: class Node:
def __init__(self, Class, tag=None): def __init__(self, Class, tag=None):
self.Class = Class self.Class = Class
self.childs = [] self.childs = []
def classes_of_cases(cases): def classes_of_cases(cases):
classes = [] classes = []
for case in cases: for case in cases:
@ -17,6 +20,7 @@ def classes_of_cases (cases):
classes.append(case.Class) classes.append(case.Class)
return classes return classes
def count_classes(cases): def count_classes(cases):
classes = [] classes = []
for case in cases: for case in cases:
@ -24,6 +28,7 @@ def count_classes (cases):
c = Counter(classes) c = Counter(classes)
return max(c.items(), key=operator.itemgetter(1))[0] return max(c.items(), key=operator.itemgetter(1))[0]
def chose_attribute(cases, attributes): def chose_attribute(cases, attributes):
a = "" a = ""
max = float("-inf") max = float("-inf")
@ -33,6 +38,7 @@ def chose_attribute (cases, attributes):
a = attribute a = attribute
return a return a
def I(cases): def I(cases):
i = 0 i = 0
all = len(cases) all = len(cases)
@ -45,6 +51,7 @@ def I (cases):
i -= (noc / all) * np.log2(noc / all) i -= (noc / all) * np.log2(noc / all)
return i return i
def E(cases, attribute): def E(cases, attribute):
e = 0 e = 0
values = [] values = []
@ -95,6 +102,7 @@ def treelearn(cases, attributes, default_class):
return t return t
def pretty_print(root, n): def pretty_print(root, n):
if len(root.childs) == 0: if len(root.childs) == 0:
for _ in range(n): for _ in range(n):
@ -114,9 +122,3 @@ def pretty_print(root, n):
tree = treelearn(cases, attributes, 0) tree = treelearn(cases, attributes, 0)
pretty_print(tree, 0) pretty_print(tree, 0)

View File

@ -1,20 +1,18 @@
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as f
import torch.optim as optim
import numpy as np
from matplotlib.pyplot import imshow
import os
import PIL import PIL
import numpy as np import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from matplotlib.pyplot import imshow from matplotlib.pyplot import imshow
def to_negative(img): def to_negative(img):
img = PIL.ImageOps.invert(img) img = PIL.ImageOps.invert(img)
return img return img
class Negative(object): class Negative(object):
def __init__(self): def __init__(self):
pass pass
@ -22,10 +20,12 @@ class Negative(object):
def __call__(self, img): def __call__(self, img):
return to_negative(img) return to_negative(img)
def plotdigit(image): def plotdigit(image):
img = np.reshape(image, (-1, 100)) img = np.reshape(image, (-1, 100))
imshow(img, cmap='Greys') imshow(img, cmap='Greys')
transform = transforms.Compose([Negative(), transforms.ToTensor()]) transform = transforms.Compose([Negative(), transforms.ToTensor()])
train_set = torchvision.datasets.ImageFolder(root='train', transform=transform) train_set = torchvision.datasets.ImageFolder(root='train', transform=transform)
classes = ("apple", "potato") classes = ("apple", "potato")
@ -35,6 +35,7 @@ train_loader = torch.utils.data.DataLoader(train_set, batch_size=BATCH_SIZE, shu
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
class Net(nn.Module): class Net(nn.Module):
def __init__(self): def __init__(self):
super(Net, self).__init__() super(Net, self).__init__()
@ -54,6 +55,7 @@ class Net(nn.Module):
logits = self.linear_relu_stack(x).to(device) logits = self.linear_relu_stack(x).to(device)
return logits return logits
def training_network(): def training_network():
net = Net() net = Net()
net = net.to(device) net = net.to(device)
@ -100,4 +102,3 @@ def load_network_from_structure(network):
if __name__ == "__main__": if __name__ == "__main__":
print(torch.cuda.is_available()) print(torch.cuda.is_available())
training_network() training_network()

View File

@ -1,156 +0,0 @@
# 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 tractor as T
import plant as P
import colors as C
import dimensions as D
import node as N
import mapschema as maps
# 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)
# Create Tractor object
tractor = T.Tractor(field, [0,0])
# Define the map of plants
mapschema = maps.createPlants()
# Createt plants array
plants = []
# Populate the plants array
for row in range(D.GSIZE):
plants.append([])
for column in range(D.GSIZE):
if mapschema[column][row] != 0:
plantbit = P.Plant(field[row][column], mapschema[column][row])
plants[row].append(plantbit)
# 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:
# Look at every event in the queue
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()
path.pop(0)
elif path[0] =="left":
tractor.rotate_left()
path.pop(0)
elif path[0] == "right":
tractor.rotate_right()
path.pop(0)
elif path[0] == "hydrate":
tractor.hydrate(field)
path.pop(0)
else:
path.pop(0)
# Get all keys pressed at a time CURRENTLY UNUSED
pressed_keys = pygame.key.get_pressed()
# control tractor with pressed keys CURRENTLY UNUSED
if pressed_keys[K_UP]:
tractor.move()
elif pressed_keys[K_LEFT]:
tractor.rotate_left()
elif pressed_keys[K_RIGHT]:
tractor.rotate_right()
# 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:
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(8)

259
cases.py
View File

@ -1,259 +0,0 @@
class Case:
def __init__(self, values, attributes, Class):
self.values = values
self.attributes = attributes
self.Class = Class
attributes = ["field.hydration", "field.fertility", "species", "ticks", "is_healthy", "field.tractor_there"]
cases = [Case([4, 0, "potato", 0, 1, 0], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([4, 1, "wheat", 0, 0, 1], attributes, 0),
Case([1, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 1, "potato", 0, 0, 1], attributes, 0),
Case([2, 0, "potato", 0, 1, 0], attributes, 0),
Case([1, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([1, 0, "wheat", 1, 1, 1], attributes, 0),
Case([2, 0, "wheat", 1, 0, 1], attributes, 0),
Case([1, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "potato", 1, 1, 0], attributes, 1),
Case([2, 1, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 0, "wheat", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 1], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([0, 1, "sorrel", 0, 1, 1], attributes, 0),
Case([0, 1, "strawberry", 1, 1, 0], attributes, -1),
Case([2, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([4, 0, "wheat", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 0, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 0], attributes, -1),
Case([4, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([3, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([3, 1, "potato", 1, 0, 1], attributes, 0),
Case([4, 1, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([2, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([4, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 0], attributes, 0),
Case([4, 1, "sorrel", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([5, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "wheat", 1, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([4, 0, "potato", 0, 0, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([0, 0, "potato", 1, 1, 1], attributes, -1),
Case([4, 0, "strawberry", 1, 1, 1], attributes, 0),
Case([2, 1, "strawberry", 1, 0, 1], attributes, 0),
Case([2, 1, "wheat", 0, 0, 1], attributes, 0),
Case([2, 1, "sorrel", 1, 1, 0], attributes, 1),
Case([1, 0, "potato", 1, 0, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 1], attributes, -1),
Case([0, 1, "wheat", 0, 0, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 0], attributes, 0),
Case([0, 0, "sorrel", 1, 1, 0], attributes, -1),
Case([2, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 1], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([2, 1, "wheat", 0, 0, 1], attributes, 0),
Case([3, 0, "potato", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 1, 1, 1], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 0, "potato", 1, 1, 0], attributes, 1),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([2, 1, "potato", 1, 1, 1], attributes, 0),
Case([5, 0, "strawberry", 1, 1, 0], attributes, 1),
Case([5, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 0, "wheat", 1, 1, 0], attributes, 1),
Case([2, 0, "potato", 1, 0, 0], attributes, 0),
Case([3, 1, "wheat", 0, 1, 0], attributes, 0),
Case([3, 0, "potato", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 1], attributes, -1),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([2, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 1], attributes, 0),
Case([3, 1, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 1, "wheat", 1, 0, 1], attributes, 0),
Case([5, 0, "potato", 1, 0, 1], attributes, 0),
Case([3, 0, "potato", 0, 0, 1], attributes, 0),
Case([1, 0, "wheat", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([4, 0, "potato", 0, 1, 0], attributes, 0),
Case([0, 0, "strawberry", 0, 0, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([4, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "strawberry", 1, 1, 0], attributes, -1),
Case([5, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([5, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([3, 1, "potato", 1, 0, 1], attributes, 0),
Case([1, 0, "sorrel", 0, 0, 0], attributes, 0),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([0, 0, "wheat", 0, 0, 1], attributes, 0),
Case([1, 0, "potato", 0, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 0, "strawberry", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([1, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([4, 0, "wheat", 0, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 0, "sorrel", 1, 0, 1], attributes, -1),
Case([1, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([2, 1, "potato", 0, 0, 0], attributes, 0),
Case([3, 1, "strawberry", 1, 1, 0], attributes, 1),
Case([1, 0, "sorrel", 1, 1, 1], attributes, 0),
Case([5, 1, "strawberry", 1, 1, 0], attributes, 1),
Case([2, 0, "wheat", 1, 1, 1], attributes, 0),
Case([5, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 1], attributes, 0),
Case([1, 1, "potato", 0, 1, 0], attributes, 0),
Case([4, 0, "potato", 1, 1, 0], attributes, 1),
Case([2, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([0, 1, "potato", 0, 0, 1], attributes, 0),
Case([3, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([4, 0, "wheat", 1, 0, 1], attributes, 0),
Case([5, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([1, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([2, 1, "potato", 1, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([4, 0, "wheat", 1, 1, 0], attributes, 1),
Case([0, 0, "sorrel", 0, 1, 0], attributes, 0),
Case([2, 0, "wheat", 0, 0, 1], attributes, 0),
Case([0, 1, "potato", 1, 0, 1], attributes, -1),
Case([0, 1, "sorrel", 1, 0, 1], attributes, -1),
Case([1, 1, "potato", 0, 0, 1], attributes, 0),
Case([3, 0, "sorrel", 1, 1, 1], attributes, 0),
Case([0, 0, "potato", 1, 0, 1], attributes, -1),
Case([4, 0, "potato", 0, 0, 1], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([5, 0, "potato", 0, 1, 1], attributes, 0),
Case([2, 0, "potato", 0, 0, 0], attributes, 0),
Case([0, 1, "potato", 1, 0, 0], attributes, -1),
Case([1, 0, "potato", 0, 0, 1], attributes, 0),
Case([4, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "potato", 1, 1, 1], attributes, -1),
Case([5, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([0, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([1, 0, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([1, 1, "potato", 0, 0, 1], attributes, 0),
Case([0, 0, "wheat", 0, 0, 1], attributes, 0),
Case([4, 1, "sorrel", 1, 1, 1], attributes, 0),
Case([5, 1, "wheat", 0, 0, 1], attributes, 0),
Case([5, 1, "strawberry", 0, 0, 0], attributes, 0),
Case([4, 1, "wheat", 0, 0, 1], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "potato", 1, 1, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 0, 0], attributes, -1),
Case([5, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([0, 0, "potato", 0, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([4, 0, "strawberry", 0, 0, 1], attributes, 0),
Case([2, 0, "potato", 1, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([1, 1, "wheat", 1, 1, 0], attributes, 0),
Case([3, 0, "potato", 0, 1, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 1], attributes, 0),
Case([3, 1, "wheat", 0, 0, 0], attributes, 0),
Case([3, 1, "wheat", 0, 0, 0], attributes, 0),
Case([1, 0, "wheat", 0, 1, 1], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 0, 0, 1], attributes, 0),
Case([2, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 0], attributes, 1),
Case([3, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 0, "wheat", 0, 0, 1], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 1, 0], attributes, 1),
Case([2, 0, "wheat", 0, 1, 0], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "potato", 1, 1, 0], attributes, 0),
Case([1, 1, "potato", 0, 0, 0], attributes, 0),
Case([2, 1, "potato", 0, 1, 0], attributes, 0),
Case([2, 1, "wheat", 0, 1, 0], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([2, 0, "wheat", 1, 1, 1], attributes, 0),
Case([5, 0, "wheat", 1, 1, 0], attributes, 1),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([0, 1, "potato", 0, 0, 0], attributes, 0),
Case([5, 1, "strawberry", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 0], attributes, 0),
Case([5, 1, "sorrel", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 1, 0, 0], attributes, 0),
Case([5, 0, "strawberry", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 1, 0, 1], attributes, 0),
Case([2, 0, "potato", 1, 0, 1], attributes, 0),
Case([3, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 0, 1, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([3, 0, "potato", 0, 0, 1], attributes, 0),
Case([2, 1, "strawberry", 1, 1, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([4, 1, "wheat", 1, 0, 1], attributes, 0),
Case([2, 0, "potato", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([0, 1, "wheat", 1, 1, 0], attributes, -1),
Case([5, 1, "wheat", 1, 0, 0], attributes, 0),
Case([2, 0, "potato", 0, 0, 0], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([4, 1, "potato", 0, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([1, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([3, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([5, 1, "wheat", 1, 0, 0], attributes, 0),
Case([4, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([2, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 1, "wheat", 0, 1, 0], attributes, 0),
Case([5, 0, "potato", 1, 1, 0], attributes, 1),
Case([3, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([5, 1, "strawberry", 0, 0, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([0, 0, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 1, 1, 0], attributes, 1),
Case([0, 1, "potato", 0, 1, 0], attributes, 0),
Case([4, 1, "strawberry", 1, 1, 1], attributes, 0),
Case([0, 0, "wheat", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 1, 1, 0], attributes, 1)]

View File

@ -1,6 +1,8 @@
import pygame import pygame
from colors import *
from dimensions import * from src.colors import *
from src.dimensions import *
class Field(pygame.sprite.Sprite): class Field(pygame.sprite.Sprite):
def __init__(self, row, column, field_type): def __init__(self, row, column, field_type):
@ -30,30 +32,16 @@ class Field(pygame.sprite.Sprite):
def hydrate(self): def hydrate(self):
if self.field_type == "soil" and self.hydration <= 5: if self.field_type == "soil" and self.hydration <= 5:
self.hydration += 1 self.hydration += 1
if self.hydration == 0:
self.surf.fill(BROWN0) # color field to it's hydration value
if self.hydration == 1: self.surf.fill(eval('BROWN' + str(self.hydration)))
self.surf.fill(BROWN1)
if self.hydration == 2:
self.surf.fill(BROWN2)
if self.hydration == 3:
self.surf.fill(BROWN3)
if self.hydration == 4 or self.hydration == 5:
self.surf.fill(BROWN4)
def dehydrate(self): def dehydrate(self):
if self.field_type == "soil" and self.hydration > 0: if self.field_type == "soil" and self.hydration > 0:
self.hydration -= 1 self.hydration -= 1
if self.hydration == 0:
self.surf.fill(BROWN0) # color field to it's hydration value
if self.hydration == 1: self.surf.fill(eval('BROWN' + str(self.hydration)))
self.surf.fill(BROWN1)
if self.hydration == 2:
self.surf.fill(BROWN2)
if self.hydration == 3:
self.surf.fill(BROWN3)
if self.hydration == 4 or self.hydration == 5:
self.surf.fill(BROWN4)
def free(self): def free(self):
self.planted = 0 self.planted = 0

151
main.py Normal file
View File

@ -0,0 +1,151 @@
# 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 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)
# Create Tractor object
tractor = T.Tractor(field, [0, 0])
# Define the map of plants
mapschema = maps.createPlants()
# Createt plants array
plants = []
# Populate the plants array
for row in range(D.GSIZE):
plants.append([])
for column in range(D.GSIZE):
if mapschema[column][row] != 0:
plantbit = P.Plant(field[row][column], mapschema[column][row])
plants[row].append(plantbit)
# 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:
# Look at every event in the queue
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)
path.pop(0)
# Get all keys pressed at a time CURRENTLY UNUSED
pressed_keys = pygame.key.get_pressed()
# control tractor with pressed keys CURRENTLY UNUSED
if pressed_keys[K_UP]:
tractor.move()
elif pressed_keys[K_LEFT]:
tractor.rotate_left()
elif pressed_keys[K_RIGHT]:
tractor.rotate_right()
# 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:
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(8)

View File

@ -1,27 +0,0 @@
def createField():
field = [["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "road", "road", "road", "road", "road"],
["rocks", "rocks", "rocks", "rocks", "soil", "road", "soil", "soil", "rocks", "soil"],
["soil", "soil", "soil", "soil", "soil", "road", "rocks", "rocks", "soil", "soil"],
["soil", "soil", "soil", "pond", "rocks", "road", "rocks", "soil", "soil", "rocks"],
["rocks", "pond", "pond", "pond", "pond", "road", "rocks", "soil", "soil", "rocks"],
["road", "road", "road", "road", "road", "road", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "rocks", "rocks"],
["soil", "soil", "soil", "soil", "soil", "rocks", "soil", "rocks", "rocks", "soil"]
]
return field
def createPlants():
field = [["wheat", "wheat", "wheat", "wheat", "wheat", "wheat", 0, "strawberry", "strawberry", "strawberry"],
["wheat", "wheat", "wheat", "wheat", "wheat", "wheat", 0, "strawberry", "strawberry", "strawberry"],
["wheat", "wheat", "wheat", "wheat", 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
["wheat", "wheat", "wheat", "wheat", 0, 0, 0, 0, 0, 0],
["wheat", "wheat", "wheat", 0, 0, 0, 0, "potato", "potato", 0],
[0, 0, 0, 0, 0, 0, 0, "potato", "potato", 0],
[0, 0, 0, 0, 0, 0, 0, "potato", "potato", "potato"],
["strawberry", "strawberry", "strawberry", "strawberry", "strawberry", 0, 0, "potato", 0, 0],
["strawberry", "strawberry", "strawberry", "strawberry", "strawberry", 0, 0, 0, 0, 0]
]
return field

19
node.py
View File

@ -1,10 +1,12 @@
from dimensions import *
import heapq import heapq
from src.dimensions import *
def getTotalCost(x): def getTotalCost(x):
return x.totalCost return x.totalCost
def showPath(node, goal): def showPath(node, goal):
path = node.findPath(goal) path = node.findPath(goal)
for x in path: for x in path:
@ -16,8 +18,10 @@ def showPath(node, goal):
def succesor(node): def succesor(node):
succesors = [] succesors = []
if node.position[0]+node.rotation[0] in range(0,GSIZE) and node.position[1]+node.rotation[1] in range(0,GSIZE): if node.position[0] + node.rotation[0] in range(0, GSIZE) and node.position[1] + node.rotation[1] in range(0,
child = Node(node.field, [node.position[0]+node.rotation[0], node.position[1]+node.rotation[1]], node.rotation) GSIZE):
child = Node(node.field, [node.position[0] + node.rotation[0], node.position[1] + node.rotation[1]],
node.rotation)
child.action = "move" child.action = "move"
succesors.append(child) succesors.append(child)
if node.rotation == [1, 0]: if node.rotation == [1, 0]:
@ -50,7 +54,8 @@ def succesor (node):
succesors.append(child) succesors.append(child)
return succesors return succesors
class Node():
class Node:
def __init__(self, field, position, rotation): def __init__(self, field, position, rotation):
self.parent = 0 self.parent = 0
self.startCost = 0 self.startCost = 0
@ -131,7 +136,8 @@ class Node():
closedList.append(currentNode) closedList.append(currentNode)
if currentNode.field[currentNode.position[0]][currentNode.position[1]].planted and currentNode.field[currentNode.position[0]][currentNode.position[1]].hydration < 2: if currentNode.field[currentNode.position[0]][currentNode.position[1]].planted and \
currentNode.field[currentNode.position[0]][currentNode.position[1]].hydration < 2:
path = [] path = []
for _ in range(currentNode.field[currentNode.position[0]][currentNode.position[1]].hydration, 4): for _ in range(currentNode.field[currentNode.position[0]][currentNode.position[1]].hydration, 4):
path.append("hydrate") path.append("hydrate")
@ -154,7 +160,8 @@ class Node():
continue continue
child.parent = currentNode child.parent = currentNode
child.startCost = currentNode.startCost + child.field[child.position[0]][child.position[1]].moveCost child.startCost = currentNode.startCost + child.field[child.position[0]][child.position[1]].moveCost
child.heuristic = abs(startNode.position[0]-child.position[0]) + abs(startNode.position[1]-child.position[1]) child.heuristic = abs(startNode.position[0] - child.position[0]) + abs(
startNode.position[1] - child.position[1])
child.totalCost = child.startCost + child.heuristic child.totalCost = child.startCost + child.heuristic
for openNode in openList: for openNode in openList:

View File

@ -1,7 +1,7 @@
import pygame from AI.decision_tree import *
from colors import * from src.dimensions import *
from dimensions import * from src.sprites import *
from sprites import *
class Plant(pygame.sprite.Sprite): class Plant(pygame.sprite.Sprite):
def __init__(self, field, species): def __init__(self, field, species):
@ -40,90 +40,7 @@ class Plant(pygame.sprite.Sprite):
self.ticks = 0 self.ticks = 0
def dtree(self): def dtree(self):
if self.field.hydration == 4: decision_tree(self)
if self.is_healthy == 1:
if self.field.tractor_there == 0:
if self.ticks == 0:
return 0
elif self.ticks == 1:
return 1
elif self.field.tractor_there == 1:
return 0
elif self.is_healthy == 0:
return 0
elif self.field.hydration == 2:
if self.species == "sorrel":
if self.ticks == 1:
if self.is_healthy == 1:
return 1
elif self.is_healthy == 0:
return 0
elif self.ticks == 0:
return 0
elif self.species == "potato":
return 0
elif self.species == "wheat":
return 0
elif self.species == "strawberry":
return 0
elif self.field.hydration == 1:
if self.species == "potato":
return 0
elif self.species == "strawberry":
if self.ticks == 1:
return -1
elif self.ticks == 0:
return 0
elif self.species == "wheat":
return 0
elif self.species == "sorrel":
if self.is_healthy == 0:
return 0
elif self.is_healthy == 1:
if self.field.tractor_there == 0:
if self.ticks == 0:
return 0
elif self.ticks == 1:
return 1
elif self.field.tractor_there == 1:
return 0
elif self.field.hydration == 3:
if self.ticks == 1:
if self.field.tractor_there == 0:
if self.is_healthy == 1:
if self.species == "potato":
if self.field.fertility == 1:
return 1
elif self.field.fertility == 0:
return 0
elif self.species == "strawberry":
return 1
elif self.species == "sorrel":
return 1
elif self.species == "wheat":
return 1
elif self.is_healthy == 0:
return 0
elif self.field.tractor_there == 1:
return 0
elif self.ticks == 0:
return 0
elif self.field.hydration == 5:
if self.field.tractor_there == 1:
return 0
elif self.field.tractor_there == 0:
if self.is_healthy == 0:
return 0
elif self.is_healthy == 1:
if self.ticks == 1:
return 1
elif self.ticks == 0:
return 0
elif self.field.hydration == 0:
if self.ticks == 0:
return 0
elif self.ticks == 1:
return -1
def update(self): def update(self):
if self.growth == 0: if self.growth == 0:

260
src/cases.py Normal file
View File

@ -0,0 +1,260 @@
class Case:
def __init__(self, values, attributes, Class):
self.values = values
self.attributes = attributes
self.Class = Class
attributes = ["field.hydration", "field.fertility", "species", "ticks", "is_healthy", "field.tractor_there"]
cases = [Case([4, 0, "potato", 0, 1, 0], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([4, 1, "wheat", 0, 0, 1], attributes, 0),
Case([1, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 1, "potato", 0, 0, 1], attributes, 0),
Case([2, 0, "potato", 0, 1, 0], attributes, 0),
Case([1, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([1, 0, "wheat", 1, 1, 1], attributes, 0),
Case([2, 0, "wheat", 1, 0, 1], attributes, 0),
Case([1, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "potato", 1, 1, 0], attributes, 1),
Case([2, 1, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 0, "wheat", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 1], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([0, 1, "sorrel", 0, 1, 1], attributes, 0),
Case([0, 1, "strawberry", 1, 1, 0], attributes, -1),
Case([2, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([4, 0, "wheat", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 0, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 0], attributes, -1),
Case([4, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([3, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([3, 1, "potato", 1, 0, 1], attributes, 0),
Case([4, 1, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([2, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([4, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 0], attributes, 0),
Case([4, 1, "sorrel", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([5, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "wheat", 1, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([4, 0, "potato", 0, 0, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([0, 0, "potato", 1, 1, 1], attributes, -1),
Case([4, 0, "strawberry", 1, 1, 1], attributes, 0),
Case([2, 1, "strawberry", 1, 0, 1], attributes, 0),
Case([2, 1, "wheat", 0, 0, 1], attributes, 0),
Case([2, 1, "sorrel", 1, 1, 0], attributes, 1),
Case([1, 0, "potato", 1, 0, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 1], attributes, -1),
Case([0, 1, "wheat", 0, 0, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 0], attributes, 0),
Case([0, 0, "sorrel", 1, 1, 0], attributes, -1),
Case([2, 0, "sorrel", 0, 0, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 1], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([2, 1, "wheat", 0, 0, 1], attributes, 0),
Case([3, 0, "potato", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 1, 1, 1], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 0, "potato", 1, 1, 0], attributes, 1),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([2, 1, "potato", 1, 1, 1], attributes, 0),
Case([5, 0, "strawberry", 1, 1, 0], attributes, 1),
Case([5, 0, "wheat", 0, 0, 0], attributes, 0),
Case([5, 0, "wheat", 1, 1, 0], attributes, 1),
Case([2, 0, "potato", 1, 0, 0], attributes, 0),
Case([3, 1, "wheat", 0, 1, 0], attributes, 0),
Case([3, 0, "potato", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 1], attributes, -1),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([2, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([4, 0, "strawberry", 1, 0, 1], attributes, 0),
Case([3, 1, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 1, "wheat", 1, 0, 1], attributes, 0),
Case([5, 0, "potato", 1, 0, 1], attributes, 0),
Case([3, 0, "potato", 0, 0, 1], attributes, 0),
Case([1, 0, "wheat", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([4, 0, "potato", 0, 1, 0], attributes, 0),
Case([0, 0, "strawberry", 0, 0, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([4, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "strawberry", 1, 1, 0], attributes, -1),
Case([5, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([5, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([3, 1, "potato", 1, 0, 1], attributes, 0),
Case([1, 0, "sorrel", 0, 0, 0], attributes, 0),
Case([3, 0, "wheat", 0, 1, 1], attributes, 0),
Case([0, 0, "wheat", 0, 0, 1], attributes, 0),
Case([1, 0, "potato", 0, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 0, "strawberry", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([1, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([4, 0, "wheat", 0, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 0, "sorrel", 1, 0, 1], attributes, -1),
Case([1, 0, "strawberry", 0, 1, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([2, 1, "potato", 0, 0, 0], attributes, 0),
Case([3, 1, "strawberry", 1, 1, 0], attributes, 1),
Case([1, 0, "sorrel", 1, 1, 1], attributes, 0),
Case([5, 1, "strawberry", 1, 1, 0], attributes, 1),
Case([2, 0, "wheat", 1, 1, 1], attributes, 0),
Case([5, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 1], attributes, 0),
Case([1, 1, "potato", 0, 1, 0], attributes, 0),
Case([4, 0, "potato", 1, 1, 0], attributes, 1),
Case([2, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([0, 1, "potato", 0, 0, 1], attributes, 0),
Case([3, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([4, 0, "wheat", 1, 0, 1], attributes, 0),
Case([5, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([1, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([2, 1, "potato", 1, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([4, 0, "wheat", 1, 1, 0], attributes, 1),
Case([0, 0, "sorrel", 0, 1, 0], attributes, 0),
Case([2, 0, "wheat", 0, 0, 1], attributes, 0),
Case([0, 1, "potato", 1, 0, 1], attributes, -1),
Case([0, 1, "sorrel", 1, 0, 1], attributes, -1),
Case([1, 1, "potato", 0, 0, 1], attributes, 0),
Case([3, 0, "sorrel", 1, 1, 1], attributes, 0),
Case([0, 0, "potato", 1, 0, 1], attributes, -1),
Case([4, 0, "potato", 0, 0, 1], attributes, 0),
Case([0, 0, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([5, 0, "potato", 0, 1, 1], attributes, 0),
Case([2, 0, "potato", 0, 0, 0], attributes, 0),
Case([0, 1, "potato", 1, 0, 0], attributes, -1),
Case([1, 0, "potato", 0, 0, 1], attributes, 0),
Case([4, 0, "sorrel", 1, 0, 1], attributes, 0),
Case([1, 0, "potato", 1, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([2, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "potato", 1, 1, 1], attributes, -1),
Case([5, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "strawberry", 1, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 0, 1], attributes, 0),
Case([0, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([1, 0, "potato", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([1, 1, "potato", 0, 0, 1], attributes, 0),
Case([0, 0, "wheat", 0, 0, 1], attributes, 0),
Case([4, 1, "sorrel", 1, 1, 1], attributes, 0),
Case([5, 1, "wheat", 0, 0, 1], attributes, 0),
Case([5, 1, "strawberry", 0, 0, 0], attributes, 0),
Case([4, 1, "wheat", 0, 0, 1], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "potato", 1, 1, 0], attributes, 0),
Case([0, 1, "sorrel", 1, 0, 0], attributes, -1),
Case([5, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([0, 0, "potato", 0, 0, 0], attributes, 0),
Case([0, 0, "strawberry", 1, 1, 1], attributes, -1),
Case([4, 0, "strawberry", 0, 0, 1], attributes, 0),
Case([2, 0, "potato", 1, 0, 0], attributes, 0),
Case([4, 0, "strawberry", 0, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([1, 1, "wheat", 1, 1, 0], attributes, 0),
Case([3, 0, "potato", 0, 1, 0], attributes, 0),
Case([1, 1, "wheat", 0, 1, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 1], attributes, 0),
Case([3, 1, "wheat", 0, 0, 0], attributes, 0),
Case([3, 1, "wheat", 0, 0, 0], attributes, 0),
Case([1, 0, "wheat", 0, 1, 1], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 0, 0, 1], attributes, 0),
Case([2, 1, "sorrel", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 1, 0, 0], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([5, 1, "wheat", 1, 1, 0], attributes, 1),
Case([3, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 0, "wheat", 0, 0, 1], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([1, 0, "potato", 1, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([5, 1, "potato", 1, 1, 0], attributes, 1),
Case([2, 0, "wheat", 0, 1, 0], attributes, 0),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "potato", 1, 1, 0], attributes, 0),
Case([1, 1, "potato", 0, 0, 0], attributes, 0),
Case([2, 1, "potato", 0, 1, 0], attributes, 0),
Case([2, 1, "wheat", 0, 1, 0], attributes, 0),
Case([2, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([3, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([2, 0, "wheat", 1, 1, 1], attributes, 0),
Case([5, 0, "wheat", 1, 1, 0], attributes, 1),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([0, 1, "potato", 0, 0, 0], attributes, 0),
Case([5, 1, "strawberry", 1, 1, 1], attributes, 0),
Case([4, 1, "wheat", 1, 0, 0], attributes, 0),
Case([5, 1, "sorrel", 0, 0, 1], attributes, 0),
Case([1, 1, "wheat", 1, 0, 0], attributes, 0),
Case([5, 0, "strawberry", 1, 0, 1], attributes, 0),
Case([5, 0, "wheat", 1, 0, 1], attributes, 0),
Case([2, 0, "potato", 1, 0, 1], attributes, 0),
Case([3, 1, "wheat", 1, 0, 0], attributes, 0),
Case([0, 1, "strawberry", 1, 0, 0], attributes, -1),
Case([0, 1, "strawberry", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 0, 1, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([3, 0, "potato", 0, 0, 1], attributes, 0),
Case([2, 1, "strawberry", 1, 1, 0], attributes, 0),
Case([1, 1, "sorrel", 0, 0, 0], attributes, 0),
Case([4, 1, "wheat", 1, 0, 1], attributes, 0),
Case([2, 0, "potato", 0, 1, 0], attributes, 0),
Case([5, 0, "sorrel", 0, 1, 1], attributes, 0),
Case([0, 1, "wheat", 1, 1, 0], attributes, -1),
Case([5, 1, "wheat", 1, 0, 0], attributes, 0),
Case([2, 0, "potato", 0, 0, 0], attributes, 0),
Case([2, 0, "strawberry", 0, 1, 1], attributes, 0),
Case([4, 1, "potato", 0, 1, 1], attributes, 0),
Case([0, 1, "sorrel", 1, 1, 0], attributes, -1),
Case([1, 1, "strawberry", 1, 0, 1], attributes, -1),
Case([3, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([5, 1, "wheat", 1, 0, 0], attributes, 0),
Case([4, 0, "sorrel", 1, 1, 0], attributes, 1),
Case([2, 1, "sorrel", 1, 0, 0], attributes, 0),
Case([0, 1, "wheat", 0, 1, 0], attributes, 0),
Case([5, 0, "potato", 1, 1, 0], attributes, 1),
Case([3, 1, "strawberry", 0, 1, 0], attributes, 0),
Case([5, 1, "strawberry", 0, 0, 0], attributes, 0),
Case([4, 1, "potato", 1, 1, 1], attributes, 0),
Case([5, 1, "potato", 1, 0, 1], attributes, 0),
Case([5, 1, "potato", 1, 1, 1], attributes, 0),
Case([0, 0, "sorrel", 0, 0, 0], attributes, 0),
Case([1, 1, "sorrel", 1, 1, 0], attributes, 1),
Case([0, 1, "potato", 0, 1, 0], attributes, 0),
Case([4, 1, "strawberry", 1, 1, 1], attributes, 0),
Case([0, 0, "wheat", 0, 1, 1], attributes, 0),
Case([3, 0, "wheat", 1, 1, 0], attributes, 1)]

View File

@ -6,6 +6,7 @@ BROWN1 = (160, 130, 70)
BROWN2 = (140, 110, 55) BROWN2 = (140, 110, 55)
BROWN3 = (110, 85, 40) BROWN3 = (110, 85, 40)
BROWN4 = (80, 60, 20) BROWN4 = (80, 60, 20)
BROWN5 = (80, 60, 20)
DBROWN = (65, 50, 20) DBROWN = (65, 50, 20)
LBROWN = (108, 97, 62) LBROWN = (108, 97, 62)
BLUE = (18, 93, 156) BLUE = (18, 93, 156)

28
src/mapschema.py Normal file
View File

@ -0,0 +1,28 @@
def createField():
field = [["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "road", "road", "road", "road", "road"],
["rocks", "rocks", "rocks", "rocks", "soil", "road", "soil", "soil", "rocks", "soil"],
["soil", "soil", "soil", "soil", "soil", "road", "rocks", "rocks", "soil", "soil"],
["soil", "soil", "soil", "pond", "rocks", "road", "rocks", "soil", "soil", "rocks"],
["rocks", "pond", "pond", "pond", "pond", "road", "rocks", "soil", "soil", "rocks"],
["road", "road", "road", "road", "road", "road", "rocks", "soil", "soil", "soil"],
["soil", "soil", "soil", "soil", "soil", "soil", "rocks", "soil", "rocks", "rocks"],
["soil", "soil", "soil", "soil", "soil", "rocks", "soil", "rocks", "rocks", "soil"]
]
return field
def createPlants():
field = [["wheat", "wheat", "wheat", "wheat", "wheat", "wheat", 0, "strawberry", "strawberry", "strawberry"],
["wheat", "wheat", "wheat", "wheat", "wheat", "wheat", 0, "strawberry", "strawberry", "strawberry"],
["wheat", "wheat", "wheat", "wheat", 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
["wheat", "wheat", "wheat", "wheat", 0, 0, 0, 0, 0, 0],
["wheat", "wheat", "wheat", 0, 0, 0, 0, "potato", "potato", 0],
[0, 0, 0, 0, 0, 0, 0, "potato", "potato", 0],
[0, 0, 0, 0, 0, 0, 0, "potato", "potato", "potato"],
["strawberry", "strawberry", "strawberry", "strawberry", "strawberry", 0, 0, "potato", 0, 0],
["strawberry", "strawberry", "strawberry", "strawberry", "strawberry", 0, 0, 0, 0, 0]
]
return field

View File

@ -1,4 +1,5 @@
import os import os
import pygame import pygame
# set up asset folders # set up asset folders

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -1,20 +1,8 @@
import pygame from pygame.locals import (K_c)
from pygame.locals import ( from src.dimensions import *
K_UP, from src.sprites import *
K_DOWN,
K_LEFT,
K_RIGHT,
K_ESCAPE,
K_SPACE,
K_c,
KEYDOWN,
QUIT
)
from dimensions import *
from colors import *
from sprites import *
class Tractor(pygame.sprite.Sprite): class Tractor(pygame.sprite.Sprite):
def __init__(self, field, position): def __init__(self, field, position):
@ -53,7 +41,6 @@ class Tractor(pygame.sprite.Sprite):
self.field[self.position[0]][self.position[1]].tractor_there = True self.field[self.position[0]][self.position[1]].tractor_there = True
def rotate_right(self): def rotate_right(self):
if self.direction == [1, 0]: if self.direction == [1, 0]:
self.direction = [0, 1] self.direction = [0, 1]