init board with pieces
This commit is contained in:
parent
edb429ce33
commit
a3855da7d5
8 changed files with 88 additions and 34 deletions
|
|
@ -17,6 +17,9 @@ public:
|
|||
int getWidth() const { return width; }
|
||||
int getHeight() const { return height; }
|
||||
Cell& getCell(int x, int y) { return grid[y][x]; }
|
||||
void setPiece(int x, int y, const Piece& piece) {
|
||||
grid[y][x].pieceId = std::make_shared<Piece>(piece);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace engine
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
#ifndef CELL_HPP
|
||||
#define CELL_HPP
|
||||
|
||||
#include "piece.hpp"
|
||||
#include <optional>
|
||||
#include <memory>
|
||||
|
||||
namespace engine {
|
||||
|
||||
struct PieceId;
|
||||
|
||||
struct Cell {
|
||||
std::optional<PieceId> pieceId;
|
||||
std::optional<std::shared_ptr<Piece>> pieceId;
|
||||
};
|
||||
|
||||
} // namespace engine
|
||||
|
|
|
|||
36
engine/core/game_state.cpp
Normal file
36
engine/core/game_state.cpp
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
# include "game_state.hpp"
|
||||
|
||||
namespace engine {
|
||||
|
||||
GameState::GameState() : board(8, 8) {
|
||||
|
||||
// white pieces
|
||||
board.setPiece(0, 0, Piece(PieceColor::WHITE, PieceType::ROOK));
|
||||
board.setPiece(1, 0, Piece(PieceColor::WHITE, PieceType::KNIGHT));
|
||||
board.setPiece(2, 0, Piece(PieceColor::WHITE, PieceType::BISHOP));
|
||||
board.setPiece(3, 0, Piece(PieceColor::WHITE, PieceType::QUEEN));
|
||||
board.setPiece(4, 0, Piece(PieceColor::WHITE, PieceType::KING));
|
||||
board.setPiece(5, 0, Piece(PieceColor::WHITE, PieceType::BISHOP));
|
||||
board.setPiece(6, 0, Piece(PieceColor::WHITE, PieceType::KNIGHT));
|
||||
board.setPiece(7, 0, Piece(PieceColor::WHITE, PieceType::ROOK));
|
||||
|
||||
for (int x = 0; x < 8; ++x) {
|
||||
board.setPiece(x, 1, Piece(PieceColor::WHITE, PieceType::PAWN));
|
||||
}
|
||||
|
||||
// black pieces
|
||||
board.setPiece(0, 7, Piece(PieceColor::BLACK, PieceType::ROOK));
|
||||
board.setPiece(1, 7, Piece(PieceColor::BLACK, PieceType::KNIGHT));
|
||||
board.setPiece(2, 7, Piece(PieceColor::BLACK, PieceType::BISHOP));
|
||||
board.setPiece(3, 7, Piece(PieceColor::BLACK, PieceType::QUEEN));
|
||||
board.setPiece(4, 7, Piece(PieceColor::BLACK, PieceType::KING));
|
||||
board.setPiece(5, 7, Piece(PieceColor::BLACK, PieceType::BISHOP));
|
||||
board.setPiece(6, 7, Piece(PieceColor::BLACK, PieceType::KNIGHT));
|
||||
board.setPiece(7, 7, Piece(PieceColor::BLACK, PieceType::ROOK));
|
||||
|
||||
for (int x = 0; x < 8; ++x) {
|
||||
board.setPiece(x, 6, Piece(PieceColor::BLACK, PieceType::PAWN));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace engine
|
||||
|
|
@ -4,32 +4,16 @@
|
|||
#include <optional>
|
||||
#include "piece.hpp"
|
||||
#include "move.hpp"
|
||||
#include "board.hpp"
|
||||
|
||||
namespace engine {
|
||||
|
||||
struct Cell {
|
||||
std::optional<PieceId> pieceId;
|
||||
// additional flags: trap, fog, etc.
|
||||
};
|
||||
|
||||
class GameState {
|
||||
private:
|
||||
Board board;
|
||||
|
||||
public:
|
||||
GameState();
|
||||
|
||||
int width() const;
|
||||
int height() const;
|
||||
bool isValid(const Coord& c) const;
|
||||
|
||||
const Cell& cellAt(const Coord& c) const;
|
||||
Cell& cellAt(const Coord& c);
|
||||
|
||||
// snapshot / clone
|
||||
GameState clone() const;
|
||||
|
||||
private:
|
||||
int w_ = 8;
|
||||
int h_ = 8;
|
||||
std::vector<Cell> cells_;
|
||||
};
|
||||
|
||||
} // namespace engine
|
||||
|
|
|
|||
|
|
@ -10,22 +10,31 @@ namespace engine {
|
|||
|
||||
struct Coord { int x; int y; };
|
||||
|
||||
using PieceId = int;
|
||||
|
||||
enum class MoveActionKind { Move, Capture, Create, Remove, SetFlag };
|
||||
enum class MoveActionKind {
|
||||
Move,
|
||||
Capture,
|
||||
Create,
|
||||
Remove,
|
||||
SetFlag
|
||||
};
|
||||
|
||||
struct MoveAction {
|
||||
MoveActionKind kind;
|
||||
PieceId piece; // 0 for create
|
||||
Coord from;
|
||||
Coord to;
|
||||
std::optional<int> extra;
|
||||
};
|
||||
|
||||
enum class MoveType { Normal, Capture, Castling, Promotion, Multi, CardEffect };
|
||||
enum class MoveType {
|
||||
Normal,
|
||||
Capture,
|
||||
Castling,
|
||||
Promotion,
|
||||
Multi,
|
||||
CardEffect
|
||||
};
|
||||
|
||||
struct Move {
|
||||
PieceId actor = 0;
|
||||
std::vector<MoveAction> actions;
|
||||
MoveType type = MoveType::Normal;
|
||||
int playerId = -1;
|
||||
|
|
|
|||
|
|
@ -9,10 +9,6 @@ namespace engine {
|
|||
class MoveGenerator {
|
||||
public:
|
||||
MoveGenerator();
|
||||
|
||||
// generate moves for a specific piece; pieceId == 0 -> all pieces for player
|
||||
std::vector<Move> generateForPlayer(const GameState& state, int playerId) const;
|
||||
std::vector<Move> generateForPiece(const GameState& state, PieceId pieceId) const;
|
||||
};
|
||||
|
||||
} // namespace engine
|
||||
|
|
|
|||
|
|
@ -7,7 +7,13 @@
|
|||
|
||||
namespace engine {
|
||||
|
||||
enum class MoveStatus { Ok, Illegal, BlockedByCard, OutOfBounds, RequiresConfirmation };
|
||||
enum class MoveStatus {
|
||||
Ok,
|
||||
Illegal,
|
||||
BlockedByCard,
|
||||
OutOfBounds,
|
||||
RequiresConfirmation
|
||||
};
|
||||
|
||||
struct MoveResult {
|
||||
MoveStatus status = MoveStatus::Ok;
|
||||
|
|
|
|||
|
|
@ -3,10 +3,30 @@
|
|||
|
||||
namespace engine {
|
||||
|
||||
enum class PieceColor {
|
||||
WHITE,
|
||||
BLACK
|
||||
};
|
||||
|
||||
enum class PieceType {
|
||||
PAWN,
|
||||
KNIGHT,
|
||||
BISHOP,
|
||||
ROOK,
|
||||
QUEEN,
|
||||
KING
|
||||
};
|
||||
|
||||
class Piece {
|
||||
private:
|
||||
PieceColor color;
|
||||
PieceType type;
|
||||
|
||||
public:
|
||||
Piece(PieceColor c, PieceType t) : color(c), type(t) {}
|
||||
|
||||
PieceColor getColor() const { return color; }
|
||||
PieceType getType() const { return type; }
|
||||
};
|
||||
|
||||
} // namespace engine
|
||||
|
|
|
|||
Loading…
Reference in a new issue