rework(snake): added tail get_new_point for managing tail movement

This commit is contained in:
DarthMooMancer
2025-05-22 12:23:06 -04:00
parent ff942631aa
commit a128048a8f
12 changed files with 79 additions and 56 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -1 +1,2 @@
build/ build/
.cache/
+4 -2
View File
@@ -1,7 +1,9 @@
#ifndef GLOBALS_HPP #ifndef GLOBALS_HPP
#define GLOBALS_HPP #define GLOBALS_HPP
constexpr unsigned int ROW = 10; #include <cstdint>
constexpr unsigned int COL = 10;
constexpr uint16_t ROW = 10;
constexpr uint16_t COL = 10;
#endif // GLOBALS_HPP #endif // GLOBALS_HPP
+1 -1
View File
@@ -12,7 +12,7 @@ struct Point {
std::string to_string() const; std::string to_string() const;
void clear(std::array<std::array<char, COL>, ROW> &arr) const; void clear(std::array<std::array<char, COL>, ROW> &arr) const;
std::pair<int, int> get_point(int direction, int row, int col); std::pair<int, int> get_new_point(int direction, int row, int col);
}; };
#endif // POINT_HPP #endif // POINT_HPP
+1
View File
@@ -7,6 +7,7 @@
struct Snake { struct Snake {
Snake(int default_direction); Snake(int default_direction);
void create_tail(int row, int col); void create_tail(int row, int col);
std::pair<int, int> get_new_point(int tail_index, int direction, int row, int col);
void update_tails_count(); void update_tails_count();
std::vector<Point> m_tails; std::vector<Point> m_tails;
+52 -51
View File
@@ -2,6 +2,7 @@
#include <thread> #include <thread>
#include <cstdlib> #include <cstdlib>
#include <unistd.h> #include <unistd.h>
#include <vector>
#include "point.hpp" #include "point.hpp"
#include "fruit.hpp" #include "fruit.hpp"
#include "snake.hpp" #include "snake.hpp"
@@ -9,66 +10,66 @@
#include "globals.hpp" #include "globals.hpp"
#include "input.hpp" #include "input.hpp"
int main() { int main (int argc, char *argv[]) {
Snake snake {1}; Snake snake {1};
Window window; Window window;
Input input; Input input;
Fruit fruit; Fruit fruit;
int x = 5; int x = 5;
int y = 5; for(int i = 0; i < x; i++) {
for(int i = 0; i <= x; i++) { snake.create_tail(i, 0);
for(int a = 0; a <= y; a++) { }
snake.create_tail(i, a);
int row = 0, col = 0;
int count = 0;
while(count < 2) {
count++;
for(int i = 0; i < snake.m_tails.size(); i++) {
std::tie(row, col) = snake.get_new_point(i, 1, row, col);
std::cout << snake.m_tails.at(i).to_string() << std::endl;
} }
} }
for(int i = 0; i < snake.m_tails.size(); i++) { // int score = 0;
std::cout << &snake.m_tails.at(i) << std::endl; // int fps = 5;
} // bool running = true;
std::cout << snake.m_tails.size() << std::endl; //
// Point previous {row,col}; // Creating initial snake head position
// fruit.create_point(); // Creating initial fruit object
// int score = 0; // std::array<std::array<char, COL>, ROW> &board = window.m_board;
// int row = 0, col = 0; // std::thread input_thread(&Input::get_input, &input);
// int fps = 5; // while(running) {
// bool running = true; // switch (input.m_current_key) {
// // case 's':
// Point previous {row,col}; // Creating initial snake head position // snake.m_direction = 1;
// fruit.create_point(); // Creating initial fruit object // break;
// std::array<std::array<char, COL>, ROW> &board = window.m_board; // case 'w':
// std::thread input_thread(&Input::get_input, &input); // snake.m_direction = 2;
// while(running) { // break;
// switch (input.m_current_key) { // case 'a':
// case 's': // snake.m_direction = 3;
// snake.m_direction = 1; // break;
// break; // case 'd':
// case 'w': // snake.m_direction = 4;
// snake.m_direction = 2; // break;
// break; // case 'q':
// case 'a': // running = false;
// snake.m_direction = 3; // break;
// break; // }
// case 'd': //
// snake.m_direction = 4; // fruit.reset(board, row, col, score);
// break; // std::tie(row, col) = previous.get_point(snake.m_direction, row, col);
// case 'q': //
// running = false; // board[row][col] = '*';
// break; // board[fruit.m_row][fruit.m_col] = '*';
// } // std::cout << "Score: " << score << std::endl;
// // previous.clear(board); // Clear old previous point
// fruit.reset(board, row, col, score); // previous = Point {row, col}; // Set new previous point
// std::tie(row, col) = previous.get_point(snake.m_direction, row, col); // window.update_loop(fps); // Update loop to clear board, tick and redisplay board
// // }
// board[row][col] = '*'; //
// board[fruit.m_row][fruit.m_col] = '*'; // input_thread.join();
// std::cout << "Score: " << score << std::endl;
// previous.clear(board); // Clear old previous point
// previous = Point {row, col}; // Set new previous point
// window.update_loop(fps); // Update loop to clear board, tick and redisplay board
// }
//
// input_thread.join();
return 0; return 0;
} }
+2 -2
View File
@@ -9,10 +9,10 @@ void Point::clear(std::array<std::array<char, COL>, ROW> &arr) const {
arr[m_row][m_col] = '.'; arr[m_row][m_col] = '.';
} }
std::pair<int, int> Point::get_point(int direction, int row, int col) { std::pair<int, int> Point::get_new_point(int direction, int row, int col) {
switch (direction) { switch (direction) {
case 1: case 1:
row ++; row++;
if (row >= ROW) row = 0; if (row >= ROW) row = 0;
break; break;
case 2: case 2:
+18
View File
@@ -9,6 +9,24 @@ void Snake::create_tail(int row, int col) {
m_tails.push_back(Point {row, col}); m_tails.push_back(Point {row, col});
} }
std::pair<int, int> Snake::get_new_point(int tail_index, int direction, int row, int col) {
m_tails.at(tail_index) = Point {row, col};
if (direction == 1) {
if (row >= ROW - 1) row = 1;
else row++;
} else if (direction == 2) {
if (row <= 0) row = ROW - 1;
else row--;
} else if (direction == 3) {
if (col <= 0) col = COL - 1;
else col--;
} else if (direction == 4) {
if (col >= COL - 1) col = 1;
else col++;
}
return { row, col };
}
/* snake head for instance is (3, 0) /* snake head for instance is (3, 0)
* the direct body to the head when going down would be (snake_head_x, snake_head_y - 1) * the direct body to the head when going down would be (snake_head_x, snake_head_y - 1)
* the next and so on would be (previous_body_segment_x - 1, previous_body_segment_y - 1) * the next and so on would be (previous_body_segment_x - 1, previous_body_segment_y - 1)