Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. import random
  2.  
  3. class GameBoard():
  4. def __init__(self, size):
  5. self.size = size
  6. self.gameboard = []
  7. for _ in range(self.size):
  8. self.gameboard.append([0 for _ in range(self.size)])
  9.  
  10. # hopefully this is a tuple
  11. # ret true on succ, false on fuck
  12. def setVal(self, pos, val):
  13. if pos[0] < 0 or pos[1] < 0 or pos[0] > self.size or pos[1] > self.size:
  14. raise Exception("Out of bounds")
  15. self.gameboard[pos[0]][pos[1]] = val
  16. return True
  17.  
  18. def getVal(self, pos):
  19. return self.gameboard[pos[0]][pos[1]]
  20.  
  21. def mergeable(self, p1, p2):
  22. v1 = self.getVal(p1)
  23. v2 = self.getVal(p2)
  24. return v1 == v2
  25.  
  26. def merge(self, p1, p2):
  27. if self.mergeable(p1, p2):
  28. v = self.getVal(p1)
  29. self.setVal(p1, v*2)
  30. self.setVal(p2, 0)
  31.  
  32. def count(self, n):
  33. # returns num of occurrances
  34. t = 0
  35. for r in self.gameboard:
  36. for e in r:
  37. if e == n:
  38. t += 1
  39. return t
  40.  
  41. # populate with n random elements
  42. # there's a better way to distribute this, but I'm not figuring it out now.
  43. def populate(self, n):
  44. def getPos():
  45. x = random.randint(0, self.size - 1)
  46. y = random.randint(0, self.size - 1)
  47. return (x,y)
  48. for _ in range(n):
  49. p = getPos()
  50. v = 2 ** random.randint(0, self.size)
  51. while self.getVal(p) != 0:
  52. p = getPos()
  53. self.setVal(p, v)
  54.  
  55. # moves a column to where all elements are next to each other at either the bottom or top
  56. def shiftCol(self, c, d):
  57. def swap(p1, p2):
  58. pass
  59. if c < 0 or c > self.size:
  60. raise Exception("Out of bounds")
  61. col = list(filter( lambda x: x > 0, [r[c] for r in self.gameboard]))
  62. if d == "u":
  63. # I believe itll be col + [0]*diff back into the col place of the game board
  64. for i in range(self.size):
  65. if i < len(col):
  66. self.gameboard[i][c] = col[i]
  67. else:
  68. self.gameboard[i][c] = 0
  69. elif d == "d":
  70. diff = self.size - len(col)
  71. for i in range(self.size):
  72. if i < diff:
  73. self.gameboard[i][c] = 0
  74. else:
  75. self.gameboard[i][c] = col[i - diff]
  76. else:
  77. raise Exception("Invalid direction")
  78.  
  79. def shift_and_merge(p1, p2):
  80. if self.mergeable(p1, p2):
  81. self.merge(p1,p2)
  82. else:
  83. if self.getVal(p1) == 0 and self.getVal(p2) != 0:
  84. swap(p1,p2)
  85.  
  86. col = [r[c] for r in self.gameboard]
  87. if d == "u":
  88. for x in range(len(col)-1):
  89. p1 = (x,c)
  90. p2 = (x+1,c)
  91. shift_and_merge(p1,p2)
  92. elif d == "d":
  93. for x in range(len(col)-1, 0, -1):
  94. p1 = (x,c)
  95. p2 = (x-1,c)
  96. shift_and_merge(p1,p2)
  97.  
  98. def shiftRow(self, r, d):
  99. def swap(p1, p2):
  100. v1 = self.getVal(p1)
  101. v2 = self.getVal(p2)
  102. self.setVal(p1, v2)
  103. self.setVal(p2, v1)
  104. if r < 0 or r > self.size:
  105. raise Exception("Out of bounds")
  106. row = list(filter(lambda x: x != 0 , self.gameboard[r]))
  107. diff = self.size - len(row)
  108. if d == "l":
  109. row = row + [0] * diff
  110. elif d == "r":
  111. row = [0] * diff + row
  112. else:
  113. raise Exception("Invalid direction")
  114. self.gameboard[r] = row
  115. def shift_and_merge(p1, p2):
  116. #shift and merge into p1
  117. if self.mergeable(p1, p2):
  118. self.merge(p1,p2)
  119. else:
  120. if self.getVal(p1) == 0 and self.getVal(p2) != 0:
  121. swap(p1,p2)
  122. if d == "l":
  123. for x in range(len(row)-1):
  124. p1 = (r,x)
  125. p2 = (r,x+1)
  126. shift_and_merge(p1,p2)
  127. elif d == "r":
  128. for x in range(len(row)-1, 0, -1):
  129. p1 = (r,x)
  130. p2 = (r,x-1)
  131. shift_and_merge(p1,p2)
  132.  
  133. def shiftBoard(self, d):
  134. if d == "u" or d == "d":
  135. for i in range(self.size):
  136. self.shiftCol(i, d)
  137. elif d == "l" or d == "r":
  138. for i in range(self.size):
  139. self.shiftRow(i, d)
  140. else:
  141. raise Exception("Invalid direction")
  142.  
  143. def printBoard(self):
  144. for r in self.gameboard:
  145. print("_" * 4 * self.size + "\n")
  146. print("| " + " | ".join([str(x) for x in r]) + " |")
  147. print("_" * 4 * self.size)
  148.  
  149. def main():
  150. running = True
  151. while running:
  152. s = input("How big of a board? (q to quit)>")
  153. if s == "q":
  154. running = False
  155. else:
  156. e = input("How many elements? (q to quit)>")
  157. if s != "q" and e != "q":
  158. b = GameBoard(int(s))
  159. b.populate(int(e))
  160. b.printBoard()
  161. opt = input("dir (q to reset)>")
  162. while opt != "q":
  163. if opt in list("udlr"):
  164. b.shiftBoard(opt)
  165. b.printBoard()
  166. opt = input("dir (q to reset)>")
  167. else:
  168. running = False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement