Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. import random
  2.  
  3. board_size = 10
  4.  
  5. def grid(n):
  6. return [['-' for t in range(n)] for i in range(n)]
  7.  
  8.  
  9.  
  10. class GameBoard(object):
  11. def __init__(self, field):
  12. self.board = field
  13.  
  14. self.submarine1 = Submarine(1)
  15. x,y = self.submarine1.fit(self.board)
  16. self.submarine1.pos = x,y
  17. self.add_ship(x,y,self.submarine1)
  18.  
  19. self.submarine2 = Submarine(2)
  20. x,y = self.submarine2.fit(self.board)
  21. self.submarine2.pos = x,y
  22. self.add_ship(x,y,self.submarine2)
  23.  
  24. self.destroyer1 = Destroyer(1)
  25. x,y = self.destroyer1.fit(self.board)
  26. self.destroyer1.pos = x,y
  27. self.add_ship(x,y, self.destroyer1)
  28.  
  29. self.destroyer2 = Destroyer(2)
  30. x,y = self.destroyer2.fit(self.board)
  31. self.destroyer2.pos = x,y
  32. self.add_ship(x,y, self.destroyer2)
  33.  
  34. self.cruiser = Cruiser(1)
  35. x,y = self.cruiser.fit(self.board)
  36. self.cruiser.pos = x,y
  37. self.add_ship(x,y, self.cruiser)
  38.  
  39. self.battleship = Battleship(1)
  40. x,y = self.battleship.fit(self.board)
  41. self.battleship.pos = x,y
  42. self.add_ship(x,y, self.battleship)
  43.  
  44. self.carrier = Carrier(1)
  45. x,y = self.carrier.fit(self.board)
  46. self.carrier.pos = x,y
  47. self.add_ship(x,y, self.carrier)
  48.  
  49. def check(self,x,y):
  50. self.field[y][x]
  51.  
  52. def update(self, field):
  53. self.field = field
  54.  
  55. def random_enum(self):
  56. positions = []
  57. for y, row in enumerate(self.field):
  58. for x, cell in enumerate(row):
  59. positions.append((x,y))
  60.  
  61. random.shuffle(positions)
  62. return iter(positions)
  63.  
  64. def _mark_pos(self, x, y, sign):
  65. self.board[y][x] = sign
  66.  
  67.  
  68. def add_ship(self, x,y, ship):
  69. check = []
  70. points = ship.occupies(x,y)
  71. for x,y in points:
  72. check_x, check_y = x,y
  73. for y, row in enumerate(self.board):
  74. for x, cell in enumerate(row):
  75. if y == check_y and x == check_x:
  76. check.append(cell)
  77.  
  78. if check != ship.signature:
  79. return -1
  80. else:
  81. for x,y in points:
  82. self._mark_pos(x,y,ship.sign)
  83. return 0
  84.  
  85. def verify_cells(self,points):
  86. r = []
  87. for x,y in points:
  88. check_x, check_y = x,y
  89. for y, row in enumerate(self.board):
  90. for x, cell in enumerate(row):
  91. if y == check_y and x == check_x:
  92. r.append(cell)
  93. return r
  94.  
  95.  
  96.  
  97. def check_cell(check_x,check_y,board):
  98. for y, row in enumerate(board):
  99. for x, cell in enumerate(row):
  100. if y == check_y and x == check_x:
  101. return cell
  102. return -1
  103.  
  104. def enum_grid(board):
  105. positions = []
  106. for y, row in enumerate(board):
  107. for x, cell in enumerate(row):
  108. positions.append((x,y))
  109.  
  110. random.shuffle(positions)
  111. for x,y in positions:
  112. yield x,y
  113.  
  114.  
  115. def column(matrix, i):
  116. return [row[i] for row in matrix]
  117.  
  118.  
  119.  
  120. class Ship(object):
  121. def __init__(self, name, x, y):
  122. self.name = name
  123. self.length = x
  124. self.width = y
  125. self.orientation = random.randint(0,1)
  126. self.signature = ['-' for i in range(self.length)]
  127. self.sign = self.name[0:3]
  128. self.pos = (0,0)
  129. self.destroyed = 0
  130.  
  131.  
  132. def status(self, board):
  133. s = []
  134. positions = self.occupies(*self.pos)
  135. for x,y in positions:
  136. s.append(check_cell(x,y,board))
  137. if s == ['h' for x in range(self.length)]:
  138. self.destroyed = 1
  139.  
  140.  
  141. def occupies(self,x,y):
  142. if self.orientation == 1:
  143. return [(x, y+g) for g in range(self.length)]
  144. else:
  145. return [(x+g, y) for g in range(self.length)]
  146.  
  147.  
  148. def fit(self,board):
  149. state = 0
  150. while state == 0:
  151. check = enum_grid(board)
  152. if self.orientation == 1:
  153. for x,y in check:
  154. sample = column(board, y)
  155. for i,c in enumerate(sample):
  156. if sample[i:i+self.length] == self.signature:
  157. return x,y
  158. if self.orientation == 0:
  159. for x,y in check:
  160. sample = board[y]
  161. if sample[x:x+self.length] == self.signature:
  162. return x,y
  163.  
  164.  
  165. class Submarine(Ship):
  166. def __init__(self,number):
  167. self.number = number
  168. self.name = "submarine:"+str(number)
  169. self.length = 1
  170. self.width = 1
  171. self.orientation = random.randint(0,1)
  172. self.signature = ['-' for i in range(self.length)]
  173. self.sign = self.name[0:3]+":"+str(number)
  174.  
  175.  
  176. class Destroyer(Ship):
  177. def __init__(self,number):
  178. self.number = number
  179. self.name = "destroyer:"+str(number)
  180. self.length = 2
  181. self.width = 1
  182. self.orientation = random.randint(0,1)
  183. self.signature = ['-' for i in range(self.length)]
  184. self.sign = self.name[0:3]+":"+str(number)
  185.  
  186.  
  187.  
  188. class Cruiser(Ship):
  189. def __init__(self,number):
  190. self.number = number
  191. self.name = "cruiser:"+str(number)
  192. self.length = 3
  193. self.width = 1
  194. self.orientation = random.randint(0,1)
  195. self.signature = ['-' for i in range(self.length)]
  196. self.sign = self.name[0:3]+":"+str(number)
  197.  
  198. class Battleship(Ship):
  199. def __init__(self,number):
  200. self.number = number
  201. self.name = "battleship:"+str(number)
  202. self.length = 4
  203. self.width = 1
  204. self.orientation = random.randint(0,1)
  205. self.signature = ['-' for i in range(self.length)]
  206. self.sign = self.name[0:3]+":"+str(number)
  207.  
  208. class Carrier(Ship):
  209. def __init__(self,number):
  210. self.number = number
  211. self.name = "carrier:"+str(number)
  212. self.length = 5
  213. self.width = 1
  214. self.orientation = random.randint(0,1)
  215. self.signature = ['-' for i in range(self.length)]
  216. self.sign = self.name[0:3]+":"+str(number)
  217.  
  218.  
  219. board = GameBoard(grid(board_size))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement