Random fruit generator and behaviour on eating them
This commit is contained in:
42
src/main.cpp
42
src/main.cpp
@@ -11,9 +11,12 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <raylib.h>
|
#include <raylib.h>
|
||||||
|
#include <raymath.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -105,6 +108,7 @@ struct State
|
|||||||
|
|
||||||
struct Player
|
struct Player
|
||||||
{
|
{
|
||||||
|
Direction dir;
|
||||||
std::vector<Point> points;
|
std::vector<Point> points;
|
||||||
} player;
|
} player;
|
||||||
|
|
||||||
@@ -155,13 +159,13 @@ struct State
|
|||||||
return player.points.begin();
|
return player.points.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool update_player_head(Point dir)
|
bool update_player_head()
|
||||||
{
|
{
|
||||||
auto head = player_head();
|
auto head = player_head();
|
||||||
Point old_position = *head;
|
Point old_position = *head;
|
||||||
Point new_position = old_position;
|
Point new_position = old_position;
|
||||||
new_position.y += dir.y;
|
new_position.y += Point{player.dir}.y;
|
||||||
new_position.x += dir.x;
|
new_position.x += Point{player.dir}.x;
|
||||||
new_position.x = mod(new_position.x, a);
|
new_position.x = mod(new_position.x, a);
|
||||||
new_position.y = mod(new_position.y, b);
|
new_position.y = mod(new_position.y, b);
|
||||||
|
|
||||||
@@ -180,14 +184,37 @@ struct State
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void player_fruit_collision(void)
|
void make_rand_fruit(void)
|
||||||
|
{
|
||||||
|
size_t x = rand() % a;
|
||||||
|
size_t y = rand() % b;
|
||||||
|
while (grid[x][y] == Type::WALL || is_player(x, y))
|
||||||
|
{
|
||||||
|
x = rand() % a;
|
||||||
|
y = rand() % b;
|
||||||
|
}
|
||||||
|
grid[x][y] = Type::FRUIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void player_fruit_collision()
|
||||||
{
|
{
|
||||||
const auto point = player_head();
|
const auto point = player_head();
|
||||||
if (grid[point->x][point->y] == Type::FRUIT)
|
if (grid[point->x][point->y] == Type::FRUIT)
|
||||||
{
|
{
|
||||||
grid[point->x][point->y] = Type::EMPTY;
|
// If only one point currently then put it anywhere
|
||||||
std::vector<Point>::iterator last = player.points.end() - 1;
|
grid[point->x][point->y] = Type::EMPTY;
|
||||||
player.points.push_back({last->x + 1, last->y});
|
if (player.points.size() == 1)
|
||||||
|
{
|
||||||
|
player.points.push_back((Point{player.dir} * -1) + *point);
|
||||||
|
}
|
||||||
|
// Otherwise look at the last two points, calculate a direction
|
||||||
|
// vector then make the new one
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto last_1 = player.points.end() - 1;
|
||||||
|
auto last_2 = player.points.end() - 2;
|
||||||
|
player.points.push_back(*last_1 + (*last_1 - *last_2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,6 +222,7 @@ struct State
|
|||||||
{
|
{
|
||||||
player.points.clear();
|
player.points.clear();
|
||||||
player.points.push_back({a / 2, b / 2});
|
player.points.push_back({a / 2, b / 2});
|
||||||
|
player.dir = Direction::LEFT;
|
||||||
memset(grid, 0, sizeof(Type) * a * b);
|
memset(grid, 0, sizeof(Type) * a * b);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user