diff --git a/Game/Game.cpp b/Game/Game.cpp index 84f2ec02ea31f686800d977e244d4078353a58d9..a679bdf8a12c4af78664b0207d54bbd5ed924538 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 9d88de88a8de89fa36c095380888a2f449723a07..e69b739b529eb977f62d5e824172247f72e3afa8 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 0000000000000000000000000000000000000000..ec63c363d3bf7c12f9aa42ba2c7424283a5fa41e --- /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 93f301f474c97f8ca194b812d01a899f3fbe03d9..56e9ff9143762dc281b309a9690f6bb4b600b7a4 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