Guest User

Untitled

a guest
Apr 23rd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.32 KB | None | 0 0
  1. import numpy as np
  2. import random
  3. import itertools
  4. import scipy.misc
  5. import matplotlib.pyplot as plt
  6.  
  7.  
  8. def main():
  9. env = gameEnv(size=10,startDelay=5)
  10. # game main loop
  11. isGameOver = False
  12. while not isGameOver:
  13. while 1:
  14. action = key2action(str(input("next action:")))
  15. if action < 0 or action > 4:
  16. print("Invaild Action!")
  17. continue
  18. else:
  19. break
  20. state, reward, isGameOver = env.step(float(action))
  21. plt.imshow(state, interpolation="nearest")
  22. plt.title("Score: {0}, Reward: {1}, GameOver: {2}".format(float(env.getScore()),float(reward),isGameOver))
  23. plt.draw()
  24. plt.show(block=False)
  25. if env.getScore() == 1:
  26. input("Win!!!")
  27. else:
  28. input("Lose :-(")
  29.  
  30. def key2action(key):
  31. # 0 - up, 1 - down, 2 - left, 3 - right
  32. # print("key %s"%(key))
  33. if key == 'w':
  34. return 0
  35. if key == 's':
  36. return 1
  37. if key == 'a':
  38. return 2
  39. if key == 'd':
  40. return 3
  41. else:
  42. return -1
  43.  
  44. def colorByName(colorName):
  45. return {
  46. # colorName: [red,green,blue]
  47. 'purple': [[0.5,0,1]],
  48. 'red': [1,0,0],
  49. 'green': [0,1,0],
  50. 'blue': [0,0,1],
  51. 'yellow': [1,1,0],
  52. 'white': [1,1,1]
  53. }[colorName]
  54.  
  55. def colorByNum(colorNum):
  56. return {
  57. # colorName: [red,green,blue]
  58. 0: colorByName('purple'),
  59. 1: colorByName('red'),
  60. 2: colorByName('green'),
  61. 3: colorByName('blue'),
  62. 4: colorByName('yellow'),
  63. 5: colorByName('white')
  64. }[colorNum]
  65.  
  66. class gameOb():
  67. def __init__(self, coordinates, size, intensity, channel, reward, name):
  68. self.x = coordinates[0]
  69. self.y = coordinates[1]
  70. self.size = size
  71. self.intensity = intensity
  72. self.channel = channel
  73. self.reward = reward
  74. self.name = name
  75.  
  76. class gameEnv():
  77. def __init__(self, partial=0, size=10, fruitNum=0, holeNum=0, startDelay=4):
  78. self.sizeX = size
  79. self.sizeY = size
  80. self.score = 0
  81. self.isSequenceFollowed = True
  82. self.actions = 4
  83. self.startDelay = startDelay
  84. self.startItems = np.random.choice(startDelay,startDelay, replace=False)
  85. self.objects = []
  86. self.partial = partial
  87. self.fruitNum = fruitNum
  88. self.holeNum = holeNum
  89. a = self.reset()
  90. plt.imshow(a, interpolation="nearest")
  91.  
  92. def isPositionTaken(self,x,y,objects=None):
  93. if objects == None:
  94. objects = self.objects
  95. for objectA in objects:
  96. if (x, y) == (objectA.x,objectA.y):
  97. return True
  98. return False
  99.  
  100. def createFruit(self,pos=None):
  101. if pos == None:
  102. pos = self.newPosition()
  103. if not self.isPositionTaken(pos[0],pos[1]):
  104. return gameOb(pos, 1, colorByName('green'), [0, 1, 2], 1, 'fruit')
  105. else:
  106. return None
  107.  
  108. def createHole(self,pos=None):
  109. if pos == None:
  110. pos = self.newPosition()
  111. if not self.isPositionTaken(pos[0],pos[1]):
  112. return gameOb(pos, 1, colorByName('red'), [0, 1, 2], -1, 'hole')
  113. else:
  114. return None
  115.  
  116. def createHero(self,pos=None):
  117. # WATCH OUT that hero have different color than items
  118. if pos == None:
  119. pos = self.newPosition()
  120. if not self.isPositionTaken(pos[0],pos[1]):
  121. return gameOb(pos, 1, colorByName('white'), [0, 1, 2], None, 'hero')
  122. else:
  123. return None
  124.  
  125. def createItem(self,pos=None,color=colorByName('red')):
  126. if pos == None:
  127. pos = self.newPosition()
  128. if not self.isPositionTaken(pos[0],pos[1]):
  129. return gameOb(pos, 1, color, [0, 1, 2], 0, 'item')
  130. else:
  131. return None
  132.  
  133. def reset(self):
  134. self.objects = []
  135. # create hero
  136. self.objects.append(self.createHero())
  137. # create items
  138. for colorNum in self.startItems:
  139. itemColor = colorByNum(colorNum)
  140. item = self.createItem(color=itemColor)
  141. self.objects.append(item)
  142. # # create bugs
  143. # for idx in range(self.fruitNum):
  144. # self.objects.append(self.createFruit())
  145. # # create holes
  146. # for idx in range(self.holeNum):
  147. # self.objects.append(self.createHole())
  148. # first init state
  149. state = self.renderEnv()
  150. self.state = state
  151. return state
  152.  
  153. def moveChar(self, direction):
  154. # 0 - up, 1 - down, 2 - left, 3 - right
  155. hero = self.objects[0]
  156. heroX = hero.x
  157. heroY = hero.y
  158. penalize = 0.
  159. if direction == 0 and hero.y >= 1:
  160. hero.y -= 1
  161. if direction == 1 and hero.y <= self.sizeY - 2:
  162. hero.y += 1
  163. if direction == 2 and hero.x >= 1:
  164. hero.x -= 1
  165. if direction == 3 and hero.x <= self.sizeX - 2:
  166. hero.x += 1
  167. if hero.x == heroX and hero.y == heroY:
  168. penalize = 0.0
  169. self.objects[0] = hero
  170. # check if follow sequence - item[1] is always the next in the sequence
  171. isOnCorrectNextItem = ([hero.x,hero.y] == [self.objects[1].x,self.objects[1].y])
  172. isNotOnAnyItem = not self.isPositionTaken(hero.x,hero.y,self.objects[1:])
  173. self.isSequenceFollowed = self.isSequenceFollowed and (isNotOnAnyItem or isOnCorrectNextItem)
  174. return penalize
  175.  
  176. def newPosition(self):
  177. iterables = [range(self.sizeX), range(self.sizeY)]
  178. points = []
  179. for t in itertools.product(*iterables):
  180. points.append(t)
  181. currentPositions = []
  182. for objectA in self.objects:
  183. if (objectA.x, objectA.y) not in currentPositions:
  184. currentPositions.append((objectA.x, objectA.y))
  185. for pos in currentPositions:
  186. points.remove(pos)
  187. location = np.random.choice(range(len(points)), replace=False)
  188. return points[location]
  189.  
  190. def checkGoal(self):
  191. others = []
  192. for obj in self.objects:
  193. if obj.name == 'hero':
  194. hero = obj
  195. else:
  196. others.append(obj)
  197. for other in others:
  198. if hero.x == other.x and hero.y == other.y:
  199. self.objects.remove(other)
  200. # if other.reward == 1:
  201. # self.objects.append(self.createFruit())
  202. # else:
  203. # self.objects.append(self.createHole())
  204. # check if game ended
  205. if len(self.objects) == 1:
  206. return int(self.isSequenceFollowed),True
  207. else:
  208. return 0,False
  209. return 0,False
  210.  
  211.  
  212. def renderEnv(self):
  213. # a = np.zeros([self.sizeY,self.sizeX,3])
  214. a = np.ones([self.sizeY + 2, self.sizeX + 2, 3])
  215. a[1:-1, 1:-1, :] = 0
  216. hero = None
  217. for item in self.objects:
  218. a[item.y + 1:item.y + item.size + 1, item.x + 1:item.x + item.size + 1, item.channel] = item.intensity
  219. if item.name == 'hero':
  220. hero = item
  221. if self.partial > 0:
  222. a = a[hero.y:hero.y + self.partial, hero.x:hero.x + self.partial, :]
  223. b = scipy.misc.imresize(a[:, :, 0], [84, 84, 1], interp='nearest')
  224. c = scipy.misc.imresize(a[:, :, 1], [84, 84, 1], interp='nearest')
  225. d = scipy.misc.imresize(a[:, :, 2], [84, 84, 1], interp='nearest')
  226. a = np.stack([b, c, d], axis=2)
  227. return a
  228.  
  229. def step(self, action):
  230. # game pre-start
  231. if self.startDelay > 0:
  232. self.showNextItem()
  233. self.startDelay -= 1
  234. return self.renderEnv(),0,False
  235. # first game frame
  236. if self.startDelay == 0:
  237. self.startDelay -= 1
  238. return self.reset(),0,False
  239. # rest of the game
  240. penalty = self.moveChar(action)
  241. reward, done = self.checkGoal()
  242. self.score += (reward+penalty)
  243. state = self.renderEnv()
  244. return state, (reward + penalty), done
  245.  
  246.  
  247. def getScore(self):
  248. return self.score
  249.  
  250. def showNextItem(self):
  251. # delete last item
  252. self.objects.clear()
  253. # add new item - select color by frame number (startDelay)
  254. itemColor = colorByNum(self.startItems[-self.startDelay])
  255. item = self.createItem([int(self.sizeX/2),int(self.sizeY/2)],itemColor)
  256. self.objects.append(item)
  257.  
  258.  
  259. if __name__ == "__main__":
  260. main()
Add Comment
Please, Sign In to add comment