Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. #!/bin/python
  2.  
  3. import sys
  4. import random
  5. import time
  6. import curses
  7.  
  8.  
  9. class Awesome11:
  10.  
  11. KEYS = {
  12. 'h': 'left',
  13. 'j': 'bottom',
  14. 'k': 'top',
  15. 'l': 'right'
  16. }
  17.  
  18. COLORS = {
  19. 1: (curses.COLOR_YELLOW, curses.COLOR_BLACK),
  20. 2: (curses.COLOR_MAGENTA, curses.COLOR_BLACK),
  21. 3: (curses.COLOR_RED, curses.COLOR_BLACK),
  22. 4: (curses.COLOR_GREEN, curses.COLOR_BLACK),
  23. 5: (curses.COLOR_BLUE, curses.COLOR_BLACK),
  24. 6: (curses.COLOR_CYAN, curses.COLOR_BLACK),
  25. 7: (curses.COLOR_BLACK, curses.COLOR_YELLOW),
  26. 8: (curses.COLOR_WHITE, curses.COLOR_MAGENTA),
  27. 9: (curses.COLOR_WHITE, curses.COLOR_RED),
  28. 10: (curses.COLOR_WHITE, curses.COLOR_GREEN),
  29. 11: (curses.COLOR_WHITE, curses.COLOR_BLUE),
  30. 12: (curses.COLOR_WHITE, curses.COLOR_CYAN),
  31. }
  32.  
  33. SLEEP_BEFORE_ADD = .2
  34.  
  35. def __init__(self, size=4):
  36. self.size = size
  37. self.init_screen()
  38.  
  39. def init_screen(self):
  40. self.screen = curses.initscr()
  41. curses.start_color()
  42. curses.noecho()
  43. curses.curs_set(0)
  44. self.screen.keypad(1)
  45. for val, colors in self.COLORS.items():
  46. fg, bg = colors
  47. curses.init_pair(val, fg, bg)
  48.  
  49. def init_board(self):
  50. self.board = [[0 for i in range(self.size)]
  51. for j in range(self.size)]
  52.  
  53. def play(self):
  54. self.init_board()
  55. self.add()
  56. self.add()
  57. while True:
  58. key = self.screen.getkey()
  59. if key in self.KEYS.keys():
  60. self.move(self.KEYS[key])
  61. elif key == 'q':
  62. self.quit()
  63.  
  64. def quit(self):
  65. curses.endwin()
  66. sys.exit(0)
  67.  
  68. def move(self, direction):
  69. board = getattr(self, 'move_%s' % direction)()
  70. if board != self.board:
  71. self.board = board
  72. self.draw()
  73. self.add()
  74.  
  75. def move_left(self):
  76. board = []
  77. for i, _ in enumerate(self.board):
  78. row = self.row_to_left(self.board[i][:])
  79. board.append(row)
  80. return board
  81.  
  82. def move_right(self):
  83. board = []
  84. for i, _ in enumerate(self.board):
  85. row = self.row_to_left(self.board[i][::-1])
  86. board.append(row[::-1])
  87. return board
  88.  
  89. def move_top(self):
  90. actual_board = self.get_rotated_ccw(self.board)
  91. board = []
  92. for i, _ in enumerate(actual_board):
  93. row = self.row_to_left(actual_board[i])
  94. board.append(row)
  95. return self.get_rotated_cw(board)
  96.  
  97. def move_bottom(self):
  98. actual_board = self.get_rotated_cw(self.board)
  99. board = []
  100. for i, _ in enumerate(actual_board):
  101. row = self.row_to_left(actual_board[i])
  102. board.append(row)
  103. return self.get_rotated_ccw(board)
  104.  
  105. def get_rotated_cw(self, board):
  106. return [list(e) for e in zip(*board[::-1])]
  107.  
  108. def get_rotated_ccw(self, board):
  109. return [list(e) for e in zip(*board)[::-1]]
  110.  
  111. def row_to_left(self, row):
  112. for i in range(self.size - 1):
  113. for _ in range(self.size - 1 - i):
  114. if row[i] == 0:
  115. row.pop(i)
  116. row.append(0)
  117. else:
  118. break
  119. for _ in range(self.size - 2 - i):
  120. if row[i + 1] == 0:
  121. row.pop(i + 1)
  122. row.append(0)
  123. else:
  124. break
  125. if row[i] != 0 and row[i] == row[i + 1]:
  126. row.pop(i)
  127. row[i] += 1
  128. row.append(0)
  129. return row
  130.  
  131. def add(self):
  132. empty = []
  133. for y, row in enumerate(self.board):
  134. for x, val in enumerate(row):
  135. if val == 0:
  136. empty.append((x, y))
  137. if len(empty):
  138. x, y = random.choice(empty)
  139. self.board[y][x] = 1
  140. time.sleep(self.SLEEP_BEFORE_ADD)
  141. self.draw()
  142.  
  143. def draw(self):
  144. self.screen.clear()
  145. self.screen.addstr("\n")
  146. for row in self.board:
  147. for val in row:
  148. self.draw_val(val)
  149. self.screen.addstr("\n")
  150. self.screen.refresh()
  151.  
  152. def draw_val(self, val):
  153. if val < 10:
  154. sep = ' '
  155. else:
  156. sep = ' '
  157. self.screen.addstr(sep)
  158. self.screen.addstr(str(val or '_'), curses.color_pair(val))
  159.  
  160. def __str__(self):
  161. return "\n".join(["".join(["% 3s" % v for v in row])
  162. for row in self.board]).replace('0', '_')
  163.  
  164. def __repr__(self):
  165. return self.__str__()
  166.  
  167.  
  168. if __name__ == '__main__':
  169.  
  170. game = Awesome11(size=4)
  171. game.play()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement