Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """Minesweeper has to swipe the mines."""
- from copy import deepcopy
- def create_minefield(height: int, width: int) -> list:
- """Create and return minefield."""
- return [["." for _ in range(width)] for _ in range(height)]
- def add_mines(minefield: list, mines: list) -> list:
- """
- Add mines to a minefield and return minefield.
- Minefield must be length long and width wide. Each non-mine position must contain single dot.
- If a position is empty ("."), then a small mine is added ("x").
- If a position contains small mine ("x"), a large mine is added ("X").
- Mines are in a list.
- Mine is a list. Each mine has 4 integer parameters in the format [N, S, E, W].
- - N is the distance between area of mines and top of the minefield.
- - S ... area of mines and bottom of the minefield.
- - E ... area of mines and right of the minefield.
- - W ... area of mines and left of the minefield.
- :param new_minefield: list
- :param mines: list
- :return: list
- """
- new_minefield = deepcopy(minefield)
- for mine in mines:
- north_position = mine[0]
- west_position = mine[3]
- south_position = len(new_minefield) - mine[1] - 1
- east_position = len(new_minefield[mine[1]]) - 1 - mine[2]
- for x in range(west_position, east_position + 1):
- for y in range(north_position, south_position + 1):
- if new_minefield[y][x] == ".":
- new_minefield[y][x] = "x"
- elif new_minefield[y][x] == "x":
- new_minefield[y][x] = "X"
- return new_minefield
- def get_minefield_string(minefield: list) -> str:
- """Return minefield's string representation."""
- return "\n".join(["".join(element) for element in minefield])
- def calculate_mine_count(minefield: list) -> list:
- """For each cell in minefield, calculate how many mines are nearby."""
- new_minefield = deepcopy(minefield)
- for row in range(len(new_minefield)):
- for column in range(len(new_minefield[row])):
- if new_minefield[row][column] == "x" or new_minefield[row][column] == "X":
- continue
- else:
- new_minefield[row][column] = count_mines(new_minefield, row, column)
- return new_minefield
- def count_mines(new_minefield, row, column, small=False):
- """Count mines."""
- count = 0
- for i in range(-1, 2):
- for j in range(-1, 2):
- if len(new_minefield) > row + i >= 0 and len(new_minefield[row + i]) > column + j >= 0:
- if i == j == 0:
- continue
- if not small:
- if new_minefield[row + i][column + j] == "x" or new_minefield[row + i][column + j] == "X":
- count += 1
- elif small:
- if new_minefield[row + i][column + j] == "x":
- count += 1
- return str(count)
- def walk(minefield, moves, lives) -> list:
- """Make moves on the minefield."""
- new_minefield = deepcopy(minefield)
- current_row = 0
- current_column = 0
- for x, row in enumerate(new_minefield):
- for y, element in enumerate(row):
- if element == "#":
- current_row = x
- current_column = y
- new_minefield[current_row][current_column] = "."
- for move in moves:
- if move == "N" and current_row != 0:
- new_row = current_row - 1
- new_column = current_column
- if new_minefield[new_row][new_column] == "x":
- if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
- if lives == 0:
- break
- else:
- lives -= 1
- new_minefield[new_row][new_column] = "."
- else:
- new_minefield[new_row][new_column] = "."
- if new_minefield[new_row][new_column] == "X":
- if lives == 0:
- break
- else:
- lives -= 1
- current_row = new_row
- current_column = new_column
- if move == "E" and current_column > len(new_minefield[current_row]):
- new_row = current_row
- new_column = current_column + 1
- if new_minefield[new_row][new_column] == "x":
- if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
- if lives == 0:
- break
- else:
- lives -= 1
- new_minefield[new_row][new_column] = "."
- else:
- new_minefield[new_row][new_column] = "."
- if new_minefield[new_row][new_column] == "X":
- if lives == 0:
- break
- else:
- lives -= 1
- current_row = new_row
- current_column = new_column
- if move == "S" and current_row < len(new_minefield):
- new_row = current_row + 1
- new_column = current_column
- if new_minefield[new_row][new_column] == "x":
- if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
- if lives == 0:
- break
- else:
- lives -= 1
- new_minefield[new_row][new_column] = "."
- else:
- new_minefield[new_row][new_column] = "."
- if new_minefield[new_row][new_column] == "X":
- if lives == 0:
- break
- else:
- lives -= 1
- current_row = new_row
- current_column = new_column
- if move == "W" and current_column != 0:
- new_row = current_row
- new_column = current_column - 1
- if new_minefield[new_row][new_column] == "x":
- if int(count_mines(new_minefield, new_row, new_column, small=True)) > 4:
- if lives == 0:
- break
- else:
- lives -= 1
- new_minefield[new_row][new_column] = "."
- else:
- new_minefield[new_row][new_column] = "."
- if new_minefield[new_row][new_column] == "X":
- if lives == 0:
- break
- else:
- lives -= 1
- current_row = new_row
- current_column = new_column
- new_minefield[current_row][current_column] = "#"
- return new_minefield
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement