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"""
import enum
from typing import Union, List, Dict, Optional, Set, Tuple
import dataclasses
from dataclasses import dataclass
import itertools

View File

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

View File

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

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)