Advertisement
Guest User

Untitled

a guest
May 1st, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. import os, sys, time, threading
  2. from getch import my_getch
  3. import random
  4.  
  5. class Terminal(object):
  6. def writeXY(x=0, y=0, s=''):
  7. print("\033[" + str(x) + ";" + str(y*2) + "H" + str(s), end='\r')
  8. def reset():
  9. rows, columns = os.popen('stty size', 'r').read().split()
  10. Terminal.writeXY(0, 0, ' '*int(columns)*int(rows))
  11.  
  12.  
  13. class Game(object):
  14. def __init__(self):
  15. self.snake = None
  16. self.food = None
  17. self.end = False
  18. self.score = 0
  19.  
  20. def drawScore(self):
  21. Terminal.writeXY(0, 16, 'Score: ' + str(self.score))
  22.  
  23. def defineSnake(self, snake):
  24. self.snake = snake
  25.  
  26. def Over(self):
  27. Terminal.writeXY(12, 14, 'Game Over! Score: ' + str(self.score))
  28. self.end = True
  29. return False
  30.  
  31. def Pause(self):
  32. Terminal.writeXY(12, 16, 'Pause!')
  33.  
  34. def drawFrame(self):
  35. if not self.end:
  36. Terminal.reset()
  37. self.snake.draw()
  38. self.food.draw()
  39. self.drawScore()
  40.  
  41. def getRandomXY(self):
  42. rows, columns = os.popen('stty size', 'r').read().split()
  43. x = random.randint(2, int(columns)-2)
  44. y = random.randint(2, int(rows)-2)
  45. return x, y
  46.  
  47. def createFood(self):
  48. x, y = self.getRandomXY()
  49. while (self.snake.isColision(x, y)):
  50. x, y = self.getRandomXY()
  51. self.food = Point(x, y, '$')
  52.  
  53.  
  54. class Point(object):
  55. def __init__(self, x, y, ch):
  56. self.x = x
  57. self.y = y
  58. self.ch = ch
  59.  
  60. def get(self):
  61. return (self.x, self.y, self.ch)
  62.  
  63. def draw(self):
  64. Terminal.writeXY(self.x, self.y, self.ch)
  65.  
  66.  
  67. class Snake(object):
  68. directions = {
  69. 'up' :[-1, 0],
  70. 'down' :[ 1, 0],
  71. 'left' :[ 0, -1],
  72. 'right' :[ 0, 1] }
  73. def __init__(self, game, headX=10, headY=10, lenth=5):
  74. self.game = game
  75. self.direction = 'left'
  76. self.body = (Point(headX, headY, '@'), ) + tuple([Point(headX, headY + x, '#') for x in range(1, lenth)])
  77.  
  78. def __repr__(self):
  79. return str([x.get() for x in self.body])
  80.  
  81. def draw(self):
  82. for x in self.body:
  83. x.draw()
  84.  
  85. def isColision(self, x, y):
  86. if (x < 0) or (x > 24) or (y < 0) or (y > 40):
  87. return True
  88. for point in self.body:
  89. if point.x == x and point.y == y:
  90. return True
  91. return False
  92.  
  93. def checkMoveInBody(self, x, y):
  94. if x == self.body[1].x and y == self.body[1].y:
  95. return True
  96. return False
  97.  
  98. def getNewDirectionPosition(self, dir):
  99. x = self.body[0].x + Snake.directions[dir][0]
  100. y = self.body[0].y + Snake.directions[dir][1]
  101. return x, y
  102.  
  103. def move(self, dir):
  104. if self.game.end: return False
  105. newHeadx, newHeady = self.getNewDirectionPosition(dir)
  106. if self.checkMoveInBody(newHeadx, newHeady):
  107. return False
  108. self.direction = dir
  109.  
  110. if self.isColision(newHeadx, newHeady):
  111. self.game.Over()
  112. return False
  113.  
  114. doBigger = self.isFoodColision(newHeadx, newHeady)
  115. newHead = Point(newHeadx, newHeady, '@')
  116. self.body[0].ch = '#'
  117. self.body = (newHead, ) + self.body[:doBigger]
  118. return True
  119.  
  120. def isFoodColision(self, x, y):
  121. food = self.game.food
  122. if food.x == x and food.y == y:
  123. self.game.createFood()
  124. self.game.score += 1
  125. return len(self.body)
  126. return -1
  127.  
  128.  
  129. class perpetualTimer():
  130. def __init__(self, t, hFunction):
  131. self.t = t
  132. self.hFunction = hFunction
  133. self.thread = threading.Timer(self.t, self.handle_function)
  134. def handle_function(self):
  135. self.hFunction()
  136. self.thread = threading.Timer(self.t,self.handle_function)
  137. self.thread.start()
  138. def start(self):
  139. self.thread.start()
  140. def cancel(self):
  141. self.thread.cancel()
  142.  
  143. myGame = Game()
  144. snake = Snake(myGame, 15, 15, 5)
  145. myGame.defineSnake(snake)
  146. myGame.createFood()
  147. myGame.drawFrame()
  148.  
  149.  
  150. def render():
  151. myGame.drawFrame()
  152. myGame.snake.move(snake.direction)
  153.  
  154. t = perpetualTimer(0.1, render)
  155. t.start()
  156.  
  157.  
  158. tmp = ''
  159. keys = {
  160. 'a' : 'up',
  161. 'b' : 'down',
  162. 'c' : 'right',
  163. 'd' : 'left' }
  164.  
  165. while True:
  166. tmp = my_getch()
  167. if tmp == '\r':
  168. t.cancel()
  169. myGame.Over()
  170. input()
  171. break
  172. if tmp == 'p':
  173. t.cancel()
  174. myGame.Pause()
  175. tmp = my_getch()
  176. t = perpetualTimer(0.1, render)
  177. t.start()
  178. if tmp in keys:
  179. x, y = snake.getNewDirectionPosition(keys[tmp])
  180. if not snake.checkMoveInBody(x, y):
  181. snake.direction = keys[tmp]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement