Guest User

Untitled

a guest
Oct 24th, 2019
89
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. """Minesweeper has to swipe the mines."""
  2. from copy import deepcopy
  3.  
  4.  
  5. def create_minefield(height: int, width: int) -> list:
  6. """Create and return minefield."""
  7. return [["." for _ in range(width)] for _ in range(height)]
  8.  
  9.  
  10. def add_mines(minefield: list, mines: list) -> list:
  11. """
  12. Add mines to a minefield and return minefield.
  13.  
  14. Minefield must be length long and width wide. Each non-mine position must contain single dot.
  15. If a position is empty ("."), then a small mine is added ("x").
  16. If a position contains small mine ("x"), a large mine is added ("X").
  17. Mines are in a list.
  18. Mine is a list. Each mine has 4 integer parameters in the format [N, S, E, W].
  19. - N is the distance between area of mines and top of the minefield.
  20. - S ... area of mines and bottom of the minefield.
  21. - E ... area of mines and right of the minefield.
  22. - W ... area of mines and left of the minefield.
  23. :param new_minefield: list
  24. :param mines: list
  25. :return: list
  26. """
  27. new_minefield = deepcopy(minefield)
  28. for mine in mines:
  29. north_position = mine[0]
  30. west_position = mine[3]
  31. south_position = len(new_minefield) - mine[1] - 1
  32. east_position = len(new_minefield[mine[1]]) - 1 - mine[2]
  33. for x in range(west_position, east_position + 1):
  34. for y in range(north_position, south_position + 1):
  35. if new_minefield[y][x] == ".":
  36. new_minefield[y][x] = "x"
  37. elif new_minefield[y][x] == "x":
  38. new_minefield[y][x] = "X"
  39. return new_minefield
  40.  
  41.  
  42. def get_minefield_string(minefield: list) -> str:
  43. """Return minefield's string representation."""
  44. return "\n".join(["".join(element) for element in minefield])
  45.  
  46.  
  47. def calculate_mine_count(minefield: list) -> list:
  48. """For each cell in minefield, calculate how many mines are nearby."""
  49. new_minefield = deepcopy(minefield)
  50. for row in range(len(new_minefield)):
  51. for column in range(len(new_minefield[row])):
  52. if new_minefield[row][column] == "x" or new_minefield[row][column] == "X":
  53. continue
  54. else:
  55. new_minefield[row][column] = count_mines(new_minefield, row, column)
  56. return new_minefield
  57.  
  58.  
  59. def count_mines(new_minefield, row, column, small=False):
  60. """Count mines."""
  61. count = 0
  62. for i in range(-1, 2):
  63. for j in range(-1, 2):
  64. if len(new_minefield) > row + i >= 0 and len(new_minefield[row + i]) > column + j >= 0:
  65. if i == j == 0:
  66. continue
  67. if not small:
  68. if new_minefield[row + i][column + j] == "x" or new_minefield[row + i][column + j] == "X":
  69. count += 1
  70. elif small:
  71. if new_minefield[row + i][column + j] == "x":
  72. count += 1
  73. return str(count)
  74.  
  75.  
  76. def walk(minefield, moves, lives) -> list:
  77. """Make moves on the minefield."""
  78. new_minefield = deepcopy(minefield)
  79. current_row = 0
  80. current_column = 0
  81. for x, row in enumerate(new_minefield):
  82. for y, element in enumerate(row):
  83. if element == "#":
  84. current_row = x
  85. current_column = y
  86. new_minefield[current_row][current_column] = "."
  87.  
  88. for move in moves:
  89. if move == "N" and current_row != 0:
  90. new_row = current_row - 1
  91. new_column = current_column
  92. if new_minefield[new_row][new_column] == "x":
  93. if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
  94. if lives == 0:
  95. break
  96. else:
  97. lives -= 1
  98. new_minefield[new_row][new_column] = "."
  99. else:
  100. new_minefield[new_row][new_column] = "."
  101. if new_minefield[new_row][new_column] == "X":
  102. if lives == 0:
  103. break
  104. else:
  105. lives -= 1
  106. current_row = new_row
  107. current_column = new_column
  108. if move == "E" and current_column > len(new_minefield[current_row]):
  109. new_row = current_row
  110. new_column = current_column + 1
  111. if new_minefield[new_row][new_column] == "x":
  112. if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
  113. if lives == 0:
  114. break
  115. else:
  116. lives -= 1
  117. new_minefield[new_row][new_column] = "."
  118. else:
  119. new_minefield[new_row][new_column] = "."
  120. if new_minefield[new_row][new_column] == "X":
  121. if lives == 0:
  122. break
  123. else:
  124. lives -= 1
  125. current_row = new_row
  126. current_column = new_column
  127. if move == "S" and current_row < len(new_minefield):
  128. new_row = current_row + 1
  129. new_column = current_column
  130. if new_minefield[new_row][new_column] == "x":
  131. if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
  132. if lives == 0:
  133. break
  134. else:
  135. lives -= 1
  136. new_minefield[new_row][new_column] = "."
  137. else:
  138. new_minefield[new_row][new_column] = "."
  139. if new_minefield[new_row][new_column] == "X":
  140. if lives == 0:
  141. break
  142. else:
  143. lives -= 1
  144. current_row = new_row
  145. current_column = new_column
  146. if move == "W" and current_column != 0:
  147. new_row = current_row
  148. new_column = current_column - 1
  149. if new_minefield[new_row][new_column] == "x":
  150. if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
  151. if lives == 0:
  152. break
  153. else:
  154. lives -= 1
  155. new_minefield[new_row][new_column] = "."
  156. else:
  157. new_minefield[new_row][new_column] = "."
  158. if new_minefield[new_row][new_column] == "X":
  159. if lives == 0:
  160. break
  161. else:
  162. lives -= 1
  163. current_row = new_row
  164. current_column = new_column
  165.  
  166. new_minefield[current_row][current_column] = "#"
  167. return new_minefield
RAW Paste Data