From ecd40e46f99ac8efc203e0f63c1de37737badc20 Mon Sep 17 00:00:00 2001
From: Jakub Stromski <stromski.jakub.jan@gmail.com>
Date: Fri, 2 Dec 2022 16:52:05 +0100
Subject: [PATCH] Game "Wilki i owca"

---
 Game/Game.cpp     |   2 +-
 Source/source.txt |   6 +-
 Source/wio.txt    | 162 ++++++++++++++++++++++++++++++++++++++++++++++
 main.cpp          | 106 ++++++++++++++++++++++++++++++
 4 files changed, 272 insertions(+), 4 deletions(-)
 create mode 100644 Source/wio.txt

diff --git a/Game/Game.cpp b/Game/Game.cpp
index 84f2ec0..a679bdf 100644
--- a/Game/Game.cpp
+++ b/Game/Game.cpp
@@ -30,7 +30,7 @@ void Game::nextMove()
 	while (true)
 	{
 		std::string move_name = players->makeMove(state_data, moves_map);
-		if (moves->makeMove(move_name))	// Break if valid mowe was executed
+		if (moves->makeMove(move_name))	// Break if valid move was executed
 			break;
 	}
 
diff --git a/Source/source.txt b/Source/source.txt
index 9d88de8..e69b739 100644
--- a/Source/source.txt
+++ b/Source/source.txt
@@ -41,9 +41,9 @@ MOVES
 	{ 
 		IF(#.amount <= 0) { RETURN false; }
 		
-		IF(#.stack == 0 && #.amount <= $.a && #.amount > 0) { RETURN true; } // Comment
-		IF(#.stack == 1 && #.amount <= $.b && #.amount > 0) { RETURN true; }
-		IF(#.stack == 2 && #.amount <= $.c && #.amount > 0) { RETURN true; }
+		IF(#.stack == 0 && #.amount <= $.a) { RETURN true; } // Comment
+		IF(#.stack == 1 && #.amount <= $.b) { RETURN true; }
+		IF(#.stack == 2 && #.amount <= $.c) { RETURN true; }
 		RETURN false; 
 	})
 	[]
diff --git a/Source/wio.txt b/Source/wio.txt
new file mode 100644
index 0000000..ec63c36
--- /dev/null
+++ b/Source/wio.txt
@@ -0,0 +1,162 @@
+PLAYERS
+[
+	owca[1];
+	wilki[1];
+]
+
+STATE 
+[
+	INT o_x = 3;
+	INT o_y = 7;
+	
+	INT w0_x = 0;
+	INT w0_y = 0;
+	INT w1_x = 2;
+	INT w1_y = 0;
+	INT w2_x = 4;
+	INT w2_y = 0;
+	INT w3_x = 6;
+	INT w3_y = 0;
+]
+([]{})
+
+MAIN_RULE
+[
+	o
+	([]
+	{ 
+		IF($.o_y == 0)
+		{
+			RETURN true;
+		}
+		RETURN false; 
+	}) 
+	owca
+	[]{ RETURN 1; }
+	wilki
+	[]{ RETURN -1; }
+	
+	%
+	
+	w
+	([
+		INT move_x = 0;
+		INT move_y = 0;
+	]
+	{ 
+		move_x = $.o_x - 1;
+		move_y = $.o_y - 1;
+		IF ( 	move_x >= 0 && move_y >= 0 &&
+				(move_x != $.w0_x || move_y != $.w0_y) &&
+				(move_x != $.w1_x || move_y != $.w1_y) &&
+				(move_x != $.w2_x || move_y != $.w2_y) &&
+				(move_x != $.w3_x || move_y != $.w3_y))
+		{ RETURN false; }
+		
+		move_x = $.o_x - 1;
+		move_y = $.o_y + 1;
+		IF ( 	move_x >= 0 && move_y <= 7 &&
+				(move_x != $.w0_x || move_y != $.w0_y) &&
+				(move_x != $.w1_x || move_y != $.w1_y) &&
+				(move_x != $.w2_x || move_y != $.w2_y) &&
+				(move_x != $.w3_x || move_y != $.w3_y))
+		{ RETURN false; }
+		
+		move_x = $.o_x + 1;
+		move_y = $.o_y - 1;
+		IF ( 	move_x <= 7 && move_y >= 0 &&
+				(move_x != $.w0_x || move_y != $.w0_y) &&
+				(move_x != $.w1_x || move_y != $.w1_y) &&
+				(move_x != $.w2_x || move_y != $.w2_y) &&
+				(move_x != $.w3_x || move_y != $.w3_y))
+		{ RETURN false; }
+		
+		move_x = $.o_x + 1;
+		move_y = $.o_y + 1;
+		IF ( 	move_x <= 7 && move_y <= 7 &&
+				(move_x != $.w0_x || move_y != $.w0_y) &&
+				(move_x != $.w1_x || move_y != $.w1_y) &&
+				(move_x != $.w2_x || move_y != $.w2_y) &&
+				(move_x != $.w3_x || move_y != $.w3_y))
+		{ RETURN false; }
+		
+		RETURN true;
+	}) 
+	owca
+	[]{ RETURN -1; }
+	wilki
+	[]{ RETURN 1; }
+]
+
+MOVES
+[
+	owca<owca> 
+	[
+		INT move_x = 0;
+		INT move_y = 0;
+	] 
+	([ INT d_x = 0; INT d_y = 0;]
+	{ 
+		d_x = $.o_x - #.move_x;
+		d_y = $.o_y - #.move_y;
+		
+		IF((d_x != 1 && d_x != -1) || (d_y != 1 && d_y != -1)) { RETURN false;}
+		
+		IF ( 	(#.move_x == $.w0_x && #.move_y == $.w0_y) ||
+				(#.move_x == $.w1_x && #.move_y == $.w1_y) ||
+				(#.move_x == $.w2_x && #.move_y == $.w2_y) ||
+				(#.move_x == $.w3_x && #.move_y == $.w3_y))
+		{ RETURN false; }
+		
+		RETURN true;
+	})
+	[]
+	{
+		$.o_x = #.move_x;
+		$.o_y = #.move_y;
+		
+		& = wilki[0];
+	}
+	
+	%
+	
+	wilki<wilki> 
+	[
+		INT wilk_indeks = 0;
+		INT move_x = 0;
+		INT move_y = 0;
+	] 
+	([ INT wilk_x = 0; INT wilk_y = 0;
+	INT d_x = 0; INT d_y = 0;]
+	{		
+		IF (#.wilk_indeks < 0 || #.wilk_indeks > 3) { RETURN false; }
+
+		IF (#.wilk_indeks == 0) { wilk_x = $.w0_x; wilk_y = $.w0_y; }
+		IF (#.wilk_indeks == 1) { wilk_x = $.w1_x; wilk_y = $.w1_y; }
+		IF (#.wilk_indeks == 2) { wilk_x = $.w2_x; wilk_y = $.w2_y; }
+		IF (#.wilk_indeks == 3) { wilk_x = $.w3_x; wilk_y = $.w3_y; }
+		
+		IF (#.move_y != wilk_y + 1) { RETURN false; }
+		IF (#.move_x != wilk_x + 1 && #.move_x != wilk_x - 1) { RETURN false; }
+		
+		IF (#.move_x > 7) { RETURN false; }
+		IF (#.move_y > 7 || #.move_y < 0) { RETURN false; }
+		
+		IF (#.move_x == $.o_x && #.move_y == $.o_y) { RETURN false; }
+		IF (#.move_x == $.w0_x && #.move_y == $.w0_y) { RETURN false; }
+		IF (#.move_x == $.w1_x && #.move_y == $.w1_y) { RETURN false; }
+		IF (#.move_x == $.w2_x && #.move_y == $.w2_y) { RETURN false; }
+		IF (#.move_x == $.w3_x && #.move_y == $.w3_y) { RETURN false; }
+		
+		RETURN true;
+	})
+	[]
+	{
+		IF (#.wilk_indeks == 0) { $.w0_x = #.move_x; $.w0_y = #.move_y; }
+		IF (#.wilk_indeks == 1) { $.w1_x = #.move_x; $.w1_y = #.move_y; }
+		IF (#.wilk_indeks == 2) { $.w2_x = #.move_x; $.w2_y = #.move_y; }
+		IF (#.wilk_indeks == 3) { $.w3_x = #.move_x; $.w3_y = #.move_y; }
+		
+		& = owca[0];
+	}
+]
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
index 93f301f..56e9ff9 100644
--- a/main.cpp
+++ b/main.cpp
@@ -39,14 +39,120 @@ public:
 	}
 };
 
+void printBoard(DataSet* board)
+{
+	int o_x = *(int*)board->getValuePtr("o_x");
+	int o_y = *(int*)board->getValuePtr("o_y");
+	int w_x[4];
+	int w_y[4];
+
+	for (int i = 0; i < 4; i++) w_x[i] = *(int*)board->getValuePtr("w" + std::to_string(i) + "_x");
+	for (int i = 0; i < 4; i++) w_y[i] = *(int*)board->getValuePtr("w" + std::to_string(i) + "_y");
+
+	for(int j = 7; j >= 0; j--)
+	{
+		for (int i = 0; i < 8; i++)
+		{
+			if (o_x == i && o_y == j) std::cout << 'O';
+			else if (w_x[0] == i && w_y[0] == j ||
+				w_x[1] == i && w_y[1] == j ||
+				w_x[2] == i && w_y[2] == j ||
+				w_x[3] == i && w_y[3] == j) std::cout << 'W';
+
+			else if (i % 2 == j % 2) std::cout << (char) 219;
+			else std::cout << ' ';
+		}
+		std::cout << '\n';
+	}
+	std::cout << "\n\n";
+}
+
+class Owca : public IPlayer
+{
+public:
+	Owca() {}
+
+	std::string makeMove(DataSet* state_data, std::unordered_map<std::string, DataSet*> moves_map) override {
+		printBoard(state_data);
+
+		DataSet* move = moves_map.at("owca");
+		int x, y;
+
+		std::cout << "X: ";
+		std::cin >> x;
+
+		std::cout << "Y: ";
+		std::cin >> y;
+
+		move->setInt("move_x", x);
+		move->setInt("move_y", y);
+
+		std::cout << "\n\n";
+
+		return "owca";
+	}
+
+	void Payoff(int payoff) override {
+		std::cout << "Owca: " << payoff << '\n';
+	}
+};
+class Wilki : public IPlayer
+{
+public:
+	Wilki() {}
+
+	std::string makeMove(DataSet* state_data, std::unordered_map<std::string, DataSet*> moves_map) override {
+		printBoard(state_data);
+
+		DataSet* move = moves_map.at("wilki");
+		int index, x, y;
+
+		std::cout << "Wilk: ";
+		std::cin >> index;
+
+		std::cout << "X: ";
+		std::cin >> x;
+
+		std::cout << "Y: ";
+		std::cin >> y;
+
+		move->setInt("wilk_indeks", index);
+		move->setInt("move_x", x);
+		move->setInt("move_y", y);
+
+		std::cout << "\n\n";
+
+		return "wilki";
+	}
+
+	void Payoff(int payoff) override {
+		std::cout << "Owca: " << payoff << '\n';
+	}
+};
+
+void wioTest()
+{
+	Owca* owca = new Owca();
+	Wilki* wilki = new Wilki();
+	Game* game = Compiler().createGame("Source/wio.txt");
+	game->setPlayer(owca, "owca", 0);
+	game->setPlayer(wilki, "wilki", 0);
+	game->startGame();
+}
+
 int main(int argc, char* argv[])
 {
+	/*/
+	wioTest();
+
+	/*/
 	consolePlayer* player_a = new consolePlayer("a");
 	consolePlayer* player_b = new consolePlayer("b");
 	Game* game = Compiler().createGame("Source/source.txt");
 	game->setPlayer(player_a, "player", 0);
 	game->setPlayer(player_b, "player", 1);
 	game->startGame();
+	//*/
 
 	return 0;
 }
\ No newline at end of file
-- 
GitLab