From ac23c873c35aa0abc0b9914785b95a0a30e4d975 Mon Sep 17 00:00:00 2001 From: DarthMooMancer <107283522+DarthMooMancer@users.noreply.github.com> Date: Wed, 27 Aug 2025 19:29:09 -0400 Subject: [PATCH] feat: (snake point main) finally got tail to work with a few bugs --- include/globals.hpp | 2 +- include/point.hpp | 1 + include/snake.hpp | 4 ++- src/main.cpp | 44 +++++++++++++++-------------- src/point.cpp | 6 ++++ src/snake.cpp | 68 +++------------------------------------------ 6 files changed, 38 insertions(+), 87 deletions(-) diff --git a/include/globals.hpp b/include/globals.hpp index ca4a378..9cd596a 100644 --- a/include/globals.hpp +++ b/include/globals.hpp @@ -5,6 +5,6 @@ constexpr uint16_t ROW = 10; constexpr uint16_t COL = 10; -constexpr uint16_t FPS = 2; +constexpr uint16_t FPS = 5; #endif // GLOBALS_HPP diff --git a/include/point.hpp b/include/point.hpp index 55a3284..228965d 100644 --- a/include/point.hpp +++ b/include/point.hpp @@ -15,6 +15,7 @@ struct Point { std::string to_string() const; void clear(std::array, ROW> &arr) const; + void set_new_point(int x, int y, int dir); }; #endif // POINT_HPP diff --git a/include/snake.hpp b/include/snake.hpp index f4eee28..de4aff1 100644 --- a/include/snake.hpp +++ b/include/snake.hpp @@ -33,8 +33,10 @@ struct Head { struct Tail { Tail(int follow_direction, int row, int col); Point m_tail_pos; + Point m_previous_tail_pos; std::vector m_move_history; - void get_new_point(Point &d); + // void set_point(Point &d); + void get_new_point(); }; struct Body { diff --git a/src/main.cpp b/src/main.cpp index 7e1dc5c..1d87685 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -17,42 +18,43 @@ int main (int argc, char *argv[]) { Body body; Head head { 2, 0, 0 }; bool running = true; - // std::thread input_thread(&Input::get_input, &input, std::ref(head.m_head.m_direction), std::ref(running)); + std::thread input_thread(&Input::get_input, &input, std::ref(head.m_head.m_direction), std::ref(running)); int count = 0; - /* TODO - * Each tail is not meant to follow the head. Each tail should follow the tail or head in front of it. Tail 6 should follow tail 5 and not the head. - */ + body.m_body.push_back(Tail{2, 0, 0}); + body.m_body.push_back(Tail{2, 0, 0}); + body.m_body.push_back(Tail{2, 0, 0}); + body.m_body.push_back(Tail{2, 0, 0}); body.m_body.push_back(Tail{2, 0, 0}); body.m_body.push_back(Tail{2, 0, 0}); while (running) { - // if(tail.m_tail_pos.m_direction != head.m_head.m_direction) { - // tail.m_move_history.push_back(Point{ head.m_head.m_row, head.m_head.m_col, head.m_head.m_direction }); - // tail.m_tail_pos.m_direction = head. - // } - // - /* FIXME - * It teleports the tail to the head because i am basing off of the head. It needs to be isolated but just follow the head - * */ - // body.m_body.at(0).m_tail_pos.m_row = head.m_head.m_row - 1; - // body.m_body.at(1).m_tail_pos.m_row = body.m_body.at(0).m_tail_pos.m_row - 1; - body.move(head); + for (int i = 0; i < body.m_body.size(); i++) { + if(i == 0) { + body.m_body.at(i).m_previous_tail_pos.set_new_point(head.m_head.m_row, head.m_head.m_col, head.m_head.m_direction); + } else { + body.m_body.at(i).m_previous_tail_pos.set_new_point(body.m_body.at(i - 1).m_tail_pos.m_row, body.m_body.at(i - 1).m_tail_pos.m_col, body.m_body.at(i - 1).m_tail_pos.m_direction); + } + } + for (int i = 0; i < body.m_body.size(); i++) { + body.m_body.at(i).get_new_point(); + } fruit.reset(window.m_board, head.m_head.m_row, head.m_head.m_col, window.m_score, count); window.m_board[head.m_head.m_row][head.m_head.m_col] = '*'; window.m_board[fruit.m_row][fruit.m_col] = 'X'; body.draw(window.m_board); window.draw_score(); - for(int i = 0; i < body.m_body.size(); i++) { - std::cout << body.m_body.at(i).m_tail_pos.to_string() << std::endl; - } + // for(int i = 0; i < body.m_body.size(); i++) { + // std::cout << "Index: " + std::to_string(i) + " " + body.m_body.at(i).m_tail_pos.to_string() << std::endl; + // } + // std::cout << "Head: " + head.m_head.to_string() << std::endl; window.update_loop(FPS); body.clear(window.m_board); head.m_head.clear(window.m_board); head.get_new_point(head.m_head.m_direction); } - // - // input_thread.join(); - // return 0; + + input_thread.join(); + return 0; } diff --git a/src/point.cpp b/src/point.cpp index 2887c17..2fb0eba 100644 --- a/src/point.cpp +++ b/src/point.cpp @@ -8,3 +8,9 @@ std::string Point::to_string() const { void Point::clear(std::array, ROW> &arr) const { arr[m_row][m_col] = '.'; } + +void Point::set_new_point(int row, int col, int dir) { + m_row = row; + m_col = col; + m_direction = dir; +} diff --git a/src/snake.cpp b/src/snake.cpp index 2c3336e..f809e90 100644 --- a/src/snake.cpp +++ b/src/snake.cpp @@ -5,7 +5,6 @@ Head::Head(int default_direction, int row, int col) { m_head = Point { row, col, default_direction }; } -// Use the head movement for the tail and make the tail start -1 to the last tail but move them separately void Head::get_new_point(int direction) { if (direction == -1) { if (m_head.m_col <= 0) m_head.m_col = COL - 1; @@ -28,26 +27,10 @@ Tail::Tail(int follow_direction, int row, int col) { m_tail_pos = Point { row, col, follow_direction }; } -void Tail::get_new_point(Point &d) { - if(m_tail_pos.m_row < 0) { - m_tail_pos.m_row += 10; - } else if(m_tail_pos.m_col < 0) { - m_tail_pos.m_col += 10; - } else if (d.m_direction == -1 && d.m_col + 1) { - if (m_tail_pos.m_col <= 0) m_tail_pos.m_col = COL - 1; - else m_tail_pos.m_col--; - } else if (d.m_direction == 1 && d.m_col - 1) { - if (m_tail_pos.m_col >= COL - 1) m_tail_pos.m_col = 0; - else m_tail_pos.m_col++; - } else if (d.m_direction == -2 && d.m_row + 1) { - if (m_tail_pos.m_row <= 0) m_tail_pos.m_row = ROW - 1; - else m_tail_pos.m_row--; - } else if (d.m_direction == 2 && d.m_row - 1) { - if (m_tail_pos.m_row >= ROW - 1) m_tail_pos.m_row = 0; - else m_tail_pos.m_row++; - } else { - return; - } +void Tail::get_new_point() { + m_tail_pos.m_row = m_previous_tail_pos.m_row; + m_tail_pos.m_col = m_previous_tail_pos.m_col; + m_tail_pos.m_direction = m_previous_tail_pos.m_direction; } void Body::clear(std::array, ROW> &arr) { @@ -68,47 +51,4 @@ void Body::move(Head &head) { } } - // if(m_body.at(0).m_tail_pos.m_row < 0) { - // m_body.at(0).m_tail_pos.m_row = 9; - // } - // if(m_body.at(1).m_tail_pos.m_row < 0) { - // m_body.at(1).m_tail_pos.m_row = 8; - // } - // m_body.at(0).m_tail_pos.m_row = head.m_head.m_row - 1; - // m_body.at(1).m_tail_pos.m_row = m_body.at(0).m_tail_pos.m_row - 1; - // m_body.at(2).m_tail_pos.m_row = m_body.at(1).m_tail_pos.m_row - 1; - // m_body.at(3).m_tail_pos.m_row = m_body.at(2).m_tail_pos.m_row - 1; - // m_body.at(4).m_tail_pos.m_row = m_body.at(3).m_tail_pos.m_row - 1; - // for(int i = 0; i < m_body.size() - 1; i++) { - // if(i == 0) { - // } - - // } } -// void Snake::create_tail(int row, int col) { -// // if(row >= ROW - 1) { -// // row = 0; -// // m_tails.push_back(Point {row, col}); -// // } -// // if(col >= COL - 1) { -// // col = 0; -// // m_tails.push_back(Point {row, col}); -// // } -// m_tails.push_back(Point {row, col}); -// } -// -// void Snake::get_new_tail_point(int tail_index, int direction) { -// if (direction == 1) { -// if (m_tails.at(tail_index).m_col >= COL - 1) m_tails.at(tail_index).m_col = 0; -// else ++m_tails.at(tail_index).m_row; -// } else if (direction == -1) { -// if (m_tails.at(tail_index).m_col <= 0) m_tails.at(tail_index).m_col = COL - 1; -// else --m_tails.at(tail_index).m_row; -// } else if (direction == -2) { -// if (m_tails.at(tail_index).m_row <= 0) m_tails.at(tail_index).m_row = ROW - 1; -// else --m_tails.at(tail_index).m_row; -// } else if (direction == 2) { -// if (m_tails.at(tail_index).m_row >= ROW - 1) m_tails.at(tail_index).m_row = 0; -// else ++m_tails.at(tail_index).m_row; -// } -// }