diff --git a/include/elements.hpp b/include/elements.hpp index aa3b78b..fc7a8ee 100644 --- a/include/elements.hpp +++ b/include/elements.hpp @@ -1,34 +1,24 @@ #ifndef ELEMENTS_HPP #define ELEMENTS_HPP +struct Point; +struct Player; +void cleanup(Point** buffer, int buffer_size); +void allocate_points(Point** buffer, char symbol); +Player* get_current_player(Player* current_player, Player* player_one, Player* player_two); + struct Point { Point(int row, int col, char symbol) : m_row(row), m_col(col), m_symbol(symbol) {}; int m_row; int m_col; char m_symbol; - void assign(int row, int col); }; -// struct Tile { -// Tile(int row, int col) : m_pos(row, col), m_symbol(' '), _delete(false) {}; -// Tile(int row, int col, char symbol) : m_pos(row, col), m_symbol(symbol), _delete(false) {}; -// char m_symbol; -// Point m_pos; -// bool _delete; -// }; -// -// struct Border { -// Border(int row, int col, char symbol) : m_pos(row, col), m_symbol(symbol) {}; -// char m_symbol; -// Point m_pos; -// }; -// -// struct Player { -// Player(char symbol, bool turn) : m_symbol(symbol), m_turn(turn), m_win(false) {}; -// char m_symbol; -// bool m_turn; -// bool m_win; -// void check_line(Tile (&tile_list)[9]); -// }; +struct Player { + Player(char symbol, bool turn, int id) : m_symbol(symbol), m_id(id) {}; + char m_symbol; + int m_id; + bool on_line(Point** buffer); +}; #endif diff --git a/include/globals.hpp b/include/globals.hpp index dd317c3..b1e15d1 100644 --- a/include/globals.hpp +++ b/include/globals.hpp @@ -2,6 +2,6 @@ #define GLOBALS_HPP #define ROW 5 #define COL 5 -#define FMPS 150 +#define FMPS 16 #endif diff --git a/include/input.hpp b/include/input.hpp index 7eef53c..05a935b 100644 --- a/include/input.hpp +++ b/include/input.hpp @@ -4,8 +4,7 @@ struct Input { int _getch = 0; - // void get_input(bool &running, Tile (&tile_list)[9], Player &player_one, Player &player_two); - void get_input(bool &running); + void get_input(bool &running, Point** buffer, Player *¤t_player, Player *player_one, Player *player_two); }; #endif diff --git a/src/elements.cpp b/src/elements.cpp index ca97a9c..d1c36b9 100644 --- a/src/elements.cpp +++ b/src/elements.cpp @@ -1,25 +1,53 @@ #include "elements.hpp" +#include "globals.hpp" + +void cleanup(Point** buffer, int buffer_size) { + for(int i = 0; i < buffer_size; i++) { + delete buffer[i]; + } -void cleanup(Point** buffer) { - } -// void Player::check_line(Tile (&tile_list)[9]) { -// for(int i = 0; i <= 6; i += 3) { -// if(tile_list[i].m_symbol == tile_list[i+1].m_symbol && tile_list[i+1].m_symbol == tile_list[i+2].m_symbol) { -// if(tile_list[i].m_symbol == m_symbol) { -// m_win = true; -// } -// } -// } -// if(tile_list[0].m_symbol == tile_list[4].m_symbol && tile_list[4].m_symbol == tile_list[8].m_symbol) { -// if(tile_list[0].m_symbol == m_symbol) { -// m_win = true; -// } -// } -// if(tile_list[2].m_symbol == tile_list[4].m_symbol && tile_list[4].m_symbol == tile_list[6].m_symbol) { -// if(tile_list[2].m_symbol == m_symbol) { -// m_win = true; -// } -// } -// } +void allocate_points(Point** buffer, char symbol) { + int index = 0; + for(int i = 0; i < ROW; i += 2) { + for(int a = 0; a < ROW; a += 2) { + buffer[index++] = new Point { i, a, symbol }; + } + } +} + +Player* get_current_player(Player* current_player, Player* player_one, Player* player_two) { + if(current_player == nullptr) { current_player = player_one; } + else if(current_player->m_id == 1) { current_player = player_two; } + else if(current_player->m_id == 2) { current_player = player_one; } + return current_player; +} + +bool Player::on_line(Point** buffer) { + for(int i = 0; i <= 6; i += 3) { + if(buffer[i]->m_symbol == buffer[i+1]->m_symbol && buffer[i+1]->m_symbol == buffer[i+2]->m_symbol) { + if(buffer[i]->m_symbol == m_symbol) { + return true; + } + } + } + for(int i = 0; i < 3; i++) { + if(buffer[i]->m_symbol == buffer[i+3]->m_symbol && buffer[i+3]->m_symbol == buffer[i+6]->m_symbol) { + if(buffer[i]->m_symbol == m_symbol) { + return true; + } + } + } + if(buffer[0]->m_symbol == buffer[4]->m_symbol && buffer[4]->m_symbol == buffer[8]->m_symbol) { + if(buffer[0]->m_symbol == m_symbol) { + return true; + } + } + if(buffer[2]->m_symbol == buffer[4]->m_symbol && buffer[4]->m_symbol == buffer[6]->m_symbol) { + if(buffer[2]->m_symbol == m_symbol) { + return true; + } + } + return false; +} diff --git a/src/input.cpp b/src/input.cpp index 1241066..c1c9ba5 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -1,26 +1,52 @@ #include #include "input.hpp" +#include "elements.hpp" -// void _switch_turn(int favor, Player &player_one, Player &player_two) { -// if(favor == 1) { -// player_one.m_turn = true; -// player_two.m_turn = false; -// } else if(favor == 2) { -// player_one.m_turn = false; -// player_two.m_turn = true; -// } -// } - -// void Input::get_input(bool &running, Tile (&tile_list)[9], Player &player_one, Player &player_two) { -void Input::get_input(bool &running) { +void Input::get_input(bool &running, Point** buffer, Player *¤t_player, Player *player_one, Player *player_two) { while(running) { initscr(); cbreak(); noecho(); - _getch = getch(); - endwin(); + if(_getch >= 49 && _getch <= 57) { + if(_getch == 49 && buffer[0]->m_symbol == ' ') { + buffer[0]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 50 && buffer[1]->m_symbol == ' ') { + buffer[1]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 51 && buffer[2]->m_symbol == ' ') { + buffer[2]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 52 && buffer[3]->m_symbol == ' ') { + buffer[3]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 53 && buffer[4]->m_symbol == ' ') { + buffer[4]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 54 && buffer[5]->m_symbol == ' ') { + buffer[5]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 55 && buffer[6]->m_symbol == ' ') { + buffer[6]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 56 && buffer[7]->m_symbol == ' ') { + buffer[7]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + else if(_getch == 57 && buffer[8]->m_symbol == ' ') { + buffer[8]->m_symbol = current_player->m_symbol; + current_player = get_current_player(current_player, player_one, player_two); + } + } if(_getch == 113) { running = false; } diff --git a/src/main.cpp b/src/main.cpp index 9a12a04..2632d3c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,53 +4,52 @@ #include "input.hpp" #include "elements.hpp" +bool should_exit(Point** buffer, Player &one, Player &two, bool &running) { + int i, index = 0; + if(one.on_line(buffer)) { + std::cout << "Game Over! Player 1 wins!" << std::endl; + return true; + } else if(two.on_line(buffer)) { + std::cout << "Game Over! Player 2 wins!" << std::endl; + return true; + } + for(i = 0; i < 9; i++) { + if(buffer[i]->m_symbol != ' ' && !one.on_line(buffer) && !one.on_line(buffer)) { + index++; + } + } + if(index == 9) { + std::cout << "Game Over! Its a tie!" << std::endl; + return true; + } else { + index = 0; + } + return false; +} + int main() { Input input; Window window; - // Player player_one('x', true); - // Player player_two('o', false); + Player player_one('x', true, 1); + Player player_two('o', false, 2); + Player* default_player = get_current_player(nullptr, &player_one, &player_two); bool running = true; int count = 0; - Point* buffer[ROW * COL] = {}; + Point* buffer[9] = {}; + allocate_points(buffer, ' '); - // Tile tile_list[9] = { - // Tile(0, 0), Tile(0, 2), Tile(0, 4), - // Tile(2, 0), Tile(2, 2), Tile(2, 4), - // Tile(4, 0), Tile(4, 2), Tile(4, 4) - // }; - // - // Border border_list[16] = { - // Border(0, 1, '|'), Border(0, 3, '|'), - // Border(1, 0, '-'), Border(1, 1, '+'), Border(1, 2, '-'), Border(1, 3, '+'), Border(1, 4, '-'), - // Border(2, 1, '|'), Border(2, 3, '|'), - // Border(3, 0, '-'), Border(3, 1, '+'), Border(3, 2, '-'), Border(3, 3, '+'), Border(3, 4, '-'), - // Border(4, 1, '|'), Border(4, 3, '|'), - // }; - - std::thread input_thread([&] { input.get_input(running); } ); + std::thread input_thread([&] { input.get_input(running, buffer, default_player, &player_one, &player_two); } ); while (running) { + if(should_exit(buffer, player_one, player_two, running)) { + running = false; + } window.clear_display(); window.update_display(buffer); window.draw_display(150); - // window.terminate(tile_list, running); - // window.update_display(tile_list, border_list); - // player_one.check_line(tile_list); - // player_two.check_line(tile_list); - // if(player_one.m_win) { - // running = false; - // std::cout << "Game Over! Player 1 wins!" << std::endl; - // } else if(player_two.m_win) { - // running = false; - // std::cout << "Game Over! Player 2 wins!" << std::endl; - // } - // if(player_one.m_turn) { - // std::cout << "Current Player: " << player_one.m_symbol << std::endl; - // } if(player_two.m_turn) { - // std::cout << "Current Player: " << player_two.m_symbol << std::endl; - // } + std::cout << "Current Player: " << default_player->m_symbol << std::endl; } - + cleanup(buffer, 9); input_thread.join(); return 0; } diff --git a/src/window.cpp b/src/window.cpp index 32d6d7d..05a8b24 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -30,8 +30,12 @@ void Window::clear_display() { void Window::draw_display(int milliseconds) { std::cout << "\033[H" << std::flush; // Clear screen for(int i = 0; i < ROW; i++) { - for(int j = 0; j < ROW; j++) { - if(m_board[i][j] == nullptr) { std::cout << ". "; } + for(int j = 0; j < COL; j++) { + if(m_board[i][j] == nullptr) { + if(i % 2 == 0) { std::cout << "| "; } + if(i % 2 != 0 && j % 2 == 0) { std::cout << "- "; } + if(i % 2 != 0 && j % 2 != 0) { std::cout << "+ "; } + } if(m_board[i][j] != nullptr) { std::cout << m_board[i][j]->m_symbol << " "; } } std::cout << "\r\n"; @@ -40,7 +44,7 @@ void Window::draw_display(int milliseconds) { } void Window::update_display(Point** buffer) { - for(int i = 0; i < ROW * COL; i++) { + for(int i = 0; i < 9; i++) { if(buffer[i] != nullptr) { m_board[buffer[i]->m_row][buffer[i]->m_col] = buffer[i]; }