diff --git a/include/element.hpp b/include/element.hpp index 9276a76..23bd140 100644 --- a/include/element.hpp +++ b/include/element.hpp @@ -14,12 +14,13 @@ struct Point { Point() : m_row(0), m_col(0), m_symbol(' ') {} Point(int x, int y, char s) : m_row(x), m_col(y), m_symbol(s) {} Point(int x, int y, char s, int d) : m_row(x), m_col(y), m_symbol(s), m_direction(d) {} + void to_string(); void set_new_point(int row, int col); - void set_new_point(Point &point); }; -void get_new_pos(Point* (*board)[COL], Point** segments); -void check_new_tail(Point** segments); +void determine_index_zero_pos(Point* (*board)[COL], Point** segments); +bool check_new_tail(Point** segments); +void move_tail_indicies(Point** segments); struct Head { Head() : m_direction(2) {}; diff --git a/include/window.hpp b/include/window.hpp index 953a2b9..1e0c283 100644 --- a/include/window.hpp +++ b/include/window.hpp @@ -6,7 +6,8 @@ struct Window { Point* m_board[ROW][COL] = {}; - void draw_display(); + void clear_display(); + void draw_display(int milliseconds); void update_display(Point* segments[]); }; diff --git a/src/element.cpp b/src/element.cpp index 645d55d..6a68cf1 100644 --- a/src/element.cpp +++ b/src/element.cpp @@ -4,15 +4,83 @@ #include #include +void determine_index_zero_pos(Point* (*board)[COL], Point** segments) { + Point new_point; + Point old_point; + + new_point.set_new_point(segments[0]->m_row, segments[0]->m_col); + old_point.set_new_point(segments[0]->m_row, segments[0]->m_col); + + if (segments[0]->m_direction == -1) { + if (new_point.m_col <= 0) new_point.m_col = COL - 1; + else new_point.m_col--; + } else if (segments[0]->m_direction == 1) { + if (new_point.m_col >= COL - 1) new_point.m_col = 0; + else new_point.m_col++; + } else if (segments[0]->m_direction == -2) { + if (new_point.m_row <= 0) new_point.m_row = ROW - 1; + else new_point.m_row--; + } else if (segments[0]->m_direction == 2) { + if (new_point.m_row >= ROW - 1) new_point.m_row = 0; + else new_point.m_row++; + } + if(segments[1] == nullptr) { + segments[1] = new Point { old_point.m_row, old_point.m_col, '.' }; + } else { + segments[1]->set_new_point(old_point.m_row, old_point.m_col); + } + board[segments[0]->m_row][segments[0]->m_col] = nullptr; + segments[0]->set_new_point(new_point.m_row, new_point.m_col); + board[segments[0]->m_row][segments[0]->m_col] = segments[0]; +} + +void move_tail_indicies(Point** segments) { + Point* previous_head = segments[1]; + int new_row = segments[1]->m_row; + int new_col = segments[1]->m_col; + Point* index; + for(int i = 10; i >= 2; i--) { + if(segments[i] == nullptr) { + index = segments[i - 1]; + continue; + } + segments[i] = segments[i - 1]; + } + + segments[2] = index; + segments[2]->set_new_point(new_row, new_col); +} + +bool check_new_tail(Point** segments) { + int size = 0; + std::cout << size << "\n"; + for(int i = 1; i < ROW * COL; i++) { + if(segments[i] == nullptr) continue; + size++; + } + if(_score + 1 > size) { + for(int i = 0; i < ROW * COL; i++) { + if(segments[i] != nullptr) continue; + if(segments[i] == nullptr) { + if(segments[i - 1]->m_direction == -1) { + segments[i] = new Point { segments[i - 1]->m_row, segments[i - 1]->m_col + 1, '@', segments[i - 1]->m_direction }; + return true; + } + } + } + } + return false; +} + +void Point::to_string() { + std::cout << "(" << m_row << ", " << m_col << ")\n"; +} + void Point::set_new_point(int row, int col) { m_row = row; m_col = col; } -void Point::set_new_point(Point &point) { - set_new_point(point.m_row, point.m_col); -} - Fruit::Fruit() { m_point.set_new_point((rand() % ROW), (rand() % COL)); } @@ -29,30 +97,6 @@ void Fruit::get_new_pos(char (&board)[ROW][COL], Head &head) { } } -void get_new_pos(Point* (*board)[COL], Point** segments) { - Point new_point; - new_point.m_row = segments[0]->m_row; - new_point.m_col = segments[0]->m_col; - - if (segments[0]->m_direction == -1) { - if (new_point.m_col <= 0) new_point.m_col = COL - 1; - else new_point.m_col--; - } else if (segments[0]->m_direction == 1) { - if (new_point.m_col >= COL - 1) new_point.m_col = 0; - else new_point.m_col++; - } else if (segments[0]->m_direction == -2) { - if (new_point.m_row <= 0) new_point.m_row = ROW - 1; - else new_point.m_row--; - } else if (segments[0]->m_direction == 2) { - if (new_point.m_row >= ROW - 1) new_point.m_row = 0; - else new_point.m_row++; - } - board[segments[0]->m_row][segments[0]->m_col] = nullptr; - segments[0]->m_row = new_point.m_row; - segments[0]->m_col = new_point.m_col; - board[segments[0]->m_row][segments[0]->m_col] = segments[0]; -} - bool Body::check_collision(Head &head) { for(int i = 0; i < m_body.size(); i++) { if(m_body[i].m_tail_pos.m_row != head.m_head.m_row) continue; @@ -62,42 +106,13 @@ bool Body::check_collision(Head &head) { return false; } -void check_new_tail(Point** segments) { - int size = 0; - std::cout << size << "\n"; - for(int i = 1; i < ROW * COL; i++) { - if(segments[i] == nullptr) continue; - size++; - } - if(_score + 1 > size) { - for(int i = 0; i < ROW * COL; i++) { - if(segments[i] != nullptr) continue; - if(segments[i] == nullptr) { - if(segments[i - 1]->m_direction == -1) { - segments[i] = new Point { segments[i - 1]->m_row, segments[i - 1]->m_col + 1, '@', segments[i - 1]->m_direction }; - } - else if(segments[i - 1]->m_direction == 1) { - segments[i] = new Point { segments[i - 1]->m_row, segments[i - 1]->m_col - 1, '@', segments[i - 1]->m_direction }; - } - else if(segments[i - 1]->m_direction == -2) { - segments[i] = new Point { segments[i - 1]->m_row + 1, segments[i - 1]->m_col, '@', segments[i - 1]->m_direction }; - } - else if(segments[i - 1]->m_direction == 2) { - segments[i] = new Point { segments[i - 1]->m_row - 1, segments[i - 1]->m_col, '@', segments[i - 1]->m_direction }; - } - return; - } - } - } -} - -void Body::get_new_pos(Head &head) { - if(m_body.empty()) return; - m_body[0].m_previous_tail_pos.set_new_point(head.m_previous_head); - for (int i = 1; i < m_body.size(); i++) { - m_body[i].m_previous_tail_pos.set_new_point(m_body[i - 1].m_tail_pos); - } - for (int i = 0; i < m_body.size(); i++) { - m_body[i].m_tail_pos.set_new_point(m_body[i].m_previous_tail_pos); - } -} +// void Body::get_new_pos(Head &head) { +// if(m_body.empty()) return; +// m_body[0].m_previous_tail_pos.set_new_point(head.m_previous_head); +// for (int i = 1; i < m_body.size(); i++) { +// m_body[i].m_previous_tail_pos.set_new_point(m_body[i - 1].m_tail_pos); +// } +// for (int i = 0; i < m_body.size(); i++) { +// m_body[i].m_tail_pos.set_new_point(m_body[i].m_previous_tail_pos); +// } +// } diff --git a/src/main.cpp b/src/main.cpp index 347c1c0..8143e1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,7 @@ #include "input.hpp" int main () { + // int g = 0; std::srand(std::time(0)); Window window; Input input; @@ -15,17 +16,115 @@ int main () { Point* segments[ROW * COL] = {}; segments[0] = new Point { 5, 5, '*', 1 }; - segments[1] = new Point { 6, 5, '@', 0 }; + segments[2] = new Point { 3, 5, '@', 0 }; + segments[3] = new Point { 4, 5, '@', 0 }; + segments[4] = new Point { 5, 5, '@', 0 }; + segments[5] = new Point { 6, 5, '@', 0 }; + // segments[3] = new Point { 4, 5, '@', 0 }; + // segments[4] = new Point { 5, 5, '@', 0 }; + // segments[5] = new Point { 6, 5, '@', 0 }; - std::thread input_thread( - &Input::get_input, &input, - std::ref(segments[0]->m_direction), - std::ref(running), - std::ref(_score)); + for(int i = 0; i < 10; i++) { + if(segments[i] != nullptr) segments[i]->to_string(); + else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + } + std::cout << "\n"; + Point* index; + for(int i = 10; i >= 2; i--) { + if(segments[i] == nullptr) { + index = segments[i - 1]; + continue; + } + segments[i] = segments[i - 1]; + } - while (running) { - get_new_pos(window.m_board, segments); - check_new_tail(segments); + segments[2] = index; + for(int i = 0; i < 10; i++) { + if(segments[i] != nullptr) segments[i]->to_string(); + else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + } + std::cout << "\n"; + segments[6] = new Point { 0, 0, '@', 0 }; + for(int i = 0; i < 10; i++) { + if(segments[i] != nullptr) segments[i]->to_string(); + else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + } + std::cout << "\n"; + for(int i = 10; i >= 2; i--) { + if(segments[i] == nullptr) { + index = segments[i - 1]; + continue; + } + segments[i] = segments[i - 1]; + } + + segments[2] = index; + for(int i = 0; i < 10; i++) { + if(segments[i] != nullptr) segments[i]->to_string(); + else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + } + std::cout << "\n"; + // segments[2]->set_new_point(new_row, new_col); + // move_tail_indicies(segments); + // for(int i = 0; i < 10; i++) { + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + // for(int i = ROW * COL; i > 0; i--) { + // if(segments[i] == nullptr) continue; + // if(segments[i] != nullptr) { + // segments[i] = new Point{ 10, 10, '*', 0 }; + // break; + // } + // } + // for(int i = 0; i < 10; i++) { + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + // move_tail_indicies(segments); + // for(int i = 0; i < 10; i++) { + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + // move_tail_indicies(segments); + // for(int i = 0; i < 10; i++) { + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + + // std::thread input_thread( + // &Input::get_input, &input, + // std::ref(segments[0]->m_direction), + // std::ref(running), + // std::ref(_score)); + + // while (g < 5) { + // while (running) { + // for(int i = 0; i < 10; i++) { + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + // determine_index_zero_pos(window.m_board, segments); + // move_tail_indicies(segments); + // g++; + // for(int i = 0; i < ROW; i++) { + // for(int j = 0; j < COL; j++) { + // if(window.m_board[i][j] == nullptr) std::cout << "0 "; + // if(window.m_board[i][j] != nullptr) std::cout << "p "; + // } + // std::cout << "\r\n"; + // if(segments[i] != nullptr) segments[i]->to_string(); + // else if(segments[i] == nullptr) std::cout << "NULLPTR" << "\n"; + // } + // std::cout << "\n"; + // segments[0]->to_string(); + // segments[1]->to_string(); + // check_new_tail(segments); // body.check_new_tail(); // if(body.m_body.size() >= (ROW * COL)) { // std::cout << "You win! Score: " + std::to_string(body.m_body.size()) << std::endl; @@ -39,16 +138,16 @@ int main () { // body.get_new_pos(head); // // head.m_previous_head.set_new_point(head.m_head); - std::cout << _score << "\n"; - window.draw_display(); - window.update_display(segments); - } - for(int i = 0; i < ROW; i++) { - for(int j = 0; j < COL; j++) { - delete window.m_board[i][j]; - } + // std::cout << _score << "\n"; + // window.clear_display(); + // window.update_display(segments); + // window.draw_display(200); + // } + // input_thread.join(); + for(int i = 0; i < ROW * COL; i++) { + if(segments[i] == nullptr) continue; + delete segments[i]; } - input_thread.join(); return 0; } diff --git a/src/window.cpp b/src/window.cpp index 9297056..6d139e4 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3,7 +3,16 @@ #include #include -void Window::draw_display() { +void Window::clear_display() { + for(int i = 0; i < ROW; i++) { + for(int j = 0; j < COL; j++) { + m_board[i][j] = nullptr; + } + } + +} + +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++) { @@ -12,11 +21,12 @@ void Window::draw_display() { } std::cout << "\r\n"; } - std::this_thread::sleep_for(std::chrono::milliseconds((int) (200))); // 1000 / fps; 200ms = 5fps + std::this_thread::sleep_for(std::chrono::milliseconds((int) (milliseconds))); // 1000 / fps; 200ms = 5fps } void Window::update_display(Point* segments[]) { - for(int i = 0; i < ROW * COL; i++) { + m_board[segments[0]->m_row][segments[0]->m_col] = segments[0]; + for(int i = 2; i < ROW * COL; i++) { if(segments[i] != nullptr) { m_board[segments[i]->m_row][segments[i]->m_col] = segments[i]; }