From cd1bc39bad0e385ceca3073b5c8a20cd6a1d33c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Sat, 21 Mar 2020 00:16:14 +0100 Subject: [PATCH] Started integrating c++ into python --- .vscode/settings.json | 3 +- shenzhen_solitaire/board.py | 40 ++++++++++++++----------- shenzhen_solitaire/c++/auxiliary/swig.i | 3 ++ test/boards.py | 40 ++++++++++++++----------- 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1730c2b..b4fb63f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,5 +9,6 @@ "python.testing.pytestEnabled": false, "python.testing.nosetestsEnabled": false, "python.testing.unittestEnabled": true, - "python.pythonPath": "/home/lukas/.local/share/virtualenvs/shenzhen-solitaire-nsu5dgrx/bin/python" + "python.pythonPath": "/home/lukas/.local/share/virtualenvs/shenzhen-solitaire-nsu5dgrx/bin/python", + "python.formatting.provider": "black" } \ No newline at end of file diff --git a/shenzhen_solitaire/board.py b/shenzhen_solitaire/board.py index 9d7209a..e55dee3 100644 --- a/shenzhen_solitaire/board.py +++ b/shenzhen_solitaire/board.py @@ -59,20 +59,24 @@ class Board: MAX_COLUMN_SIZE = 8 def __init__(self) -> None: - self.field: List[List[Card]] = [[]] * Board.MAX_COLUMN_SIZE - self.bunker: List[Union[Tuple[SpecialCard, int], Optional[Card]]] = [None] * 3 - self.goal: List[Optional[NumberCard]] = [None] * 3 - self.flower_gone: bool = False + self._field: List[List[Card]] = [[]] * Board.MAX_COLUMN_SIZE + self._bunker: List[Union[Tuple[SpecialCard, int], Optional[Card]]] = [None] * 3 + self._goal: List[Optional[NumberCard]] = [None] * 3 + self._flower_gone: bool = False def getGoal(self, suit: NumberCard.Suit) -> int: - for card in self.goal: + for card in self._goal: if card is not None and card.suit == suit: return card.number else: return 0 + def setField(self, field: List[List[Card]]) -> None: + assert len(field) == 8 + self._field = field + def getGoalId(self, suit: NumberCard.Suit) -> int: - for index, card in enumerate(self.goal): + for index, card in enumerate(self._goal): if card is not None and card.suit == suit: return index else: @@ -83,9 +87,9 @@ class Board: assert 0 <= value assert value <= 9 if value == 0: - self.goal[self.getGoalId(suit)] = None + self._goal[self.getGoalId(suit)] = None else: - self.goal[self.getGoalId(suit)] = NumberCard(suit, number=value) + self._goal[self.getGoalId(suit)] = NumberCard(suit, number=value) def incGoal(self, suit: NumberCard.Suit) -> None: self.setGoal(suit, self.getGoal(suit) + 1) @@ -96,16 +100,16 @@ class Board: return False if any(not isinstance(x, tuple) for x in self.bunker): return False - if not self.flower_gone: + if not self._flower_gone: return False - assert all(not x for x in self.field) + assert all(not x for x in self._field) return True @property def state_identifier(self) -> int: """Returns a unique identifier to represent the board state""" result: int = 0 - for card in self.bunker: + for card in self._bunker: result <<= 2 if isinstance(card, tuple): result |= 0 @@ -119,10 +123,10 @@ class Board: result |= card.identifier() result <<= 1 - if self.flower_gone: + if self._flower_gone: result |= 1 - assert len(self.goal) == 3 + assert len(self._goal) == 3 suit_sequence = list(NumberCard.Suit) for card in self.goal: result <<= 5 @@ -134,12 +138,12 @@ class Board: # Max stack size is 13 # (4 random cards from the start, plus a stack from 9 to 1) # So 4 bits are sufficient - for stack in self.field: + for stack in self._field: assert len(stack) == len(stack) & 0b1111 result <<= 4 result |= len(stack) - for field_card in itertools.chain.from_iterable(self.field): + for field_card in itertools.chain.from_iterable(self._field): result <<= 5 result |= field_card.identifier() @@ -159,12 +163,12 @@ class Board: SpecialCard.Hua: 0, } - if self.flower_gone: + if self._flower_gone == True: special_cards[SpecialCard.Hua] += 1 for card in itertools.chain( - self.bunker, - itertools.chain.from_iterable(stack for stack in self.field if stack), + self._bunker, + itertools.chain.from_iterable(stack for stack in self._field if stack), ): if isinstance(card, tuple): special_cards[card[0]] += 4 diff --git a/shenzhen_solitaire/c++/auxiliary/swig.i b/shenzhen_solitaire/c++/auxiliary/swig.i index 0d36755..bfcd4a6 100644 --- a/shenzhen_solitaire/c++/auxiliary/swig.i +++ b/shenzhen_solitaire/c++/auxiliary/swig.i @@ -5,6 +5,9 @@ #include "goal.hpp" %} +%include "std_array.i" +%include "std_string.i" + namespace solitaire { enum class CardType : int { Zhong, Bai, Fa, Hua, Red, Green, Black }; diff --git a/test/boards.py b/test/boards.py index f53a248..85c8a7a 100644 --- a/test/boards.py +++ b/test/boards.py @@ -3,8 +3,8 @@ from shenzhen_solitaire.board import Board, NumberCard, SpecialCard Suit = NumberCard.Suit -TEST_BOARD = Board() -TEST_BOARD.field[0] = [ +_TEST_BOARD_FIELDS = [None] * 8 +_TEST_BOARD_FIELDS[0] = [ SpecialCard.Fa, NumberCard(NumberCard.Suit.Black, 8), SpecialCard.Bai, @@ -12,7 +12,7 @@ TEST_BOARD.field[0] = [ SpecialCard.Zhong, ] -TEST_BOARD.field[1] = [ +_TEST_BOARD_FIELDS[1] = [ NumberCard(NumberCard.Suit.Red, 9), SpecialCard.Zhong, SpecialCard.Zhong, @@ -20,7 +20,7 @@ TEST_BOARD.field[1] = [ NumberCard(NumberCard.Suit.Black, 3), ] -TEST_BOARD.field[2] = [ +_TEST_BOARD_FIELDS[2] = [ SpecialCard.Hua, NumberCard(NumberCard.Suit.Red, 1), NumberCard(NumberCard.Suit.Red, 4), @@ -28,7 +28,7 @@ TEST_BOARD.field[2] = [ NumberCard(NumberCard.Suit.Red, 6), ] -TEST_BOARD.field[3] = [ +_TEST_BOARD_FIELDS[3] = [ SpecialCard.Bai, SpecialCard.Zhong, NumberCard(NumberCard.Suit.Red, 3), @@ -36,7 +36,7 @@ TEST_BOARD.field[3] = [ NumberCard(NumberCard.Suit.Green, 6), ] -TEST_BOARD.field[4] = [ +_TEST_BOARD_FIELDS[4] = [ NumberCard(NumberCard.Suit.Green, 7), NumberCard(NumberCard.Suit.Green, 4), NumberCard(NumberCard.Suit.Red, 5), @@ -44,7 +44,7 @@ TEST_BOARD.field[4] = [ NumberCard(NumberCard.Suit.Black, 6), ] -TEST_BOARD.field[5] = [ +_TEST_BOARD_FIELDS[5] = [ NumberCard(NumberCard.Suit.Green, 3), SpecialCard.Bai, SpecialCard.Fa, @@ -52,7 +52,7 @@ TEST_BOARD.field[5] = [ NumberCard(NumberCard.Suit.Black, 5), ] -TEST_BOARD.field[6] = [ +_TEST_BOARD_FIELDS[6] = [ SpecialCard.Fa, NumberCard(NumberCard.Suit.Green, 9), NumberCard(NumberCard.Suit.Green, 2), @@ -60,16 +60,18 @@ TEST_BOARD.field[6] = [ NumberCard(NumberCard.Suit.Red, 8), ] -TEST_BOARD.field[7] = [ +_TEST_BOARD_FIELDS[7] = [ SpecialCard.Bai, NumberCard(NumberCard.Suit.Red, 2), SpecialCard.Fa, NumberCard(NumberCard.Suit.Black, 1), NumberCard(NumberCard.Suit.Green, 8), ] +TEST_BOARD = Board() +TEST_BOARD.setField(_TEST_BOARD_FIELDS) -B20190809172206_1 = Board() -B20190809172206_1.field[0] = [ +_B20190809172206_1_FIELDS = [None] * 8 +_B20190809172206_1_FIELDS[0] = [ NumberCard(Suit.Green, 6), NumberCard(Suit.Green, 5), NumberCard(Suit.Red, 4), @@ -77,7 +79,7 @@ B20190809172206_1.field[0] = [ SpecialCard.Fa, ] -B20190809172206_1.field[1] = [ +_B20190809172206_1_FIELDS[1] = [ NumberCard(Suit.Black, 8), NumberCard(Suit.Black, 6), SpecialCard.Zhong, @@ -85,33 +87,33 @@ B20190809172206_1.field[1] = [ NumberCard(Suit.Green, 7), ] -B20190809172206_1.field[2] = [ +_B20190809172206_1_FIELDS[2] = [ SpecialCard.Zhong, NumberCard(Suit.Black, 4), NumberCard(Suit.Green, 2), SpecialCard.Bai, SpecialCard.Zhong, ] -B20190809172206_1.field[3] = [ +_B20190809172206_1_FIELDS[3] = [ NumberCard(Suit.Green, 1), NumberCard(Suit.Green, 3), NumberCard(Suit.Black, 5), SpecialCard.Fa, SpecialCard.Fa, ] -B20190809172206_1.field[4] = [ +_B20190809172206_1_FIELDS[4] = [ NumberCard(Suit.Red, 8), SpecialCard.Zhong, NumberCard(Suit.Red, 7), ] -B20190809172206_1.field[5] = [ +_B20190809172206_1_FIELDS[5] = [ SpecialCard.Fa, SpecialCard.Bai, NumberCard(Suit.Red, 2), SpecialCard.Hua, SpecialCard.Bai, ] -B20190809172206_1.field[6] = [ +_B20190809172206_1_FIELDS[6] = [ NumberCard(Suit.Black, 2), NumberCard(Suit.Green, 8), NumberCard(Suit.Black, 7), @@ -119,10 +121,12 @@ B20190809172206_1.field[6] = [ NumberCard(Suit.Red, 9), ] -B20190809172206_1.field[7] = [ +_B20190809172206_1_FIELDS[7] = [ NumberCard(Suit.Red, 3), NumberCard(Suit.Black, 3), NumberCard(Suit.Green, 9), NumberCard(Suit.Red, 5), NumberCard(Suit.Red, 6), ] +B20190809172206_1 = Board() +B20190809172206_1.setField(_B20190809172206_1_FIELDS)