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.pytestEnabled": false,
"python.testing.nosetestsEnabled": false, "python.testing.nosetestsEnabled": false,
"python.testing.unittestEnabled": true, "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 MAX_COLUMN_SIZE = 8
def __init__(self) -> None: def __init__(self) -> None:
self.field: List[List[Card]] = [[]] * Board.MAX_COLUMN_SIZE self._field: List[List[Card]] = [[]] * Board.MAX_COLUMN_SIZE
self.bunker: List[Union[Tuple[SpecialCard, int], Optional[Card]]] = [None] * 3 self._bunker: List[Union[Tuple[SpecialCard, int], Optional[Card]]] = [None] * 3
self.goal: List[Optional[NumberCard]] = [None] * 3 self._goal: List[Optional[NumberCard]] = [None] * 3
self.flower_gone: bool = False self._flower_gone: bool = False
def getGoal(self, suit: NumberCard.Suit) -> int: 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: if card is not None and card.suit == suit:
return card.number return card.number
else: else:
return 0 return 0
def setField(self, field: List[List[Card]]) -> None:
assert len(field) == 8
self._field = field
def getGoalId(self, suit: NumberCard.Suit) -> int: 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: if card is not None and card.suit == suit:
return index return index
else: else:
@@ -83,9 +87,9 @@ class Board:
assert 0 <= value assert 0 <= value
assert value <= 9 assert value <= 9
if value == 0: if value == 0:
self.goal[self.getGoalId(suit)] = None self._goal[self.getGoalId(suit)] = None
else: 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: def incGoal(self, suit: NumberCard.Suit) -> None:
self.setGoal(suit, self.getGoal(suit) + 1) self.setGoal(suit, self.getGoal(suit) + 1)
@@ -96,16 +100,16 @@ class Board:
return False return False
if any(not isinstance(x, tuple) for x in self.bunker): if any(not isinstance(x, tuple) for x in self.bunker):
return False return False
if not self.flower_gone: if not self._flower_gone:
return False return False
assert all(not x for x in self.field) assert all(not x for x in self._field)
return True return True
@property @property
def state_identifier(self) -> int: def state_identifier(self) -> int:
"""Returns a unique identifier to represent the board state""" """Returns a unique identifier to represent the board state"""
result: int = 0 result: int = 0
for card in self.bunker: for card in self._bunker:
result <<= 2 result <<= 2
if isinstance(card, tuple): if isinstance(card, tuple):
result |= 0 result |= 0
@@ -119,10 +123,10 @@ class Board:
result |= card.identifier() result |= card.identifier()
result <<= 1 result <<= 1
if self.flower_gone: if self._flower_gone:
result |= 1 result |= 1
assert len(self.goal) == 3 assert len(self._goal) == 3
suit_sequence = list(NumberCard.Suit) suit_sequence = list(NumberCard.Suit)
for card in self.goal: for card in self.goal:
result <<= 5 result <<= 5
@@ -134,12 +138,12 @@ class Board:
# Max stack size is 13 # Max stack size is 13
# (4 random cards from the start, plus a stack from 9 to 1) # (4 random cards from the start, plus a stack from 9 to 1)
# So 4 bits are sufficient # So 4 bits are sufficient
for stack in self.field: for stack in self._field:
assert len(stack) == len(stack) & 0b1111 assert len(stack) == len(stack) & 0b1111
result <<= 4 result <<= 4
result |= len(stack) 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 <<= 5
result |= field_card.identifier() result |= field_card.identifier()
@@ -159,12 +163,12 @@ class Board:
SpecialCard.Hua: 0, SpecialCard.Hua: 0,
} }
if self.flower_gone: if self._flower_gone == True:
special_cards[SpecialCard.Hua] += 1 special_cards[SpecialCard.Hua] += 1
for card in itertools.chain( for card in itertools.chain(
self.bunker, self._bunker,
itertools.chain.from_iterable(stack for stack in self.field if stack), itertools.chain.from_iterable(stack for stack in self._field if stack),
): ):
if isinstance(card, tuple): if isinstance(card, tuple):
special_cards[card[0]] += 4 special_cards[card[0]] += 4

View File

@@ -5,6 +5,9 @@
#include "goal.hpp" #include "goal.hpp"
%} %}
%include "std_array.i"
%include "std_string.i"
namespace solitaire { namespace solitaire {
enum class CardType : int { Zhong, Bai, Fa, Hua, Red, Green, Black }; 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 Suit = NumberCard.Suit
TEST_BOARD = Board() _TEST_BOARD_FIELDS = [None] * 8
TEST_BOARD.field[0] = [ _TEST_BOARD_FIELDS[0] = [
SpecialCard.Fa, SpecialCard.Fa,
NumberCard(NumberCard.Suit.Black, 8), NumberCard(NumberCard.Suit.Black, 8),
SpecialCard.Bai, SpecialCard.Bai,
@@ -12,7 +12,7 @@ TEST_BOARD.field[0] = [
SpecialCard.Zhong, SpecialCard.Zhong,
] ]
TEST_BOARD.field[1] = [ _TEST_BOARD_FIELDS[1] = [
NumberCard(NumberCard.Suit.Red, 9), NumberCard(NumberCard.Suit.Red, 9),
SpecialCard.Zhong, SpecialCard.Zhong,
SpecialCard.Zhong, SpecialCard.Zhong,
@@ -20,7 +20,7 @@ TEST_BOARD.field[1] = [
NumberCard(NumberCard.Suit.Black, 3), NumberCard(NumberCard.Suit.Black, 3),
] ]
TEST_BOARD.field[2] = [ _TEST_BOARD_FIELDS[2] = [
SpecialCard.Hua, SpecialCard.Hua,
NumberCard(NumberCard.Suit.Red, 1), NumberCard(NumberCard.Suit.Red, 1),
NumberCard(NumberCard.Suit.Red, 4), NumberCard(NumberCard.Suit.Red, 4),
@@ -28,7 +28,7 @@ TEST_BOARD.field[2] = [
NumberCard(NumberCard.Suit.Red, 6), NumberCard(NumberCard.Suit.Red, 6),
] ]
TEST_BOARD.field[3] = [ _TEST_BOARD_FIELDS[3] = [
SpecialCard.Bai, SpecialCard.Bai,
SpecialCard.Zhong, SpecialCard.Zhong,
NumberCard(NumberCard.Suit.Red, 3), NumberCard(NumberCard.Suit.Red, 3),
@@ -36,7 +36,7 @@ TEST_BOARD.field[3] = [
NumberCard(NumberCard.Suit.Green, 6), NumberCard(NumberCard.Suit.Green, 6),
] ]
TEST_BOARD.field[4] = [ _TEST_BOARD_FIELDS[4] = [
NumberCard(NumberCard.Suit.Green, 7), NumberCard(NumberCard.Suit.Green, 7),
NumberCard(NumberCard.Suit.Green, 4), NumberCard(NumberCard.Suit.Green, 4),
NumberCard(NumberCard.Suit.Red, 5), NumberCard(NumberCard.Suit.Red, 5),
@@ -44,7 +44,7 @@ TEST_BOARD.field[4] = [
NumberCard(NumberCard.Suit.Black, 6), NumberCard(NumberCard.Suit.Black, 6),
] ]
TEST_BOARD.field[5] = [ _TEST_BOARD_FIELDS[5] = [
NumberCard(NumberCard.Suit.Green, 3), NumberCard(NumberCard.Suit.Green, 3),
SpecialCard.Bai, SpecialCard.Bai,
SpecialCard.Fa, SpecialCard.Fa,
@@ -52,7 +52,7 @@ TEST_BOARD.field[5] = [
NumberCard(NumberCard.Suit.Black, 5), NumberCard(NumberCard.Suit.Black, 5),
] ]
TEST_BOARD.field[6] = [ _TEST_BOARD_FIELDS[6] = [
SpecialCard.Fa, SpecialCard.Fa,
NumberCard(NumberCard.Suit.Green, 9), NumberCard(NumberCard.Suit.Green, 9),
NumberCard(NumberCard.Suit.Green, 2), NumberCard(NumberCard.Suit.Green, 2),
@@ -60,16 +60,18 @@ TEST_BOARD.field[6] = [
NumberCard(NumberCard.Suit.Red, 8), NumberCard(NumberCard.Suit.Red, 8),
] ]
TEST_BOARD.field[7] = [ _TEST_BOARD_FIELDS[7] = [
SpecialCard.Bai, SpecialCard.Bai,
NumberCard(NumberCard.Suit.Red, 2), NumberCard(NumberCard.Suit.Red, 2),
SpecialCard.Fa, SpecialCard.Fa,
NumberCard(NumberCard.Suit.Black, 1), NumberCard(NumberCard.Suit.Black, 1),
NumberCard(NumberCard.Suit.Green, 8), NumberCard(NumberCard.Suit.Green, 8),
] ]
TEST_BOARD = Board()
TEST_BOARD.setField(_TEST_BOARD_FIELDS)
B20190809172206_1 = Board() _B20190809172206_1_FIELDS = [None] * 8
B20190809172206_1.field[0] = [ _B20190809172206_1_FIELDS[0] = [
NumberCard(Suit.Green, 6), NumberCard(Suit.Green, 6),
NumberCard(Suit.Green, 5), NumberCard(Suit.Green, 5),
NumberCard(Suit.Red, 4), NumberCard(Suit.Red, 4),
@@ -77,7 +79,7 @@ B20190809172206_1.field[0] = [
SpecialCard.Fa, SpecialCard.Fa,
] ]
B20190809172206_1.field[1] = [ _B20190809172206_1_FIELDS[1] = [
NumberCard(Suit.Black, 8), NumberCard(Suit.Black, 8),
NumberCard(Suit.Black, 6), NumberCard(Suit.Black, 6),
SpecialCard.Zhong, SpecialCard.Zhong,
@@ -85,33 +87,33 @@ B20190809172206_1.field[1] = [
NumberCard(Suit.Green, 7), NumberCard(Suit.Green, 7),
] ]
B20190809172206_1.field[2] = [ _B20190809172206_1_FIELDS[2] = [
SpecialCard.Zhong, SpecialCard.Zhong,
NumberCard(Suit.Black, 4), NumberCard(Suit.Black, 4),
NumberCard(Suit.Green, 2), NumberCard(Suit.Green, 2),
SpecialCard.Bai, SpecialCard.Bai,
SpecialCard.Zhong, SpecialCard.Zhong,
] ]
B20190809172206_1.field[3] = [ _B20190809172206_1_FIELDS[3] = [
NumberCard(Suit.Green, 1), NumberCard(Suit.Green, 1),
NumberCard(Suit.Green, 3), NumberCard(Suit.Green, 3),
NumberCard(Suit.Black, 5), NumberCard(Suit.Black, 5),
SpecialCard.Fa, SpecialCard.Fa,
SpecialCard.Fa, SpecialCard.Fa,
] ]
B20190809172206_1.field[4] = [ _B20190809172206_1_FIELDS[4] = [
NumberCard(Suit.Red, 8), NumberCard(Suit.Red, 8),
SpecialCard.Zhong, SpecialCard.Zhong,
NumberCard(Suit.Red, 7), NumberCard(Suit.Red, 7),
] ]
B20190809172206_1.field[5] = [ _B20190809172206_1_FIELDS[5] = [
SpecialCard.Fa, SpecialCard.Fa,
SpecialCard.Bai, SpecialCard.Bai,
NumberCard(Suit.Red, 2), NumberCard(Suit.Red, 2),
SpecialCard.Hua, SpecialCard.Hua,
SpecialCard.Bai, SpecialCard.Bai,
] ]
B20190809172206_1.field[6] = [ _B20190809172206_1_FIELDS[6] = [
NumberCard(Suit.Black, 2), NumberCard(Suit.Black, 2),
NumberCard(Suit.Green, 8), NumberCard(Suit.Green, 8),
NumberCard(Suit.Black, 7), NumberCard(Suit.Black, 7),
@@ -119,10 +121,12 @@ B20190809172206_1.field[6] = [
NumberCard(Suit.Red, 9), NumberCard(Suit.Red, 9),
] ]
B20190809172206_1.field[7] = [ _B20190809172206_1_FIELDS[7] = [
NumberCard(Suit.Red, 3), NumberCard(Suit.Red, 3),
NumberCard(Suit.Black, 3), NumberCard(Suit.Black, 3),
NumberCard(Suit.Green, 9), NumberCard(Suit.Green, 9),
NumberCard(Suit.Red, 5), NumberCard(Suit.Red, 5),
NumberCard(Suit.Red, 6), NumberCard(Suit.Red, 6),
] ]
B20190809172206_1 = Board()
B20190809172206_1.setField(_B20190809172206_1_FIELDS)