From 92e2f7f4a13d58c263b0434d5b35ee6190956430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Wed, 10 Apr 2019 02:02:58 +0200 Subject: [PATCH] Increased project structure --- Makefile | 15 ++ main.py | 98 ------------- shenzhen_solitaire/__init__.py | 0 board.py => shenzhen_solitaire/board.py | 1 - .../board_actions.py | 2 +- .../board_possibilities.py | 6 +- shenzhen_solitaire/solver.py | 11 ++ test/__init__.py | 0 test/context.py | 7 + test/test_chain.py | 129 ++++++++++++++++++ 10 files changed, 166 insertions(+), 103 deletions(-) create mode 100644 Makefile delete mode 100644 main.py create mode 100644 shenzhen_solitaire/__init__.py rename board.py => shenzhen_solitaire/board.py (99%) rename board_actions.py => shenzhen_solitaire/board_actions.py (99%) rename board_possibilities.py => shenzhen_solitaire/board_possibilities.py (98%) create mode 100644 shenzhen_solitaire/solver.py create mode 100644 test/__init__.py create mode 100644 test/context.py create mode 100644 test/test_chain.py diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9de82e9 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +PROJECTNAME=shenzhen_solitaire + +.PHONY: test coverage typing linting + +test: + python -m unittest discover + +coverage: + coverage run -m unittest discover && coverage report --skip-covered + +typing: + mypy --strict ${PROJECTNAME} test + +linting: + pylint ${PROJECTNAME} test diff --git a/main.py b/main.py deleted file mode 100644 index 8ae33f9..0000000 --- a/main.py +++ /dev/null @@ -1,98 +0,0 @@ -"""Main module""" -from typing import List, Tuple -from board import Board, NumberCard, SpecialCard -import board_possibilities -import board_actions - - -class SolitaireSolver: - """Solver for Shenzhen Solitaire""" - - search_board: Board - stack: List[Tuple[board_actions.Action, int]] - - -def main() -> None: - t: Board = Board() - t.field[0] = [ - SpecialCard.Fa, - NumberCard(NumberCard.Suit.Black, 8), - SpecialCard.Bai, - NumberCard(NumberCard.Suit.Black, 7), - SpecialCard.Zhong, - ] - - t.field[1] = [ - NumberCard(NumberCard.Suit.Red, 9), - SpecialCard.Zhong, - SpecialCard.Zhong, - NumberCard(NumberCard.Suit.Black, 4), - NumberCard(NumberCard.Suit.Black, 3), - ] - - t.field[2] = [ - SpecialCard.Hua, - NumberCard(NumberCard.Suit.Red, 1), - NumberCard(NumberCard.Suit.Red, 4), - NumberCard(NumberCard.Suit.Green, 1), - NumberCard(NumberCard.Suit.Red, 6), - ] - - t.field[3] = [ - SpecialCard.Bai, - SpecialCard.Zhong, - NumberCard(NumberCard.Suit.Red, 3), - NumberCard(NumberCard.Suit.Red, 7), - NumberCard(NumberCard.Suit.Green, 6), - ] - - t.field[4] = [ - NumberCard(NumberCard.Suit.Green, 7), - NumberCard(NumberCard.Suit.Green, 4), - NumberCard(NumberCard.Suit.Red, 5), - NumberCard(NumberCard.Suit.Green, 5), - NumberCard(NumberCard.Suit.Black, 6), - ] - - t.field[5] = [ - NumberCard(NumberCard.Suit.Green, 3), - SpecialCard.Bai, - SpecialCard.Fa, - NumberCard(NumberCard.Suit.Black, 2), - NumberCard(NumberCard.Suit.Black, 5), - ] - - t.field[6] = [ - SpecialCard.Fa, - NumberCard(NumberCard.Suit.Green, 9), - NumberCard(NumberCard.Suit.Green, 2), - NumberCard(NumberCard.Suit.Black, 9), - NumberCard(NumberCard.Suit.Red, 8), - ] - - t.field[7] = [ - SpecialCard.Bai, - NumberCard(NumberCard.Suit.Red, 2), - SpecialCard.Fa, - NumberCard(NumberCard.Suit.Black, 1), - NumberCard(NumberCard.Suit.Green, 8), - ] - - print(t.check_correct()) - step = list(board_possibilities.possible_actions(t)) - print(*step, sep="\n") - sequence = [ - 0, 4, 0, 1, 0, 0, 8, 0, 1, 3, 0, 9, 0, 2, 0, 1, 1, 1, 2, 0, 2, 1, 6, - 12, 0, 0, 1, 0, 0, 17, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ] - for x in sequence: - print("Executing " + str(step[x])) - step[x].apply(t) - print(t.goal) - step = list(board_possibilities.possible_actions(t)) - print(*enumerate(step), sep="\n") - print() - - -if __name__ == "__main__": - main() diff --git a/shenzhen_solitaire/__init__.py b/shenzhen_solitaire/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/board.py b/shenzhen_solitaire/board.py similarity index 99% rename from board.py rename to shenzhen_solitaire/board.py index 461bd4d..a8565c8 100644 --- a/board.py +++ b/shenzhen_solitaire/board.py @@ -1,7 +1,6 @@ """Contains board class""" import enum from typing import Union, List, Dict, Optional, Set, Tuple -import dataclasses from dataclasses import dataclass import itertools diff --git a/board_actions.py b/shenzhen_solitaire/board_actions.py similarity index 99% rename from board_actions.py rename to shenzhen_solitaire/board_actions.py index b7212e4..1620e24 100644 --- a/board_actions.py +++ b/shenzhen_solitaire/board_actions.py @@ -1,7 +1,7 @@ """Contains actions that can be used on the board""" from typing import List, Tuple, Union from dataclasses import dataclass -import board +from . import board @dataclass diff --git a/board_possibilities.py b/shenzhen_solitaire/board_possibilities.py similarity index 98% rename from board_possibilities.py rename to shenzhen_solitaire/board_possibilities.py index c97e1bb..8457c44 100644 --- a/board_possibilities.py +++ b/shenzhen_solitaire/board_possibilities.py @@ -1,7 +1,7 @@ """Contains function to iterate different kinds of possible actions""" -from typing import Iterator, List, Tuple -import board -import board_actions +from typing import Iterator, List +from . import board +from . import board_actions def possible_huakill_action( diff --git a/shenzhen_solitaire/solver.py b/shenzhen_solitaire/solver.py new file mode 100644 index 0000000..10dcaee --- /dev/null +++ b/shenzhen_solitaire/solver.py @@ -0,0 +1,11 @@ +"""Contains solver for solitaire""" +from typing import List, Tuple +from .board import Board +from . import board_actions + + +class SolitaireSolver: + """Solver for Shenzhen Solitaire""" + + search_board: Board + stack: List[Tuple[board_actions.Action, int]] diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/context.py b/test/context.py new file mode 100644 index 0000000..c0199b4 --- /dev/null +++ b/test/context.py @@ -0,0 +1,7 @@ +"""Adjust context to add the project to the search past""" +import os +import sys +sys.path.insert(0, os.path.abspath( + os.path.join(os.path.dirname(__file__), '..'))) + +import shenzhen_solitaire diff --git a/test/test_chain.py b/test/test_chain.py new file mode 100644 index 0000000..0a8b23b --- /dev/null +++ b/test/test_chain.py @@ -0,0 +1,129 @@ +"""Contains tests for chain module""" +import unittest + +from .context import shenzhen_solitaire # pylint: disable=unused-import +from shenzhen_solitaire.board import NumberCard, SpecialCard, Board # pylint: disable=wrong-import-order +from shenzhen_solitaire import board_possibilities # pylint: disable=wrong-import-order + + +class ChainTestClass(unittest.TestCase): + """Tests the chain class""" + + def test_sequence(self) -> None: + """Tests a given sequence. Might break if I change the iterators""" + my_board: Board = Board() + my_board.field[0] = [ + SpecialCard.Fa, + NumberCard(NumberCard.Suit.Black, 8), + SpecialCard.Bai, + NumberCard(NumberCard.Suit.Black, 7), + SpecialCard.Zhong, + ] + + my_board.field[1] = [ + NumberCard(NumberCard.Suit.Red, 9), + SpecialCard.Zhong, + SpecialCard.Zhong, + NumberCard(NumberCard.Suit.Black, 4), + NumberCard(NumberCard.Suit.Black, 3), + ] + + my_board.field[2] = [ + SpecialCard.Hua, + NumberCard(NumberCard.Suit.Red, 1), + NumberCard(NumberCard.Suit.Red, 4), + NumberCard(NumberCard.Suit.Green, 1), + NumberCard(NumberCard.Suit.Red, 6), + ] + + my_board.field[3] = [ + SpecialCard.Bai, + SpecialCard.Zhong, + NumberCard(NumberCard.Suit.Red, 3), + NumberCard(NumberCard.Suit.Red, 7), + NumberCard(NumberCard.Suit.Green, 6), + ] + + my_board.field[4] = [ + NumberCard(NumberCard.Suit.Green, 7), + NumberCard(NumberCard.Suit.Green, 4), + NumberCard(NumberCard.Suit.Red, 5), + NumberCard(NumberCard.Suit.Green, 5), + NumberCard(NumberCard.Suit.Black, 6), + ] + + my_board.field[5] = [ + NumberCard(NumberCard.Suit.Green, 3), + SpecialCard.Bai, + SpecialCard.Fa, + NumberCard(NumberCard.Suit.Black, 2), + NumberCard(NumberCard.Suit.Black, 5), + ] + + my_board.field[6] = [ + SpecialCard.Fa, + NumberCard(NumberCard.Suit.Green, 9), + NumberCard(NumberCard.Suit.Green, 2), + NumberCard(NumberCard.Suit.Black, 9), + NumberCard(NumberCard.Suit.Red, 8), + ] + + my_board.field[7] = [ + SpecialCard.Bai, + NumberCard(NumberCard.Suit.Red, 2), + SpecialCard.Fa, + NumberCard(NumberCard.Suit.Black, 1), + NumberCard(NumberCard.Suit.Green, 8), + ] + + self.assertTrue(my_board.check_correct()) + sequence = [ + 0, + 4, + 0, + 1, + 0, + 0, + 8, + 0, + 1, + 3, + 0, + 9, + 0, + 2, + 0, + 1, + 1, + 1, + 2, + 0, + 2, + 1, + 6, + 12, + 0, + 0, + 1, + 0, + 0, + 17, + 11, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0] + for action_index in sequence: + step = list(board_possibilities.possible_actions(my_board)) + step[action_index].apply(my_board)