Worked on c++

This commit is contained in:
Lukas Wölfer
2020-03-20 00:12:32 +01:00
parent de72585989
commit 5af5282aab
8 changed files with 209 additions and 18 deletions

View File

@@ -5,6 +5,7 @@ cmake_minimum_required(VERSION 3.16)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include( "common" )
add_library(board STATIC lib/board.cpp)
add_library(board STATIC lib/board.cpp lib/card.cpp lib/goal.cpp)
set_property(TARGET board PROPERTY CXX_STANDARD 17)
target_include_directories(board PUBLIC include)
target_include_directories(board PUBLIC include)
add_subdirectory(auxiliary)

View File

@@ -0,0 +1,12 @@
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
find_package(PythonLibs REQUIRED)
set_property(SOURCE swig.i PROPERTY CPLUSPLUS ON)
swig_add_library(shenzhen_python TYPE SHARED LANGUAGE PYTHON SOURCES swig.i)
target_include_directories(shenzhen_python PUBLIC ${PYTHON_INCLUDE_PATH})
target_link_libraries(shenzhen_python PUBLIC board)
set_property(TARGET shenzhen_python PROPERTY CXX_STANDARD 17)

View File

@@ -0,0 +1,54 @@
%module shenzhen
%{
#include "board.hpp"
#include "card.hpp"
#include "goal.hpp"
%}
namespace solitaire {
enum class CardType : int { Zhong, Bai, Fa, Hua, Red, Green, Black };
auto isNormalCardType(CardType type) -> bool;
struct Card {
CardType type;
int value;
auto toString() const noexcept -> std::string;
};
class Goal {
std::array<std::optional<Card>, 3> goal{};
auto getEmptyId() -> std::optional<int>;
public:
auto getId(CardType suit) const noexcept -> std::optional<int>;
auto get(CardType suit) const noexcept -> std::optional<int>;
void set(CardType suit, int value) noexcept;
void inc(CardType suit) noexcept;
};
struct BunkerField {
std::optional<Card> card;
bool empty{};
bool closed{};
};
inline constexpr int MAX_ROW_SIZE = 13;
inline constexpr int MAX_COLUMN_SIZE = 8;
class Stack {
std::array<std::optional<Card>, MAX_COLUMN_SIZE> values{};
};
struct Board {
std::array<Stack, MAX_ROW_SIZE> field{};
std::array<BunkerField, 3> bunker{};
Goal goal{};
bool flower_gone{};
auto solved() const noexcept -> bool;
auto hash() const noexcept -> std::size_t;
auto correct() const noexcept -> bool;
};
}

View File

@@ -1,27 +1,35 @@
#pragma once
#include "card.hpp"
#include "goal.hpp"
#include <array>
#include <cassert>
#include <optional>
namespace solitaire {
class Card {
bool isNormalCard();
bool isSpecialCard();
struct BunkerField {
std::optional<Card> card;
bool empty{};
bool closed{};
};
struct BunkerField{
Card card;
bool empty;
bool closed;
inline constexpr int MAX_ROW_SIZE = 13;
inline constexpr int MAX_COLUMN_SIZE = 8;
class Stack {
std::array<std::optional<Card>, MAX_COLUMN_SIZE> values{};
};
class Board {
public:
static constexpr int MAX_ROW_SIZE = 13;
static constexpr int MAX_COLUMN_SIZE = 8;
struct Board {
std::array<Stack, MAX_ROW_SIZE> field{};
std::array<BunkerField, 3> bunker{};
Goal goal{};
bool flower_gone{};
private:
std::array<std::array<Card, MAX_COLUMN_SIZE>, MAX_ROW_SIZE> field;
std::array<BunkerField, 3> bunker;
std::array<std::optional<Card>, 3> goal;
bool flower_gone;
[[nodiscard]] auto solved() const noexcept -> bool;
[[nodiscard]] auto hash() const noexcept -> std::size_t;
[[nodiscard]] auto correct() const noexcept -> bool;
};
} // namespace solitaire

View File

@@ -0,0 +1,15 @@
#pragma once
#include <cassert>
#include <string>
namespace solitaire {
enum class CardType : int { Zhong, Bai, Fa, Hua, Red, Green, Black };
auto isNormalCardType(CardType type) -> bool;
struct Card {
CardType type;
int value;
[[nodiscard]] auto toString() const noexcept -> std::string;
};
} // namespace solitaire

View File

@@ -0,0 +1,20 @@
#pragma once
#include "card.hpp"
#include <array>
#include <optional>
namespace solitaire {
class Goal {
std::array<std::optional<Card>, 3> goal{};
auto getEmptyId() -> std::optional<int>;
public:
[[nodiscard]] auto getId(CardType suit) const noexcept -> std::optional<int>;
[[nodiscard]] auto get(CardType suit) const noexcept -> std::optional<int>;
void set(CardType suit, int value) noexcept;
void inc(CardType suit) noexcept;
};
} // namespace solitaire

View File

@@ -0,0 +1,15 @@
#include "card.hpp"
namespace solitaire {
auto
isNormalCardType(CardType type) -> bool {
switch (type) {
case CardType::Red:
case CardType::Green:
case CardType::Black:
return true;
break;
default:
return false;
}
}
} // namespace solitaire

View File

@@ -0,0 +1,66 @@
#include "goal.hpp"
namespace solitaire {
auto
Goal::getEmptyId() -> std::optional<int> {
int counter = 0;
for (const auto& slot : goal) {
if (!slot) {
return counter;
}
++counter;
}
return std::nullopt;
}
[[nodiscard]] auto
Goal::getId(CardType suit) const noexcept -> std::optional<int> {
int counter = 0;
for (const auto& slot : goal) {
if (slot && slot->type == suit) {
return counter;
}
++counter;
}
return std::nullopt;
}
[[nodiscard]] auto
Goal::get(CardType suit) const noexcept -> std::optional<int> {
if (auto index = getId(suit); index) {
return goal[*index]->value;
}
return std::nullopt;
}
void
Goal::set(CardType suit, int value) noexcept {
assert(value >= 0);
assert(value <= 9);
const auto card = [&]() -> std::optional<Card> {
if (value == 0) {
return std::nullopt;
}
return Card{suit, value};
}();
const int goal_index = [&]() -> int {
if (auto index = getId(suit); index) {
return *index;
}
return *getEmptyId();
}();
goal[goal_index] = card;
}
void
Goal::inc(CardType suit) noexcept {
auto get_value = get(suit);
int new_value = get_value ? (*get_value) + 1 : 1;
set(suit, new_value);
}
} // namespace solitaire