Advertisement
Alexei17

Untitled

Mar 29th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.37 KB | None | 0 0
  1. import time
  2. import math
  3. import random
  4.  
  5. protectedstart = [0,0]
  6. protectedfinish = [5,5]
  7. sp = [0,5]
  8. fp = [31,31]
  9. timesToGenCircle = 300
  10.  
  11. class Cell():
  12. def __init__(self):
  13. self.val = 0
  14. self.d = -1
  15. self.mark = False
  16. self.path = False
  17.  
  18. w = 40 # width of each cell
  19.  
  20. ##DECLARATIONS
  21. #obstacles = [[0,20],
  22. #[1,25],
  23. #[0,25]
  24.  
  25.  
  26. #]
  27.  
  28. #for i in range(len(obstacles)):
  29. # grid[obstacles[i][0]][obstacles[i][1]].val = -1
  30.  
  31. def neighbourIs(x,y,arr):
  32. Break = False
  33. for dx in range(-1,2):
  34. for dy in range(-1,2):
  35. if dx+x <=31 and dx+x >= 0 and dy+y <= 31 and dy+y >=0: #look up neighbours: all dirs + curr
  36. if grid[dx+x][dy+y].val in arr:
  37. Break = True
  38.  
  39. if Break == True:
  40. break
  41. if Break == True:
  42. break
  43.  
  44. return Break
  45.  
  46.  
  47.  
  48. def drawRandomObstacles():
  49.  
  50.  
  51. width = 1
  52. height = 1
  53.  
  54. ctiles = [[0 for _ in range(height)] for _ in range(width)]
  55. #lst = []
  56.  
  57. for o in range(timesToGenCircle):
  58.  
  59. x = random.randint(0,32-width)
  60. y = random.randint(0,32-height)
  61.  
  62. #while neighbourIs(x,y,["finish",-1,"checkpoint"]) == True:
  63. # x = random.randint(0,32-width)
  64. # y = random.randint(0,32-height)
  65.  
  66. for i in range(height):
  67. for j in range(width):
  68. ctiles[i][j] = 1
  69.  
  70.  
  71.  
  72.  
  73.  
  74. for dx in range(width):
  75. for dy in range(height):
  76. if ctiles[dx][dy] == 1: #and grid[x+dx][y+dy].val == 0:
  77. grid[x+dx][y+dy].val = -1
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84. def setup():
  85. size(1280,1280)
  86.  
  87.  
  88. def draw():
  89. x,y = 0,0 # starting position
  90.  
  91. for row in grid:
  92. for col in row:
  93. if col.val == 1:
  94. fill(100,0,0) #red
  95. elif col.val == -1:
  96. fill(200) #obstacle
  97. elif col.val == "start":
  98. fill(255,0,0) #red
  99. elif col.val == "finish":
  100. fill(0,255,255) #blue
  101. elif col.val == "checkpoint":
  102. fill(120,200,195)
  103. elif col.val == 2: #cant be changed
  104. print("A")
  105.  
  106. else:
  107. fill(0,100,0)
  108. col.val = 0
  109.  
  110. if col.d != -1 and col.d!=0 and col.mark == False and col.val!=-1:
  111. fill(255-col.d,255-col.d*2,0+col.d)
  112.  
  113. if col.path == True:
  114. fill(255)
  115.  
  116. rect(y, x, w, w)
  117. x = x + w # move right
  118. y = y + w # move down
  119. x = 0 # rest to left edge
  120.  
  121.  
  122.  
  123. def drawProtected():
  124. for row in range(protectedfinish[0]):
  125. for col in range(protectedfinish[1]):
  126. grid[row][col].val = -1
  127.  
  128.  
  129. def dNeighbours(x, y, d):
  130. for dx in range(-1,2):
  131. for dy in range(-1,2):
  132. if (dx==0) != (dy==0): #look up neighbours: up, down, left, right
  133. if x+dx >=0 and x+dx <=31 and y+dy>=0 and y+dy<=31:
  134. if (grid[x+dx][y+dy].d == -1) and (grid[x+dx][y+dy].val in [0,1]):
  135. grid[x+dx][y+dy].d = d + 1
  136. if (grid[x+dx][y+dy].val == "finish"): #or (grid[x+dx][y+dy].val == "checkpoint"): <== DON'T ADD
  137. grid[x+dx][y+dy].mark = True
  138. grid[x+dx][y+dy].d = d + 1
  139. #if grid[x+dx][y+dy].d == 2:
  140. # print(x+dx,y+dy,2)
  141.  
  142.  
  143.  
  144. def analyzeSandBuildAWall(x,y, visited):
  145. fx = -1
  146. fy = -1
  147. cc = 0
  148.  
  149. for dx in range(-1,2):
  150. for dy in range(-1,2) :#look up neighbours: 8 incl. current
  151. cc+=1
  152.  
  153.  
  154. if x+dx >=0 and x+dx <=31 and y+dy>=0 and y+dy<=31:
  155.  
  156. if grid[x+dx][y+dy].path != True and grid[x+dx][y+dy].val not in [1,-1,"start","finish","checkpoint"]:
  157. #print("BUILT!")
  158. grid[x+dx][y+dy].val = -1
  159.  
  160. if (dx==0) != (dy==0): #look up neighbours: up, down, left, right
  161. #print("cc: ",cc," x:", x," y:",y," path:",grid[x+dx][y+dy].path)
  162. #print("dx:",dx," dy:",dy)
  163. if (grid[x+dx][y+dy].path == True or grid[x+dx][y+dy].val == "start") and [x+dx,y+dy] not in visited:
  164. #print("added ", [x+dx,y+dy])
  165. visited.append([x+dx,y+dy])
  166. fx = x+dx
  167. fy = y+dy
  168.  
  169.  
  170.  
  171. if grid[x][y].val in ["start","finish","checkpoint"]:
  172. for dx in range(-1,2):
  173. for dy in range(-1,2):
  174. if (dx==0) != (dy==0): #look up neighbours: up, down, left, right
  175. if x+dx >=0 and x+dx <=31 and y+dy>=0 and y+dy<=31:
  176. if grid[x+dx][y+dy].val == -1:
  177. grid[x+dx][y+dy].val = 1
  178.  
  179.  
  180.  
  181. if fx == -1 or fy == -1:
  182. return "error"
  183. else:
  184. return fx,fy,visited
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193. def analyzeAndGoToXY(x,y,d):
  194. Break = False
  195. for dx in range(-1,2):
  196. for dy in range(-1,2):
  197. if (dx==0) != (dy==0) and dx+x <=31 and dx+x >= 0 and dy+y <= 31 and dy+y >=0: #look up neighbours: up, down, left, right
  198. if grid[x+dx][y+dy].d+1 == d and grid[x+dx][y+dy].path == False:
  199. x = x+dx
  200. y = y+dy
  201. Break = True
  202. break
  203.  
  204. if Break == True:
  205. break
  206.  
  207.  
  208. return [x,y,d-1]
  209.  
  210.  
  211. def LeesAlg(startingpoint,finishingpoint, CPGen):
  212. global_err = False
  213.  
  214. #def tryToFindAnExit(startingpoint,finishingpoint):
  215. grid[finishingpoint[0]][finishingpoint[1]].val = "finish"
  216. x = startingpoint[0]
  217. y = startingpoint[1]
  218. d = 0
  219. tries = 0
  220.  
  221.  
  222. grid[x][y].d = 0
  223. grid[x][y].val = "start"
  224.  
  225. while grid[finishingpoint[0]][finishingpoint[1]].mark == False and tries<500:
  226. for x in range(32):
  227. for y in range(32):
  228. if grid[x][y].d == d:
  229. dNeighbours(x, y, d)
  230. d+=1
  231. tries+=1
  232.  
  233. #return tries, d
  234.  
  235. if tries >= 498:
  236. global_err = True
  237. print("YOU FAILED!")
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245. x = finishingpoint[0]
  246. y = finishingpoint[1]
  247. tries=0
  248.  
  249.  
  250.  
  251.  
  252. if grid[x][y].mark == True:
  253. while (x != startingpoint[0] or y != startingpoint[1]) and tries<500:
  254. xydArr = analyzeAndGoToXY(x,y,d)
  255. x = xydArr[0]
  256. y = xydArr[1]
  257. d = xydArr[2]
  258. grid[x][y].path = True
  259.  
  260.  
  261.  
  262. #print("Marked ",x,y,d)
  263. #print(startingpoint[0],startingpoint[1],grid[startingpoint[0]][startingpoint[1]].d)
  264.  
  265. #print("Req x:",startingpoint[0],"Req y:",startingpoint[1])
  266. #print("Arrived at ",x,y)
  267. tries+=1
  268.  
  269. if grid[x][y].val == "start":
  270. grid[x][y].path = False
  271.  
  272. #print("Path finished!")
  273.  
  274.  
  275.  
  276. #phase: consturct walls along path
  277. if CPGen >= 0:
  278. x = finishingpoint[0]
  279. y = finishingpoint[1]
  280. visited = []
  281. tries = 0
  282.  
  283. if grid[x][y].mark == True:
  284. while (x != startingpoint[0] or y != startingpoint[1]) and tries<500:
  285. try:
  286. xyvArr = analyzeSandBuildAWall(x,y,visited)
  287. except Exception as e:
  288. global_err = True
  289. print("YOU FAILED! EXCEPTION")
  290.  
  291. x = xyvArr[0]
  292. y = xyvArr[1]
  293. visited = xyvArr[2]
  294. tries+=1
  295. #print("W a l l built")
  296.  
  297. #Clearance
  298. if CPGen >= 0:
  299. for x in range(32):
  300. for y in range(32):
  301. grid[x][y].d = -1
  302.  
  303. grid[finishingpoint[0]][finishingpoint[1]].mark = False
  304.  
  305. return global_err
  306.  
  307.  
  308. def generateRandomCheckpoint(sx,sy,ex,ey):
  309. gen = False
  310. while gen == False:
  311. checkpoint=[random.randint(sx,ex),random.randint(sy,ey)]
  312. if grid[checkpoint[0]][checkpoint[1]].val == 0:
  313. #print("found checkpoint ", checkpoint)
  314. #print("it's val is ", grid[checkpoint[0]][checkpoint[1]].val)
  315. gen = True
  316.  
  317. return checkpoint
  318.  
  319.  
  320.  
  321. orderMatrices = [
  322. [1,2,3,6,5,4,7,8,9],
  323. [1,2,6,5,4,7,8,9],
  324. [1,4,7,8,5,2,3,6,9],
  325. [1,4,5,2,3,6,8,9],
  326. [1,4,7,5,3,6,8,9],
  327. [1,2,3,5,7,8,6,9],
  328. [1,2,5,4,7,8,6,9],
  329. [1,5,8,6,9]
  330. ]
  331.  
  332.  
  333.  
  334.  
  335. def completeCheckpoints():
  336. errors = []
  337. #def Action():
  338. checkpoints = []
  339. ABreak = False
  340. CPGen = 0
  341. order = orderMatrices[random.randint(0,len(orderMatrices)-1)]
  342.  
  343. def getBorderCoords(x):
  344. if x==1:
  345. return [[0,0],[11,11]]
  346. if x==2:
  347. return [[12,2],[21,11]]
  348. if x == 3:
  349. return [[22,2],[31,11]]
  350. if x == 4:
  351. return [[1,12],[11,21]]
  352. if x == 5:
  353. return [[12,12],[21,21]]
  354. if x == 6:
  355. return [[22,12],[31,21]]
  356. if x == 7:
  357. return [[1,22],[11,30]]
  358. if x == 8:
  359. return [[12,22],[21,30]]
  360. if x == 9:
  361. return [[22,22],[30,30]]
  362.  
  363.  
  364. for i in range(len(order)):
  365. cur_index = order[i]
  366. da = getBorderCoords(cur_index)
  367. sx = da[0][0]
  368. sy = da[0][1]
  369. ex = da[1][0]
  370. ey = da[1][1]
  371.  
  372. #print("Generating checkpoint at border num ",cur_index)
  373. checkpoints.append(generateRandomCheckpoint(sx,sy,ex,ey))
  374. if random.randint(0,100) <= 15:
  375. checkpoints.append(generateRandomCheckpoint(sx,sy,ex,ey))
  376. print("Checkpoint mutated!")
  377.  
  378. #LeesAlg(sp,[60,56], CPGen)
  379. #LeesAlg([60,56],[31,31], CPGen)
  380.  
  381. errors.append(LeesAlg(sp,checkpoints[0], CPGen))
  382. #ABreak = True
  383.  
  384. CPGen+=1
  385. #print("Chose random order:", order)
  386.  
  387. #if ABreak == False:
  388. for i in range(len(checkpoints)-1):
  389. errors.append(LeesAlg(checkpoints[i],checkpoints[i+1],CPGen))
  390. CPGen += 1
  391.  
  392. errors.append(LeesAlg(checkpoints[i+1],fp,CPGen))
  393.  
  394. return errors
  395. # ABreak = True
  396.  
  397. #return ABreak
  398.  
  399. #while Action() == True:
  400. #Action()
  401.  
  402.  
  403. Stop = False
  404.  
  405. while Stop == False:
  406. grid = [[Cell() for i in range(32)] for j in range(32)] # list comprehension
  407. grid[sp[0]][sp[1]].val = "start"
  408.  
  409. drawRandomObstacles()
  410. drawProtected()
  411. errors = completeCheckpoints()
  412.  
  413. if True not in errors:
  414. Stop = True
  415.  
  416. #LeesAlg(checkpoint,finishingpoint)
  417.  
  418.  
  419. # integer division is good here!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement