Increased project structure

This commit is contained in:
Lukas Wölfer
2019-04-10 02:02:58 +02:00
parent 44f47f4691
commit 92e2f7f4a1
10 changed files with 166 additions and 103 deletions

15
Makefile Normal file
View File

@@ -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

98
main.py
View File

@@ -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()

View File

View File

@@ -1,7 +1,6 @@
"""Contains board class""" """Contains board class"""
import enum import enum
from typing import Union, List, Dict, Optional, Set, Tuple from typing import Union, List, Dict, Optional, Set, Tuple
import dataclasses
from dataclasses import dataclass from dataclasses import dataclass
import itertools import itertools

View File

@@ -1,7 +1,7 @@
"""Contains actions that can be used on the board""" """Contains actions that can be used on the board"""
from typing import List, Tuple, Union from typing import List, Tuple, Union
from dataclasses import dataclass from dataclasses import dataclass
import board from . import board
@dataclass @dataclass

View File

@@ -1,7 +1,7 @@
"""Contains function to iterate different kinds of possible actions""" """Contains function to iterate different kinds of possible actions"""
from typing import Iterator, List, Tuple from typing import Iterator, List
import board from . import board
import board_actions from . import board_actions
def possible_huakill_action( def possible_huakill_action(

View File

@@ -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]]

0
test/__init__.py Normal file
View File

7
test/context.py Normal file
View File

@@ -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

129
test/test_chain.py Normal file
View File

@@ -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)