Advertisement
Alexei17

Untitled

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