Started integrating c++ into python
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -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"
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user