├── classes ├── Board.py ├── Player.py ├── Jumper.py ├── Dice.py └── Game.py ├── README.md ├── requirements.txt ├── main.py └── .gitignore /classes/Board.py: -------------------------------------------------------------------------------- 1 | class Board(): 2 | def __init__(self, size) -> None: 3 | self.size = size 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # machine-coding-simple-snakes-ladders 2 | A Basic Python Implementation of Snakes & Ladders Game 3 | -------------------------------------------------------------------------------- /classes/Player.py: -------------------------------------------------------------------------------- 1 | class Player(): 2 | def __init__(self, id, name) -> None: 3 | self.id = id 4 | self.name = name 5 | -------------------------------------------------------------------------------- /classes/Jumper.py: -------------------------------------------------------------------------------- 1 | class Jumper(): 2 | def __init__(self, starting_point, ending_point) -> None: 3 | self.starting_point = starting_point 4 | self.ending_point = ending_point 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2019.6.16 2 | chardet==3.0.4 3 | Click==7.0 4 | Flask==1.1.1 5 | idna==2.8 6 | itsdangerous==1.1.0 7 | Jinja2==2.10.1 8 | MarkupSafe==1.1.1 9 | requests==2.22.0 10 | urllib3==1.25.3 11 | Werkzeug==0.15.6 12 | Flask-Cors==3.0.9 13 | python-dateutil==2.8.1 -------------------------------------------------------------------------------- /classes/Dice.py: -------------------------------------------------------------------------------- 1 | import math 2 | from random import randint, random 3 | 4 | 5 | class Dice(): 6 | def __init__(self, number_of_dice) -> None: 7 | self.number_of_dice = number_of_dice 8 | 9 | def roll_dice(self): 10 | return randint(1, 6)*self.number_of_dice 11 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from classes.Game import Game 2 | 3 | 4 | def main(): 5 | 6 | players_count = 2 7 | board_size = 10 8 | dice_count = 1 9 | 10 | game = Game(board_size, players_count) 11 | game.initialise_game() 12 | game.play_game() 13 | 14 | return None 15 | 16 | 17 | main() 18 | -------------------------------------------------------------------------------- /classes/Game.py: -------------------------------------------------------------------------------- 1 | import time 2 | from classes.Dice import Dice 3 | from classes.Jumper import Jumper 4 | from classes.Board import Board 5 | from classes.Player import Player 6 | import queue 7 | 8 | 9 | class Game(): 10 | def __init__(self, board_size, number_of_players) -> None: 11 | self.board_size = board_size 12 | self.number_of_players = number_of_players 13 | self.board = Board(self.board_size) 14 | self.players = queue.Queue() 15 | self.dice = Dice(1) 16 | self.ladders = [] 17 | self.snakes = [] 18 | self.players_position = dict() 19 | 20 | def initialise_game(self): 21 | 22 | for player in range(0, self.number_of_players): 23 | player_name = input("enter player name") 24 | player_id = input("enter id") 25 | self.players.put(Player(player_id, player_name)) 26 | self.players_position[player_id] = 0 27 | 28 | snake_1 = Jumper(5, 2) 29 | snake_2 = Jumper(7, 3) 30 | ladder_1 = Jumper(4, 9) 31 | 32 | self.ladders.append(ladder_1) 33 | self.snakes.append(snake_1) 34 | self.snakes.append(snake_2) 35 | 36 | def play_game(self): 37 | while not self.players.empty(): 38 | time.sleep(3) 39 | player = self.players.get() 40 | next_move = self.dice.roll_dice() 41 | print("dice rolled: ", next_move, 'for player: ', player.id) 42 | player_id = player.id 43 | current_position = self.players_position[player_id] 44 | final_position = current_position + next_move 45 | if final_position > self.board.size: 46 | print("Winner is Player: ", player.name) 47 | break 48 | 49 | for snake in self.snakes: 50 | if snake.starting_point == final_position: 51 | print("player bitten by snake") 52 | final_position = snake.ending_point 53 | 54 | for ladder in self.ladders: 55 | if ladder.starting_point == final_position: 56 | print("player raised by ladder") 57 | final_position = ladder.ending_point 58 | 59 | print('New Final Position', final_position) 60 | self.players_position[player_id] = final_position 61 | self.players.put(player) 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | --------------------------------------------------------------------------------