From a850cd967ca10938d21753d6bdbaac2fe2a913e9 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Sun, 1 Jan 2017 15:15:47 +0100 Subject: Fixed all weird things I did 3 years ago --- README.md | 4 -- README.rst | 4 ++ cell.py | 50 ------------------- field.py | 116 -------------------------------------------- game.py | 126 ------------------------------------------------ minesweeper | 15 ------ minesweeper/__init__.py | 0 minesweeper/__main__.py | 19 ++++++++ minesweeper/cell.py | 50 +++++++++++++++++++ minesweeper/field.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++++ minesweeper/game.py | 124 +++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 20 ++++++++ 12 files changed, 343 insertions(+), 311 deletions(-) delete mode 100644 README.md create mode 100644 README.rst delete mode 100644 cell.py delete mode 100644 field.py delete mode 100644 game.py delete mode 100755 minesweeper create mode 100644 minesweeper/__init__.py create mode 100644 minesweeper/__main__.py create mode 100644 minesweeper/cell.py create mode 100644 minesweeper/field.py create mode 100644 minesweeper/game.py create mode 100644 setup.py diff --git a/README.md b/README.md deleted file mode 100644 index 7d77f0b..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -minesweeper-py -============== - -A commandline minesweeper game I made, because I was bored. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..f0e7a78 --- /dev/null +++ b/README.rst @@ -0,0 +1,4 @@ +minesweeper-py +============== + +A commandline minesweeper game I made, because I was bored. diff --git a/cell.py b/cell.py deleted file mode 100644 index 18968a2..0000000 --- a/cell.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/python - -from random import randint - -class Cell: - def __init__(self,chance): - if randint(0,99) < chance: - self.isMine = True - else: - self.isMine = False - self.covered = True - self.cover = '#' - - def getIsMine(self): - return self.isMine - - def getValue(self): - return self.value - - def setValue(self,value): - if value == '0': - self.value = ' ' - else: - self.value = value - return - - def isCovered(self): - return self.covered - - def printCell(self): - if self.covered: - return self.cover - else: - return self.value - - def isSafe(self): - if self.cover == 'F': - return True - else: - return False - - def uncover(self): - self.covered = False - return - - def toggleFlag(self): - if self.cover == '#': - self.cover = 'F' - elif self.cover == 'F': - self.cover = '#' \ No newline at end of file diff --git a/field.py b/field.py deleted file mode 100644 index f7a2544..0000000 --- a/field.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/python - -from __future__ import print_function -from cell import Cell - -class Field: - def __init__(self,width,height,mines): - self.width = width - self.height = height - self.mines = mines - self.createField() - self.createHints() - return - - def createField(self): - minesAdded = 0 - chance = (self.mines * 100) / (self.width * self.height) - - while minesAdded != self.mines: - self.field = [] - minesAdded = 0 - for y in range(self.height): - row = [] - for x in range(self.width): - row.append(Cell(chance)) - if row[x].getIsMine(): - minesAdded += 1 - self.field.append(row) - return - - def createHints(self): - for y in range(len(self.field)): - for x in range(len(self.field[y])): - cell = self.field[y][x] - if cell.getIsMine(): - cell.setValue('x') - else: - m = str(self.getMinesAround(x,y)) - cell.setValue(m) - return - - def getMinesAround(self,x,y): - mines = 0 - for i in range(-1,2): - for j in range(-1,2): - xi = x+i - yj = y+j - if xi >= 0 and yj >= 0 and xi < self.width and yj < self.height: - if self.field[yj][xi].getIsMine(): - mines += 1 - return mines - - def uncoverEmptyAround(self,x,y): - for i in range(-1,2): - for j in range(-1,2): - xi = x+i - yj = y+j - if xi >= 0 and yj >= 0 and xi < self.width and yj < self.height: - cell = self.field[yj][xi] - if cell.isCovered(): - self.guess(xi,yj) - return - - def printField(self): - i = 1 - - print("\n\t", end="") - for char in range(0,self.width): - print(chr(char+65) + " ", end="") - print("\n") - - for list in self.field: - print(str(i) + "\t", end = '') - for item in list: - print(item.printCell() + " ", end='') - print("\t" + str(i)) - i += 1 - - print("\n\t", end="") - for char in range(0,self.width): - print(chr(char+65) + " ", end="") - print("\n") - - def cleared(self): - safe = 0 - for y in range(len(self.field)): - for x in range(len(self.field[y])): - cell = self.field[y][x] - if cell.getIsMine() and cell.isSafe(): - safe += 1 - - if safe == self.mines: - cleared = True - else: - cleared = False - - return cleared - - - - def guess(self,x,y): - cell = self.field[y][x] - if cell.getValue() == " ": - cell.uncover() - self.uncoverEmptyAround(x,y) - return False - elif cell.getValue() == 'x': - cell.uncover() - return True - else: - cell.uncover() - return False - - def flag(self,x,y): - cell = self.field[y][x] - cell.toggleFlag() \ No newline at end of file diff --git a/game.py b/game.py deleted file mode 100644 index c8927b5..0000000 --- a/game.py +++ /dev/null @@ -1,126 +0,0 @@ -#!/usr/bin/python - -try: - input = raw_input -except NameError: - pass - -from field import Field - -class Help: - def setState(self,l): - self.loop = l - - def printHelp(self): - print("") - print("Listed commands:") - print(" try\t\t\tTests for mines") - print(" flag\t\t\tPlaces flag") - print(" ?\t\t\tPlaces questionmark") - print(" restart\t\tStarts new game") - print(" quit or exit\t\tQuits game") - print(" help\t\t\tPrints list of commands") - self.loop.command() - -class Setup: - def setState(self,l): - self.loop = l - - def setup(self): - print("") - print("Select diffeculty:") - print(" 1. Beginner\t\t(10 mines, 9x9)") - print(" 2. Intermediate\t(40 mines, 16x16)") - print(" 3. Expert\t\t(99 mines, 30x16)") - print(" 4. Custom") - print("") - - n = input("Choice: ") - n = n.split() - choice = int(n[0]) - - if choice == 1: - w = 9 - h = 9 - m = 10 - elif choice == 2: - w = 16 - h = 16 - m = 40 - elif choice == 3: - w = 30 - h = 16 - m = 99 - elif choice == 4: - w = int(input("Width: ")) - h = int(input("Heigt: ")) - m = int(input("Mines: ")) - else: - print(str(choice) + " is not a option.") - self.setup() - - minefield = Field(w,h,m) - self.loop.setMinefield(minefield) - self.loop.command() - -class Loop: - def setStates(self,s,h,e): - self.setup = s - self.end = e - self.help = h - - def setMinefield(self,m): - self.minefield = m - - def command(self): - self.minefield.printField() - if(self.minefield.cleared()): - self.end.endGame(False) - - command = input("Command >> ") - c = command.split(' ') - - if c[0] == "try": - if self.minefield.guess(ord(c[1])-65,int(c[2])-1): - self.minefield.printField() - self.end.endGame(True) - self.command() - elif c[0] == "flag": - self.minefield.flag(ord(c[1])-65,int(c[2])-1) - self.command() - elif c[0] == "?": - self.minefield.question(ord(c[1])-65,int(c[2])-1) - self.command() - elif c[0] == "restart": - self.setup.setup() - elif c[0] == "quit" or c[0] == "exit": - exit() - elif c[0] == "help": - self.help.printHelp() - else: - print(c[0] + " is not a recognized command") - self.help.printHelp() - -class End: - def setState(self,s): - self.setup = s - - def restart(self): - choice = input("Do you want to start again? [y/n] ") - choice = choice.split() - choice = choice[0] - if choice == "y": - self.setup.setup() - elif choice == "n": - exit() - else: - print(str(choice) + " is not a valid choice") - self.restart() - - def endGame(self,m): - print("") - if m: - print("You hit a mine :o") - else: - print("You won :D") - self.restart() \ No newline at end of file diff --git a/minesweeper b/minesweeper deleted file mode 100755 index 74333b5..0000000 --- a/minesweeper +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 - -import game - -help = game.Help() -setup = game.Setup() -loop = game.Loop() -end = game.End() - -help.setState(loop) -setup.setState(loop) -end.setState(setup) -loop.setStates(setup,help,end) - -setup.setup() diff --git a/minesweeper/__init__.py b/minesweeper/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/minesweeper/__main__.py b/minesweeper/__main__.py new file mode 100644 index 0000000..aec3fcc --- /dev/null +++ b/minesweeper/__main__.py @@ -0,0 +1,19 @@ +from minesweeper import game + + +def main(): + help = game.Help() + setup = game.Setup() + loop = game.Loop() + end = game.End() + + help.set_state(loop) + setup.set_state(loop) + end.set_state(setup) + loop.set_states(setup, help, end) + + setup.setup() + + +if __name__ == "__main__": + main() diff --git a/minesweeper/cell.py b/minesweeper/cell.py new file mode 100644 index 0000000..8c7481b --- /dev/null +++ b/minesweeper/cell.py @@ -0,0 +1,50 @@ +from random import randint + + +class Cell: + def __init__(self, chance): + self._value = None + + if randint(0, 99) < chance: + self.is_mine = True + else: + self.is_mine = False + + self.covered = True + self.cover = '#' + + @property + def value(self): + return self._value + + @value.setter + def value(self, value): + if value == 0: + self._value = ' ' + else: + self._value = str(value) + + @property + def visible_value(self): + if self.covered: + return self.cover + else: + return self.value + + @property + def safe(self): + if self.cover == 'F': + return True + else: + return False + + def uncover(self): + self.covered = False + + def toggle_flag(self): + if self.cover == '#': + self.cover = 'F' + elif self.cover == 'F': + self.cover = '#' + +# vim: set ts=8 sw=4 tw=0 et : diff --git a/minesweeper/field.py b/minesweeper/field.py new file mode 100644 index 0000000..e6d1cd3 --- /dev/null +++ b/minesweeper/field.py @@ -0,0 +1,126 @@ +from minesweeper.cell import Cell + + +class Field: + def __init__(self, width, height, nr_of_mines): + self.width = width + self.height = height + + self.create_field(nr_of_mines) + self.create_hints() + + def create_field(self, nr_of_mines): + mines_added = None + chance = (nr_of_mines * 100) / (self.width * self.height) + + while mines_added != nr_of_mines: + self.field = [] + mines_added = 0 + + for _ in range(self.height): + row = [] + for _ in range(self.width): + cell = Cell(chance) + row.append(cell) + + if cell.is_mine: + mines_added += 1 + + self.field.append(row) + + def create_hints(self): + for y, row in enumerate(self.field): + for x, cell in enumerate(row): + if cell.is_mine: + cell.value = 'x' + else: + cell.value = len(list(self.mines_around(x, y))) + + def cells_around(self, x, y): + for i in range(-1, 2): + for j in range(-1, 2): + dx = x + i + dy = y + j + + if dx >= 0 and dy >= 0 \ + and dx < self.width and dy < self.height: + yield (dx, dy), self.field[dy][dx] + + def mines_around(self, x, y): + for position, cell in self.cells_around(x, y): + if cell.is_mine: + yield cell + + @property + def mines(self): + for row in self.field: + for cell in row: + if cell.is_mine: + yield cell + + @property + def covered_cells(self): + for row in self.field: + for cell in row: + if cell.covered: + yield cell + + def uncover_empty_around(self, x, y): + for position, cell in self.cells_around(x, y): + if cell.covered: + self.guess(*position) + + def print_column_names(self): + print("\n\t", end="") + + for char in range(0, self.width): + print(chr(char + 65) + " ", end="") + + print("\n") + + def print_row(self, count, row): + print(str(count) + "\t", end='') + + for cell in row: + print(cell.visible_value + " ", end='') + + print("\t" + str(count)) + + def print(self): + self.print_column_names() + + for count, row in enumerate(self.field): + self.print_row(count + 1, row) + + self.print_column_names() + + @property + def cleared(self): + all_safe = True + for mine in self.mines: + all_safe &= mine.safe + + only_mines_covered = True + for cell in self.covered_cells: + only_mines_covered &= cell.is_mine + + return all_safe or only_mines_covered + + def guess(self, x, y): + cell = self.field[y][x] + if cell.value == " ": + cell.uncover() + self.uncover_empty_around(x, y) + return False + elif cell.value == 'x': + cell.uncover() + return True + else: + cell.uncover() + return False + + def flag(self, x, y): + cell = self.field[y][x] + cell.toggle_flag() + +# vim: set ts=8 sw=4 tw=0 et : diff --git a/minesweeper/game.py b/minesweeper/game.py new file mode 100644 index 0000000..9ef7b16 --- /dev/null +++ b/minesweeper/game.py @@ -0,0 +1,124 @@ +from minesweeper.field import Field + + +class Help: + def set_state(self, loop): + self.loop = loop + + def print(self): + print("""Listed commands: + try Tests for mines + flag Places flag + restart Starts new game + quit or exit Quits game + help Prints list of commands +""") + self.loop.command() + + +class Setup: + def set_state(self, loop): + self.loop = loop + + def setup(self): + print("""Select diffeculty: + 1. Beginner (10 mines, 9x9) + 2. Intermediate (40 mines, 16x16) + 3. Expert (99 mines, 30x16) + 4. Custom" +""") + + choice = int( + input("Choice: ").split()[0]) + + if choice == 1: + width = 9 + height = 9 + mines = 10 + elif choice == 2: + width = 16 + height = 16 + mines = 40 + elif choice == 3: + width = 30 + height = 16 + mines = 99 + elif choice == 4: + width = int(input("Width: ")) + height = int(input("Height: ")) + mines = int(input("Mines: ")) + else: + print(str(choice) + " is not a option.") + self.setup() + + minefield = Field(width, height, mines) + self.loop.set_minefield(minefield) + self.loop.command() + + +class Loop: + def set_states(self, setup, help, end): + self.setup = setup + self.end = end + self.help = help + + def set_minefield(self, minefield): + self.minefield = minefield + + def command(self): + self.minefield.print() + if self.minefield.cleared: + self.end.end_game(False) + + command = input("Command >> ").split(' ') + + if len(command) == 3: + coordinate = (ord(command[1]) - 65, int(command[2]) - 1) + + if command[0] == "try": + if self.minefield.guess(*coordinate): + self.minefield.print() + self.end.end_game(dead=True) + return + self.command() + elif command[0] == "flag": + self.minefield.flag(*coordinate) + self.command() + # elif command[0] == "?": + # self.minefield.question(coordinate) + # self.command() + elif command[0] == "restart": + self.setup.setup() + elif command[0] == "quit" or command[0] == "exit": + exit() + elif command[0] == "help": + self.help.print() + else: + print(command[0] + " is not a recognized command") + self.help.print() + + +class End: + def set_state(self, setup): + self.setup = setup + + def restart(self): + choice = input("Do you want to start again? [y/n] ").split()[0] + + if choice == "y": + self.setup.setup() + elif choice == "n": + exit() + else: + print(str(choice) + " is not a valid choice") + self.restart() + + def end_game(self, dead): + print("") + + if dead: + print("You hit a mine :o") + else: + print("You won :D") + + self.restart() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8ac1344 --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +from setuptools import setup, find_packages + +setup( + name='minesweeper-py', + version='1.0.0', + description=u'A command line minesweeper game', + long_description=open('README.rst').read(), + license='GPLv3', + author=u'Ton van der Lee', + author_email='t0m.vd.l33@gmail.com', + url='http://github.com/tomvanderlee/minesweeper-py', + packages= find_packages(), + entry_points={ + 'console_scripts': [ + 'minesweeper-py = minesweeper.__main__:main', + ] + } +) -- cgit v1.2.3