def test_victory(): board = MinesweeperBoard(2, 1, 1) assert(not board.end_state) board.step(0, 0) assert(board.end_state == EndState.VICTORY) board.step(1, 0) assert(board.end_state == EndState.VICTORY)
class MinesweeperCmd(Cmd): """Handle commands for a game of Minesweeper.""" def __init__(self): Cmd.__init__(self) self.board = None self.prompt = '(Minesweeper) ' self.intro = '\n'.join(['', WELCOME, NEW_GAME_ADVICE, '']) # ----- game control ----- def do_new(self, arg_string): """new WIDTH HEIGHT NUM_MINES Start a new game with the specified dimensions and number of mines.""" try: width, height, num_mines = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help new') self.board = MinesweeperBoard(width, height, num_mines) print() print(PLAY_ADVICE) return False def _cleanup_game(self): self.board = None def do_end(self, __): """End the game, but don't exit the program.""" self._cleanup_game() # ----- game play ----- def do_step(self, arg_string): """step X Y Play a step at space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help step') try: game_end = self.board.step(x, y) except IndexError: print('out of range') return False if game_end: print() print(self.board) print() if game_end == EndState.VICTORY: print('You win!!') elif game_end == EndState.DEFEAT: print('You lose.') self._cleanup_game() return False def do_flag(self, arg_string): """flag X Y Flag space X, Y as containing a mine.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help flag') self.board.flag(x, y) def do_mark(self, arg_string): """mark X Y Flag space X, Y as containing a mine.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help mark') self.board.flag(x, y) def do_unflag(self, arg_string): """flag X Y Remove flag from space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help unflag') self.board.unflag(x, y) def do_unmark(self, arg_string): """mark X Y Remove flag from space X, Y.""" if not self.board: return self.onecmd('help new') try: x, y = (int(arg) for arg in arg_string.split()) except ValueError: return self.onecmd('help unmark') self.board.unflag(x, y) # ----- parser handling ----- def _exit(self): print('Goodbye') return True def do_bye(self, __): """Exit the game.""" return self._exit() def do_exit(self, __): """Exit the game.""" return self._exit() def do_quit(self, __): """Exit the game.""" return self._exit() def do_EOF(self, __): """Exit the game.""" return self._exit() # ----- meta ----- def precmd(self, line): if line != 'EOF': line = line.lower() return line def postcmd(self, stop, line): if stop: return True print() if self.board: print(self.board) else: print(NEW_GAME_ADVICE) return False