Sista v3.0.0-alpha.1
Sista is a C++ lightweight OS-agnostic library for terminal animations and videogames
Loading...
Searching...
No Matches
field.hpp
Go to the documentation of this file.
1
26#pragma once
27
28#include <vector> // std::vector
29#include <memory> // std::shared_ptr, std::move
30#include <map> // std::map
31#include <set> // std::set
32#include "pawn.hpp"
33#include "border.hpp"
34#include "cursor.hpp"
35
36namespace sista {
50 enum class Effect { // Effect enum - effect when a coordinate is out of bounds
51 PACMAN = 0, // Pacman effect when a coordinate overflows
52 MATRIX = 1 // Classic C style matrix effect when a coordinate overflows
53 };
54
71 class Field { // Field class - represents the field [parent class]
72 protected:
74 std::vector<std::vector<std::shared_ptr<Pawn>>> pawns;
76 int width;
77 int height;
82 void cleanCoordinates(const Coordinates&) const;
87 void cleanCoordinates(unsigned short, unsigned short) const;
88
89 public:
93 void clear();
94
105 Field(int, int);
107 ~Field();
108
118 void print() const;
129 void print(char) const;
141 void print(Border&) const;
142
154 virtual void addPawn(std::shared_ptr<Pawn>);
166 virtual void removePawn(Pawn*);
178 virtual void removePawn(const Coordinates&);
190 virtual void erasePawn(Pawn*);
202 virtual void erasePawn(const Coordinates&);
203
215 void addPrintPawn(std::shared_ptr<Pawn>);
226 void rePrintPawn(Pawn*);
227
241 void movePawn(Pawn*, const Coordinates&);
258 void movePawn(Pawn*, unsigned short, unsigned short);
259
274 void movePawnBy(Pawn*, const Coordinates&);
290 void movePawnBy(Pawn*, unsigned short, unsigned short);
291
292 // 🎮 movePawnBy() with arcade game effects on coordinates overflow
311 void movePawnBy(Pawn*, const Coordinates&, Effect);
329 void movePawnBy(Pawn*, short int, short int, Effect);
330
347 void movePawnFromTo(const Coordinates&, const Coordinates&);
366 void movePawnFromTo(unsigned short, unsigned short, unsigned short, unsigned short);
367
384 Coordinates movingByCoordinates(Pawn*, short int, short int) const;
403 Coordinates movingByCoordinates(Pawn*, short int, short int, Effect) const; // movingByCoordinates - calculate the coordinates of a pawn after a movement
404
418 Pawn* getPawn(const Coordinates&) const;
433 Pawn* getPawn(unsigned short, unsigned short) const;
434
448 bool isOccupied(const Coordinates&) const;
463 bool isOccupied(unsigned short, unsigned short) const;
479 bool isOccupied(short int, short int) const;
480
491 bool isOutOfBounds(const Coordinates&) const;
503 bool isOutOfBounds(unsigned short, unsigned short) const;
517 bool isOutOfBounds(short int, short int) const;
518
532 bool isFree(const Coordinates&) const;
547 bool isFree(unsigned short, unsigned short) const;
563 bool isFree(short int, short int) const;
564
578 void validateCoordinates(const Coordinates&) const;
593 void validateCoordinates(unsigned short, unsigned short) const;
594 };
595
611 struct Path {
612 static long long int current_priority;
631
642 bool operator|(const Path&) const;
652 bool operator<(const Path&) const;
663 bool operator==(const Path&) const;
664 };
665}
666
667namespace std {
676 template<>
677 struct hash<sista::Path> {
678 std::size_t operator()(const sista::Path& k) const noexcept {
679 auto h1 = std::hash<sista::Coordinates>{}(k.begin);
680 auto h2 = std::hash<sista::Coordinates>{}(k.end);
681 return h1 ^ (h2 << 1);
682 }
683 };
684}
685
686namespace sista {
701 class SwappableField final : public Field {
702 private:
704 std::vector<std::vector<short int>> pawnsCount;
706 std::set<Path> pawnsToSwap;
707
708 Coordinates firstInvalidCell(std::map<Coordinates, short int>&) const; // firstInvalidCell - find the first cell with 2 or more pawns
709
717 void clearPawnsToSwap(); // clearPawnsToSwap - clear the pawnsToSwap
718
719 public:
730 SwappableField(int, int);
733
747 void addPawn(std::shared_ptr<Pawn>) override; // addPawn - add a pawn to the field
761 void removePawn(Pawn*) override; // removePawn - remove a pawn from the field
762
780 void addPawnToSwap(Pawn*, const Coordinates&); // addPawnToSwap - add a pawn to the pawnsToSwap
796 void addPawnToSwap(Path&); // addPawnToSwap - add a path to the pawnsToSwap
797
808 void simulateSwaps(); // simulateSwaps - simulate the swaps of the pawnsToSwap
817 void applySwaps(); // applySwaps - apply the swaps of the pawnsToSwap
818
830 void swapTwoPawns(const Coordinates&, const Coordinates&);
841 void swapTwoPawns(Pawn*, Pawn*);
842 };
843};
Border class header file.
Represents a brick of the border with a symbol and ANSI settings.
Definition: border.hpp:34
Represents a 2D grid where Pawns can be placed, moved, and managed.
Definition: field.hpp:71
void movePawn(Pawn *, const Coordinates &)
Moves a Pawn to new coordinates.
Definition: field.cpp:171
Pawn * getPawn(const Coordinates &) const
Gets the Pawn at specified coordinates.
Definition: field.cpp:260
Cursor cursor
Definition: field.hpp:75
void addPrintPawn(std::shared_ptr< Pawn >)
Adds a Pawn to the field at its specified coordinates and prints it.
Definition: field.cpp:161
~Field()
Destructor to clean up resources.
Definition: field.cpp:41
int height
Definition: field.hpp:77
void cleanCoordinates(const Coordinates &) const
Cleans the coordinates on screen by printing spaces.
Definition: field.cpp:151
Coordinates movingByCoordinates(Pawn *, short int, short int) const
Calculates the new coordinates of a Pawn after moving by a relative offset.
Definition: field.cpp:371
std::vector< std::vector< std::shared_ptr< Pawn > > > pawns
2D grid of shared pointers to Pawn objects.
Definition: field.hpp:74
void validateCoordinates(const Coordinates &) const
Validates that the given coordinates are within bounds and not occupied.
Definition: field.cpp:298
virtual void erasePawn(Pawn *)
Removes a Pawn from the field at specified coordinates.
Definition: field.cpp:141
void movePawnBy(Pawn *, const Coordinates &)
Moves a Pawn by a relative offset.
Definition: field.cpp:197
void movePawnFromTo(const Coordinates &, const Coordinates &)
Moves a Pawn from one set of coordinates to another.
Definition: field.cpp:247
bool isFree(const Coordinates &) const
Checks if specified coordinates are free (not occupied by a Pawn).
Definition: field.cpp:287
virtual void addPawn(std::shared_ptr< Pawn >)
Adds a Pawn to the field at its specified coordinates.
Definition: field.cpp:132
int width
Definition: field.hpp:76
virtual void removePawn(Pawn *)
Removes a Pawn from the field.
Definition: field.cpp:135
void print() const
Prints the entire field to the terminal.
Definition: field.cpp:48
void clear()
Clears the field by removing all Pawns and resetting the grid.
Definition: field.cpp:26
bool isOutOfBounds(const Coordinates &) const
Checks if specified coordinates are out of bounds.
Definition: field.cpp:277
bool isOccupied(const Coordinates &) const
Checks if specified coordinates are occupied by a Pawn.
Definition: field.cpp:267
void rePrintPawn(Pawn *)
Reprints a Pawn at its current coordinates.
Definition: field.cpp:166
Represents an object on the field with a symbol, coordinates, and ANSI settings.
Definition: pawn.hpp:37
A specialized Field that handles Pawn swaps without conflicts.
Definition: field.hpp:701
void addPawn(std::shared_ptr< Pawn >) override
Adds a Pawn to the field and updates the pawnsCount grid.
Definition: field.cpp:354
void simulateSwaps()
Simulates the swaps of the pawnsToSwap and removes unfeasible paths.
Definition: field.cpp:453
void swapTwoPawns(const Coordinates &, const Coordinates &)
Swaps two Pawns at the specified coordinates.
Definition: field.cpp:519
~SwappableField()
Destructor to clean up resources.
Definition: field.cpp:347
void applySwaps()
Applies the swaps of the pawnsToSwap to the field.
Definition: field.cpp:497
void removePawn(Pawn *) override
Removes a Pawn from the field and updates the pawnsCount grid.
Definition: field.cpp:359
void addPawnToSwap(Pawn *, const Coordinates &)
Adds a Pawn to the set of pawnsToSwap.
Definition: field.cpp:416
Cursor manipulation header file.
Sista library namespace.
Definition: ansi.cpp:25
Effect
Enumeration for handling out-of-bounds coordinates.
Definition: field.hpp:50
Definition: coordinates.hpp:115
Pawn class header file.
Represents 2D coordinates with x and y values.
Definition: coordinates.hpp:31
Manages terminal cursor operations.
Definition: cursor.hpp:132
Represents a movement path for a Pawn, including priority handling.
Definition: field.hpp:611
bool operator==(const Path &) const
Overloaded operator to check if two paths are equal (same begin and end coordinates).
Definition: field.cpp:324
int priority
Definition: field.hpp:613
Coordinates end
Definition: field.hpp:615
bool operator|(const Path &) const
Overloaded operator to check if two paths are opposite (reverse of each other).
Definition: field.cpp:315
static long long int current_priority
Definition: field.hpp:612
bool operator<(const Path &) const
Overloaded operator to compare paths based on priority.
Definition: field.cpp:321
Pawn * pawn
Definition: field.hpp:616
Coordinates begin
Definition: field.hpp:614
std::size_t operator()(const sista::Path &k) const noexcept
Definition: field.hpp:678