Started integrating c++ into python

This commit is contained in:
Lukas Wölfer
2020-03-21 00:16:14 +01:00
parent 5af5282aab
commit cd1bc39bad
4 changed files with 49 additions and 37 deletions

View File

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

View File

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

View File

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

View File

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