diff --git a/CMakeLists.txt b/CMakeLists.txt index 93bf249..8e5797e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,7 @@ project(tic_tac_toe) set(SOURCES src/main.cpp - src/window.cpp - src/elements.cpp + src/engine.cpp ) add_executable(tic_tac_toe ${SOURCES}) diff --git a/include/elements.hpp b/include/engine.hpp similarity index 60% rename from include/elements.hpp rename to include/engine.hpp index 7a3470d..3ad027a 100644 --- a/include/elements.hpp +++ b/include/engine.hpp @@ -2,6 +2,21 @@ #define ELEMENTS_HPP #include +#include +#include + +struct Window { + Window(); + std::array, ROW> view; + void clear_display(); + void draw_display(); +}; + +struct vec2 { + vec2(int x, int y) : x(x), y(y) {} + int x; + int y; +}; class Engine { public: @@ -10,18 +25,14 @@ public: void run(); private: - std::unique_ptr win; + std::unique_ptr win; struct Player { Player(char id) : id(id) {}; char id; }; - struct vec2 { - vec2(int x, int y) : x(x), y(y) {} - int x; - int y; - }; + const std::array map; struct GameState { Player player1; diff --git a/include/window.hpp b/include/window.hpp deleted file mode 100644 index 5593689..0000000 --- a/include/window.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef WINDOW_HPP -#define WINDOW_HPP - -#include -#include - -struct Window { - Window(); - std::array, ROW> view; - void clear_display(); - void draw_display(); -}; - -#endif diff --git a/src/elements.cpp b/src/engine.cpp similarity index 62% rename from src/elements.cpp rename to src/engine.cpp index d72ea7b..8bdb713 100644 --- a/src/elements.cpp +++ b/src/engine.cpp @@ -1,19 +1,48 @@ #include -#include +#include #include -#include #include #include #include #include -Engine::Engine() { +Window::Window() { + for(auto &val : view) { val.fill('.'); } + for(int i : std::ranges::views::iota(0, ROW)) { + for(int j : std::ranges::views::iota(0, COL)) { + if(i % 2 == 0 && j % 2 == 0) { view[i][j] = ' '; } + } + } +} + +void Window::draw_display() { + std::cout << "\033[H" << std::flush; // Clear screen + for(int i : std::ranges::views::iota(0, ROW)) { + for(int j : std::ranges::views::iota(0, COL)) { + if(view[i][j] != '.') { std::cout << view[i][j] << " "; } + if(view[i][j] == '.') { + if(i % 2 == 0) { std::cout << "| "; } + if(i % 2 != 0 && j % 2 == 0) { std::cout << "- "; } + if(i % 2 != 0 && j % 2 != 0) { std::cout << "+ "; } + } + } + std::cout << "\r\n"; + } +} + +Engine::Engine() : + map { + vec2 { 0, 0 }, vec2 { 2, 0 }, vec2 { 4, 0 }, + vec2 { 0, 2 }, vec2 { 2, 2 }, vec2 { 4, 2 }, + vec2 { 0, 4 }, vec2 { 2, 4 }, vec2 { 4, 4 } + } { initscr(); cbreak(); noecho(); curs_set(0); nodelay(stdscr, true); win = std::make_unique(); + } Engine::~Engine() {} @@ -52,36 +81,15 @@ bool Engine::exit_code() { } bool Engine::process_input() { - int ch; + int ch, index; while((ch = getch()) != ERR) { - if(ch == 113) { return false; } - if(ch == 49) { - win->view[0][0] = state.temp->id; - set_player(); - } if(ch == 50) { - win->view[0][2] = state.temp->id; - set_player(); - } if(ch == 51) { - win->view[0][4] = state.temp->id; - set_player(); - } if(ch == 52) { - win->view[2][0] = state.temp->id; - set_player(); - } if(ch == 53) { - win->view[2][2] = state.temp->id; - set_player(); - } if(ch == 54) { - win->view[2][4] = state.temp->id; - set_player(); - } if(ch == 55) { - win->view[4][0] = state.temp->id; - set_player(); - } if(ch == 56) { - win->view[4][2] = state.temp->id; - set_player(); - } if(ch == 57) { - win->view[4][4] = state.temp->id; - set_player(); + if(ch == 'q') { return false; } + if(ch >= '1' && ch <= '9') { + index = ch - '1'; + if(win->view[map[index].y][map[index].x] == ' ') { + win->view[map[index].y][map[index].x] = state.temp->id; + set_player(); + } } } return true; @@ -94,11 +102,13 @@ void Engine::set_player() { bool Engine::check_line(char id) { for(int i : std::ranges::views::iota(0, COL)) { + if(ROW % 2 != 0) continue; if(win->view[0][i] == id && win->view[2][i] == id && win->view[4][i] == id) { return true; } } for(int i : std::ranges::views::iota(0, ROW)) { + if(ROW % 2 != 0) continue; if(win->view[i][0] == id && win->view[i][2] == id && win->view[i][4] == id) { return true; } diff --git a/src/main.cpp b/src/main.cpp index 42618ae..bd9890c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include "elements.hpp" +#include "engine.hpp" int main() { Engine engine; diff --git a/src/window.cpp b/src/window.cpp deleted file mode 100644 index d4cd707..0000000 --- a/src/window.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include - -Window::Window() { - for(auto &val : view) { val.fill('.'); } - for(int i : std::ranges::views::iota(0, ROW)) { - for(int j : std::ranges::views::iota(0, COL)) { - if(i % 2 == 0 && j % 2 == 0) { view[i][j] = ' '; } - } - } -} - -void Window::draw_display() { - std::cout << "\033[H" << std::flush; // Clear screen - for(int i : std::ranges::views::iota(0, ROW)) { - for(int j : std::ranges::views::iota(0, COL)) { - if(view[i][j] != '.') { std::cout << view[i][j] << " "; } - if(view[i][j] == '.') { - if(i % 2 == 0) { std::cout << "| "; } - if(i % 2 != 0 && j % 2 == 0) { std::cout << "- "; } - if(i % 2 != 0 && j % 2 != 0) { std::cout << "+ "; } - } - } - std::cout << "\r\n"; - } -}