diff --git a/.gitignore b/.gitignore index 92c9cba..9da57d8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ pyvenv.cfg dump.rdb kivy/.buildozer/ .vscode - +pybrain/ \ No newline at end of file diff --git a/Pipfile b/Pipfile index 2c81ed7..6b26bfd 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,8 @@ ipdb = "*" [packages] pygame = "*" +deap = "*" +numpy = "*" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index a1d500c..5e160e6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9e729783b1676a1f7c9e39d75fab1737d322566c636815580677a93a1d9cd02e" + "sha256": "4264f0b1967f21ebf488bb5f545bb64df6d48c34efac23b2f8ff215e4c04e2bd" }, "pipfile-spec": 6, "requires": { @@ -16,33 +16,90 @@ ] }, "default": { - "pygame": { + "deap": { "hashes": [ - "sha256:0dc21c1463189362423cbb3a5adf405db1b7560e865a1d5e4c37ca94ca72ba41", - "sha256:1065beaa4915e0f27cea65fbe4dbef480b7ecd15662c7642e93a61167d48db34", - "sha256:120ad1260fd9df40e1d973913e3e62df275bc418c3f81c0afbe8cf0a13b43023", - "sha256:15619768b80ed73dc77818b4eae6bae0d23d6bc7129705dcde84af9e1859d26d", - "sha256:1e3a02037aecf5f651bc792c1f5ff19989949c6823a466b5a82fe77bbfa53148", - "sha256:30e4f917e7b3641ac6b5209963a105e674155cd98e17e3f0472bb4f044e78720", - "sha256:4eb7724e07b0b8ecd3d21d4f9e0ca54332ea6c90c5ebfed2e8ec8558b1958c3b", - "sha256:5b2b7325a4e77076ee6342dafac7ba7b75c48b05a25b5d102b37c93cf15e8f59", - "sha256:6935f5a3ba3c7bd94b043e13f6d4d229ba97ec3d2e22829e3c38be6a5b9d8aa8", - "sha256:7c962ba83c413fea20ad1ff8a4989396f0194d744d33b38e85b50e416b82911d", - "sha256:7da134fc9c17b3d0ac3100d1bb46139913a6e9b7c52fabdbde6fe9be1f612c35", - "sha256:81fbe388f6748b9f6989287dcc2b2fccb0b87c5119b066640b9a4ba649637ae9", - "sha256:b74e67d0af10ee6563cedcabc6ec48f5f342bd01e26f5f478727703df613e698", - "sha256:b8691d839217fc1cd1d433c153869111e8c0e1eddbf17e2a5808635c571b8391", - "sha256:b93c3af698b0e7e017d73c622ace80df9166b803723414b419bb2745982a1fe2", - "sha256:b9f5a25c9886d0b58b4dadfd99819a219128a355e659a6d1a27c226631656746", - "sha256:c6714c859e5652e04a94645bb495b61b6ec00d9f1b7b976ea952261581b196c3", - "sha256:d15e18591093f717844482b24846e42394f302f3c2d1ff02b649f9c297802576", - "sha256:ddca4355896f9c6343b4273e1e9bc7e5987aa484f4973a3a3fd29aaa8678d8a7", - "sha256:ea3660b2a43d0e299ae3a86f7a5a67334417c10869e754263896c71b048ee114", - "sha256:f46eb0b6561a4b283ab8afc2a75523d4bdb7a809eaf696d66926646dbddde43c", - "sha256:f4f81dd9086c7a948880f2454f2de0ea3ad78a7616423355d40738ba3366c159" + "sha256:01ab6067af3c86bd3a00a0d5e0c9860220c7cf412031f9cce18a6d08ec25b808", + "sha256:0dc11a5521f661a7c7f475466d932b056fbfee8447ad73b007d69ef75c924355", + "sha256:11162ae0343a25f5a8625f683ce16bad5757812d71db6b80a5ac7c25799a1a88", + "sha256:1873f5e2a55ff61dac965b55cc042b2fe5529edbd54fc0fc1061664ddb4b75db", + "sha256:19f6a60c91313cb1f39a9687bc54efab8abc599e5f81b87faedf583efc388602", + "sha256:21787af1e4a56345bbffa6d1b07f5611d3ef7b299e5e832e6ab28dbab5c5c10e", + "sha256:2f50f38ae0c82554a476d6c6013c85da4a8d7cac102edc4ec460a658200bd832", + "sha256:31ed6220068e703d3f54c53046b8f25b85a9225c64e1e50172c2172c4bd8a7fe", + "sha256:34594ba2f417ccb622b0ff54c25850fde80e12ca89fde6f242b15029e846be29", + "sha256:3603c91779c276588884321637212511962b2f0668cec56b2b5664d28f28eee7", + "sha256:5ee3cee4eac683237915bf570ede65047224ac6f392970fed029e3404935647c", + "sha256:600e95e745cee25fda8c9a67219c9f46c4661da636a5af9f5e924230e7a3aeac", + "sha256:6102d8bca425ff5d704f7631b69c22e33782e33020ce059cc88085746444ebfe", + "sha256:669840720da9c4571efd9d0efdf90267009686b7a4c43dd4ab124e33e9cc153a", + "sha256:6c5ef3b6c387cd28c7aab0297b05a9994b9c88dfd8a89236866c14703d55f9dc", + "sha256:a0a0e56bd52a262ee12f84fa883b7ec5367532b784e2a6e83b1f7126b69d2300", + "sha256:a1cc5fc4a2735ec5560ddef84f80beb84540d3221a147b53bba5e6a8718c8a55", + "sha256:b05f607041c3f8aac5364055cb9632714bc62fe93e53283fbafea9ba91e13a69", + "sha256:cd0fd7bccf7837b9e6a666b75e1c3a629fa3f5bc346cb90a9edd8cd56f085980", + "sha256:cf1e53c822526bbc418333c47f668f394b00b51fddb4f15c54d5f190b2b88f17", + "sha256:e648e1d76d5c8ecbce7f312bd174e4d2613debddd81f2a614b9023f7ad0331a0", + "sha256:f146a9a0957510b57a2b5c669a26f0b84b2d219000b5684f4827884a75ad2ea7", + "sha256:f1a0d1390e0b4f9edd4cbf2903c7d60865f43bad00de239aa066ffeda4ad7ee0", + "sha256:fe789aa74ba78549030037dc9580510ff1763ef12fdf05cb92dda74237110565" ], "index": "pypi", - "version": "==2.0.0.dev3" + "version": "==1.3.0" + }, + "numpy": { + "hashes": [ + "sha256:0b0dd8f47fb177d00fa6ef2d58783c4f41ad3126b139c91dd2f7c4b3fdf5e9a5", + "sha256:25ffe71f96878e1da7e014467e19e7db90ae7d4e12affbc73101bcf61785214e", + "sha256:26efd7f7d755e6ca966a5c0ac5a930a87dbbaab1c51716ac26a38f42ecc9bc4b", + "sha256:28b1180c758abf34a5c3fea76fcee66a87def1656724c42bb14a6f9717a5bdf7", + "sha256:2e418f0a59473dac424f888dd57e85f77502a593b207809211c76e5396ae4f5c", + "sha256:30c84e3a62cfcb9e3066f25226e131451312a044f1fe2040e69ce792cb7de418", + "sha256:4650d94bb9c947151737ee022b934b7d9a845a7c76e476f3e460f09a0c8c6f39", + "sha256:4dd830a11e8724c9c9379feed1d1be43113f8bcce55f47ea7186d3946769ce26", + "sha256:4f2a2b279efde194877aff1f76cf61c68e840db242a5c7169f1ff0fd59a2b1e2", + "sha256:62d22566b3e3428dfc9ec972014c38ed9a4db4f8969c78f5414012ccd80a149e", + "sha256:669795516d62f38845c7033679c648903200980d68935baaa17ac5c7ae03ae0c", + "sha256:75fcd60d682db3e1f8fbe2b8b0c6761937ad56d01c1dc73edf4ef2748d5b6bc4", + "sha256:9395b0a41e8b7e9a284e3be7060db9d14ad80273841c952c83a5afc241d2bd98", + "sha256:9e37c35fc4e9410093b04a77d11a34c64bf658565e30df7cbe882056088a91c1", + "sha256:a0678793096205a4d784bd99f32803ba8100f639cf3b932dc63b21621390ea7e", + "sha256:b46554ad4dafb2927f88de5a1d207398c5385edbb5c84d30b3ef187c4a3894d8", + "sha256:c867eeccd934920a800f65c6068acdd6b87e80d45cd8c8beefff783b23cdc462", + "sha256:dd0667f5be56fb1b570154c2c0516a528e02d50da121bbbb2cbb0b6f87f59bc2", + "sha256:de2b1c20494bdf47f0160bd88ed05f5e48ae5dc336b8de7cfade71abcc95c0b9", + "sha256:f1df7b2b7740dd777571c732f98adb5aad5450aee32772f1b39249c8a50386f6", + "sha256:ffca69e29079f7880c5392bf675eb8b4146479d976ae1924d01cd92b04cccbcc" + ], + "index": "pypi", + "version": "==1.17.3" + }, + "pygame": { + "hashes": [ + "sha256:17571a285e62429f5d46129862ae8a9b8dbf9541b66582d4f60a343618c0be73", + "sha256:1a341c6a73f0c7f57cd3d24e58ed015f0d4b77c84c7a048556ce708a32230eb6", + "sha256:3c3ac1f9903685b280236e7cb00acc7c151895430a8601ee29e40a8f2e25690d", + "sha256:3dda7d954c92a0f8c042c4f414416bd910045b4ed6390d8b90c8013db5e80efc", + "sha256:4271455547d41c59598aa40f425939cec1d158dccce1588e8657e36a073ba6ad", + "sha256:44cf6483466e739a04b8fef4308db040c33a9e97bd3f75835fd13c52c55ef2ef", + "sha256:5f77076c1991d7d5ff14da860fbc0251d357c140737f7e6e6c20249dc70501c2", + "sha256:814cb86c7b7ebe595fe1df867e48b0baefc58cb6d6f7dc76a8627817df827a35", + "sha256:8bfcb0f72606d37cc54f3f90302df24159850cf96c176fd959b52f72475382df", + "sha256:8ea02d61fe40b5d3feb9db186eecc925c426e889338bc2aed2996b4698f46400", + "sha256:935b1993fd1bf1543618df3891fb5c36be310a5a8415cb080721bd5762827bd2", + "sha256:96c8d5b99eb1bf321099d62d970622002aa170e6ceb3da652f60c2e82e78e2a1", + "sha256:a269db0c3876b5386497d4187246eaac0e5ccb5d97ca289965125dbe2ba94498", + "sha256:ade1ccc06f3ec07567eceac5407df8606233a34a6181c2889b0e8afa057b1515", + "sha256:aef37d5b7c92de8e3d3cb1beb154e5b825e447d1271b38bf4fbcab4ddf0afe4c", + "sha256:b12692160af44d1652e04d23ef1fa5864dd9463067753c7602b3268f135fd40d", + "sha256:cc0ff3eda290b24a2241d5c797a388b0c1e5240ebd1b6a3d67c1bc297ecb01bb", + "sha256:d1fd7189191998e30029c449174c5d33820f79cf2483571a2e53ee45074755c9", + "sha256:d26939cda57ba71da9e74f06effb5ed22de9fd1f7c130e143341cb43610f1bb3", + "sha256:dfe19aba8c76be842fc71849ec6a089b7fb957c6ee27a42eb2adc836bcbc2cbb", + "sha256:ed6dbcf6015c7413e39ecb567a5a5a41c1c01b87f31d521fa0b70f3c263b949b", + "sha256:f40862877e20c879bb53bab679f7d9266e6674f5bae02ad6227ffc0476acd567" + ], + "index": "pypi", + "version": "==2.0.0.dev4" } }, "develop": { @@ -55,17 +112,17 @@ }, "astroid": { "hashes": [ - "sha256:9b3f17b0550f82e28a6776a4e5222441f48e523b0773df4bc505bb6b7c2093b7", - "sha256:c7e2e5773d87ccc00d01c273e439386f4d6d63cce61317a79ccce5880162f9fb" + "sha256:09a3fba616519311f1af8a461f804b68f0370e100c9264a035aa7846d7852e33", + "sha256:5a79c9b4bd6c4be777424593f957c996e20beb5f74e0bc332f47713c6f675efe" ], - "version": "==2.3.0" + "version": "==2.3.2" }, "attrs": { "hashes": [ - "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", - "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], - "version": "==19.1.0" + "version": "==19.3.0" }, "backcall": { "hashes": [ @@ -186,11 +243,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:11adf3389a996a6d45cc277580d0d53e8a5afd281d0c9ec71b28e6f121463780", - "sha256:2519ad1d8038fd5fc8e770362237ad0364d16a7650fb5724af6997ed5515e3c1", - "sha256:977c6583ae813a37dc1c2e1b715892461fcbdaa57f6fc62f33a528c4886c8f55" + "sha256:46642344ce457641f28fc9d1c9ca939b63dadf8df128b86f1b9860e59c73a5e4", + "sha256:e7f8af9e3d70f514373bf41aa51bc33af12a6db3f71461ea47fea985defb2c31", + "sha256:f15af68f66e664eaa559d4ac8a928111eebd5feda0c11738b5998045224829db" ], - "version": "==2.0.9" + "version": "==2.0.10" }, "ptyprocess": { "hashes": [ @@ -208,11 +265,11 @@ }, "pylint": { "hashes": [ - "sha256:2d64b4b8fa044480b1a49d47535da53557f8f426b8c5bd6a23beb65e905101a1", - "sha256:6cbd124a1a5ed1fd3f3fed4178a6c2ba166862ea0dac6ab2ff8d9f0998b13e5c" + "sha256:7b76045426c650d2b0f02fc47c14d7934d17898779da95288a74c2a7ec440702", + "sha256:856476331f3e26598017290fd65bebe81c960e806776f324093a46b76fb2d1c0" ], "index": "pypi", - "version": "==2.4.1" + "version": "==2.4.3" }, "six": { "hashes": [ @@ -230,30 +287,35 @@ }, "traitlets": { "hashes": [ - "sha256:262089114405f22f4833be96b31e143ab906d7764a22c04c71fee0bbda4787ba", - "sha256:6ad5b30dacd5e2424c46cc94a0aeab990d98ae17d181acea2cc4272ac3409fca" + "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44", + "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7" ], - "version": "==4.3.3.dev0" + "version": "==4.3.3" }, "typed-ast": { "hashes": [ + "sha256:1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", + "sha256:48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", + "sha256:7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", + "sha256:838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", + "sha256:fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12" ], - "markers": "implementation_name == 'cpython' and python_version >= '3.7' and python_version < '3.8'", + "markers": "implementation_name == 'cpython' and python_version < '3.8'", "version": "==1.4.0" }, "wcwidth": { diff --git a/brain.py b/brain.py new file mode 100644 index 0000000..884f5c6 --- /dev/null +++ b/brain.py @@ -0,0 +1,26 @@ +import numpy as np + + +class Neural_Network(object): + # inspired from https://enlight.nyc/projects/neural-network/ + def __init__(self): + #parameters + self.inputSize = 3 + self.outputSize = 2 + self.hiddenSize = 3 + + #weights + self.W1 = np.random.randn(self.inputSize, self.hiddenSize) # weights from input to hidden layer + self.W2 = np.random.randn(self.hiddenSize, self.outputSize) # weights from hidden to output layer + + def predict(self, X): + #forward propagation through our network + self.z = np.dot(X, self.W1) # dot product of X (input) and first set of 3x2 weights + self.z2 = self.sigmoid(self.z) # activation function + self.z3 = np.dot(self.z2, self.W2) # dot product of hidden layer (z2) and second set of 3x1 weights + o = self.sigmoid(self.z3) # final activation function + return o + + def sigmoid(self, s): + # activation function + return 1/(1+np.exp(-s)) -0.5 \ No newline at end of file diff --git a/main.py b/main.py index 81142ac..621d269 100755 --- a/main.py +++ b/main.py @@ -1,25 +1,23 @@ #!/usr/bin/env python import math import pygame -from pygame.locals import HWSURFACE, DOUBLEBUF import random +import numpy as np + +from brain import Neural_Network +from maps import map1 from trigo import angle_to_vector, get_line_feats, segments_intersection, distance +from params import FLAGS, GX, GY, CELL_COLOR, CAR_SIZE, VISION_LENGTH, VISION_SPAN, THROTTLE_POWER + -FLAGS= HWSURFACE | DOUBLEBUF #| FULLSCREEN -GX = 1000 -GY = 1000 -CELL_COLOR = (80,80,80) -CAR_SIZE=25 -VISION_LENGTH = 50 -VISION_SPAN = 25 # degrees -THROTTLE_POWER = 3 pygame.init() IMG = pygame.image.load("car25.png")#.convert() + class Car(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) @@ -33,7 +31,7 @@ class Car(pygame.sprite.Sprite): self.rect = self.image.get_rect() self.rect.center = (75, GY -50) - self.speed = 5 + self.speed = 0.5 self.heading = 0 self.heading_change = 0 self.vision_length = VISION_LENGTH # line liength @@ -50,13 +48,13 @@ class Car(pygame.sprite.Sprite): self.center_sensor = None self.left_sensor = None self.right_sensor = None - self.update_sensors() self.sensors = [self.left_sensor, self.center_sensor, self.right_sensor] self.probes = [self.vision_length] *3 - self.heading_change = 0 - self.throttle = 0 + self.brain = Neural_Network() + self.update_sensors() + self.probe_brain() def update_sensors(self): center = self.rect.center @@ -77,37 +75,6 @@ class Car(pygame.sprite.Sprite): self.update_sensors() - - def update(self): - # rotate - old_center = self.rect.center - self.image = pygame.transform.rotate(self.original_image, self.heading) - self.rect = self.image.get_rect() - self.rect.center = old_center - self.update_position() - - if self.speed : - self.heading += self.heading_change / self.speed - self.heading = self.heading % 360 - - if self.throttle : - self.speed += THROTTLE_POWER - else : - self.speed -= THROTTLE_POWER - - self.speed = max(0, self.speed) - - super().update() - - - def show_features(self): - if self.draw_sensors: - pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1]) - pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1]) - pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1]) - pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2) - - def probe_lines_proximity(self, lines): # print(self.center_sensor, lines[0]) @@ -122,7 +89,52 @@ class Car(pygame.sprite.Sprite): self.probes[idx] = min(dist, self.probes[idx]) # else : # self.probes[idx] = self.vision_length * 2 - print(self.probes) + # print(self.probes) + + + def probe_brain(self): + res = self.brain.predict(np.array(self.probes)) + self.heading_change = res[0] * 10 + self.throttle = res[1] * 10 + + + def update(self): + # rotate + old_center = self.rect.center + self.image = pygame.transform.rotate(self.original_image, self.heading) + self.rect = self.image.get_rect() + self.rect.center = old_center + self.update_position() + print( + 'Speed', self.speed, + 'heading', self.heading, + 'throttle', self.throttle, + 'heading change', self.heading_change, + ) + + if self.speed : + self.heading += self.heading_change * 10 / self.speed + self.heading = self.heading % 360 + + self.speed += self.throttle #THROTTLE_POWER + # if self.throttle : + # self.speed += self.throttle #THROTTLE_POWER + # else : + # self.speed -= self.throttle #THROTTLE_POWER + + self.speed = max(0, self.speed) + + super().update() + + + def show_features(self): + if self.draw_sensors: + pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1]) + pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1]) + pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1]) + pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2) + + @@ -131,80 +143,17 @@ class Car(pygame.sprite.Sprite): screen = pygame.display.set_mode((GX, GY), FLAGS) screen.set_alpha(None) +map_lines = map1 +# print(lines) + + + all_cars = pygame.sprite.Group() -# car = Car() -# car.heading = 0 -# all_cars.add(car) -car2 = Car() -car2.heading = 0 -car2.heading_change = 30 -car2.speed = 25 -all_cars.add(car2) - -ip = segments_intersection(car2.center_sensor, car2.left_sensor) - - - - -# print(math.hypot(ip[0] - car2.rect.center[0], ip[1] - car2.rect.center[1])) - -# stress test -# for x in range(100): -# car = Car() -# car.heading=x -# car.heading_change = int(x)/30 -# car.speed = int(random.random()*6) -# all_cars.add(car) - -# lines = [ -# [ -# ( -# int(random.random()*GX), -# int(random.random()*GY) -# ),( -# int(random.random()*GX), -# int(random.random()*GY) -# ) -# ] -# for x in range(10) -# ] - -path = [ - (25, int(GY-25)), - (int(GX/2), int(GY-25)), - (int(GX/2 + 75), int(GY-150)), - (int(GX/2 + 150), int(GY-150)), - (int(GX -75), int(GY/2)), - (int(GX/2), int(GY/2 - 75)), - (int(GX/2), int(GY/2 - 150)), - (int(GX -50), int( GY/4 )), - (int(3*GX/4 - 50), int(50)), - (int(50), int(50)), - (int(100), int(GY/2)), - (25, int(GY-25)), -] - -path2 = [ - (100, int(GY-85)), - (int(GX/2 - 50 ), int(GY-85)), - (int(GX/2 + 50), int(GY-210)), - (int(GX/2 + 110), int(GY-210)), - (int(GX - 170), int(GY/2 + 30)), - (int(GX/2 - 60 ), int(GY/2 - 20)), - (int(GX/2 - 60), int(GY/2 - 200)), - (int(GX -170), int( GY/4 -20)), - (int(3*GX/4 - 100), int(120)), - (int(120), int(120)), - (int(175), int(GY/2)), - (100, int(GY-85)), -] - -lines = [[path[i], path[i+1]] for i in range(len(path)-1)] -lines2 = [[path2[i], path2[i+1]] for i in range(len(path2)-1)] - -lines = lines + lines2 -print(lines) +for x in range(1): + car = Car() + car.heading = x * 30 + 35 + all_cars.add(car) clock = pygame.time.Clock() while True : @@ -213,9 +162,10 @@ while True : all_cars.draw(screen) for c in all_cars : c.show_features() - c.probe_lines_proximity(lines) + c.probe_lines_proximity(map_lines) + c.probe_brain() - for line in lines : + for line in map_lines : pygame.draw.line(screen, (255,255,255), line[0], line[1]) # point = (int(GX/2), int(GY/2+25)) diff --git a/maps.py b/maps.py new file mode 100644 index 0000000..dc8665e --- /dev/null +++ b/maps.py @@ -0,0 +1,40 @@ +from params import GX, GY + +def generate_map_1() : + path = [ + (25, int(GY-25)), + (int(GX/2), int(GY-25)), + (int(GX/2 + 75), int(GY-150)), + (int(GX/2 + 150), int(GY-150)), + (int(GX -75), int(GY/2)), + (int(GX/2), int(GY/2 - 75)), + (int(GX/2), int(GY/2 - 150)), + (int(GX -50), int( GY/4 )), + (int(3*GX/4 - 50), int(50)), + (int(50), int(50)), + (int(100), int(GY/2)), + (25, int(GY-25)), + ] + + path2 = [ + (100, int(GY-85)), + (int(GX/2 - 50 ), int(GY-85)), + (int(GX/2 + 50), int(GY-210)), + (int(GX/2 + 110), int(GY-210)), + (int(GX - 170), int(GY/2 + 30)), + (int(GX/2 - 60 ), int(GY/2 - 20)), + (int(GX/2 - 60), int(GY/2 - 200)), + (int(GX -170), int( GY/4 -20)), + (int(3*GX/4 - 100), int(120)), + (int(120), int(120)), + (int(175), int(GY/2)), + (100, int(GY-85)), + ] + + lines = [[path[i], path[i+1]] for i in range(len(path)-1)] + lines2 = [[path2[i], path2[i+1]] for i in range(len(path2)-1)] + + lines = lines + lines2 + return lines + +map1 = generate_map_1() \ No newline at end of file diff --git a/params.py b/params.py new file mode 100644 index 0000000..79dfa8c --- /dev/null +++ b/params.py @@ -0,0 +1,11 @@ +from pygame.locals import HWSURFACE, DOUBLEBUF + +FLAGS = HWSURFACE | DOUBLEBUF #| FULLSCREEN + +GX = 1000 +GY = 1000 +CELL_COLOR = (80,80,80) +CAR_SIZE=25 +VISION_LENGTH = 50 +VISION_SPAN = 25 # degrees +THROTTLE_POWER = 3 \ No newline at end of file