From 0d3988a7ffd0b5cc8a1e54e6182bde7aa34afd98 Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Mon, 15 Aug 2022 22:15:56 -0500 Subject: [PATCH 1/4] Fixed food generation and removed unused code Fixed food generation and removed unused code --- src/GameState.cpp | 4 ---- src/GameState.h | 1 - src/Snake.cpp | 1 - src/SnakeFood.cpp | 9 ++++----- src/SnakeFood.h | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/GameState.cpp b/src/GameState.cpp index c293cf6..dcc6e66 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -28,10 +28,6 @@ void GameState::startNewGame() int snakeDirection = 0; Snake player(sf::Vector2f(25,25)); SnakeFood playerFood(sf::Vector2f(25,25)); - // sf::RectangleShape snakeHead(sf::Vector2f(25,25)); - sf::RectangleShape snakeFood(sf::Vector2f(25,25)); - snakeFood.setFillColor(sf::Color::Red); - snakeFood.setPosition(25,25); while (gameWindow.isOpen()) { diff --git a/src/GameState.h b/src/GameState.h index ad8c7bd..f5ccb13 100644 --- a/src/GameState.h +++ b/src/GameState.h @@ -2,7 +2,6 @@ #ifndef GAMESTATE_H #define GAMESTATE_H #include -#include class GameState { diff --git a/src/Snake.cpp b/src/Snake.cpp index 8e4887d..824ddcb 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -1,6 +1,5 @@ #include #include -#include #include "Snake.h" // Test for collision between two objects diff --git a/src/SnakeFood.cpp b/src/SnakeFood.cpp index 464ea25..b5c0edb 100644 --- a/src/SnakeFood.cpp +++ b/src/SnakeFood.cpp @@ -13,12 +13,11 @@ SnakeFood::SnakeFood(sf::Vector2f snakeFoodSize) snakeFoodObject.setFillColor(sf::Color::Red); } -void SnakeFood::GenerateNewLocation(int maxLocation) +int SnakeFood::GenerateNewLocation(int maxLocation) { - sf::Vector2f newPosition; + int newPosition; std::default_random_engine generator; std::uniform_int_distribution distribution(0, maxLocation); - newPosition.x = distribution(generator); - newPosition.y = distribution(generator); - snakeFoodObject.setPosition(newPosition); + newPosition = distribution(generator); + return newPosition; } diff --git a/src/SnakeFood.h b/src/SnakeFood.h index 4c25630..18717d7 100644 --- a/src/SnakeFood.h +++ b/src/SnakeFood.h @@ -10,7 +10,7 @@ public: sf::RectangleShape snakeFoodObject; SnakeFood(); SnakeFood(sf::Vector2f snakeFoodSize); - void GenerateNewLocation(int maxLocation); + int GenerateNewLocation(int maxLocation); }; #endif From cc3a61abb7b551d0f2c7d16a2ebd112a90fbff4a Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Mon, 15 Aug 2022 23:51:18 -0500 Subject: [PATCH 2/4] Snake food works with vertical movement Snake food works with vertical movement, however horizontal movement is unchanging. Will look into getting a fix for it soon. --- src/GameState.cpp | 15 ++++----------- src/Snake.cpp | 26 ++++++++++++++++---------- src/Snake.h | 4 +++- src/SnakeFood.cpp | 20 ++++++++++++++------ src/SnakeFood.h | 2 +- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/GameState.cpp b/src/GameState.cpp index dcc6e66..4700de2 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -1,4 +1,4 @@ -// #include +// GameState.cpp #include #include #include "Snake.h" @@ -24,7 +24,7 @@ GameState::GameState(int newHorizontal, int newVertical) void GameState::startNewGame() { gameWindow.create(gameVideoMode, "SnakePlusPlus"); - sf::Time delay = sf::milliseconds(25); + sf::Time delay = sf::milliseconds(50); int snakeDirection = 0; Snake player(sf::Vector2f(25,25)); SnakeFood playerFood(sf::Vector2f(25,25)); @@ -37,15 +37,8 @@ void GameState::startNewGame() if ((event.type == sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))) gameWindow.close(); } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) - snakeDirection = 1; - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) - snakeDirection = 2; - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) - snakeDirection = 3; - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) - snakeDirection = 4; - player.MoveSnake(playerFood.snakeFoodObject); + player.CheckDirection(); + player.MoveSnake(playerFood, gameVideoMode); gameWindow.clear(); player.DisplaySnake(gameWindow); gameWindow.draw(playerFood.snakeFoodObject); diff --git a/src/Snake.cpp b/src/Snake.cpp index 824ddcb..1c9603f 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -1,6 +1,8 @@ +// Snake.cpp #include #include #include "Snake.h" +#include "SnakeFood.h" // Test for collision between two objects bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2) @@ -64,9 +66,9 @@ sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) } // Move snake based on direction and test for eating food -void Snake::MoveSnake(sf::RectangleShape& snakeFood) +void Snake::MoveSnake(SnakeFood& snakeFood, sf::VideoMode gameVideoMode) { - CheckDirection(); + // CheckDirection(); sf::Vector2f newHeadPosition; newHeadPosition = GetSnakeHeadPosition(); if (CheckBoundaries()) @@ -80,15 +82,9 @@ void Snake::MoveSnake(sf::RectangleShape& snakeFood) } newBodyPart.setFillColor(sf::Color::Green); snakeBody.push_front(newBodyPart); - if (!SnakeCollision(GetSnakeHead(), snakeFood)) + if (!SnakeCollision(GetSnakeHead(), snakeFood.snakeFoodObject)) snakeBody.pop_back(); - else if (SnakeCollision(GetSnakeHead(), snakeFood)) - { - sf::Vector2f snakeFoodPosition = snakeFood.getPosition(); - snakeFoodPosition.x += 25; - snakeFoodPosition.y += 25; - snakeFood.setPosition(snakeFoodPosition.x, snakeFoodPosition.y); - } + SnakeFoodCollision(snakeFood, gameVideoMode); return; } @@ -131,6 +127,16 @@ bool Snake::IsSelfCollision(sf::RectangleShape testRectangle) return false; } +// If player collides with food then generate until no longer collided with food +void Snake::SnakeFoodCollision(SnakeFood& snakeFood, sf::VideoMode gameVideoMode) +{ + while(IsSelfCollision(snakeFood.snakeFoodObject)) + { + snakeFood.GenerateNewLocation(gameVideoMode.width, gameVideoMode.height); + } + return; +} + // General constructor for snake class Snake::Snake() { diff --git a/src/Snake.h b/src/Snake.h index 27016ed..b6575e5 100644 --- a/src/Snake.h +++ b/src/Snake.h @@ -2,6 +2,7 @@ #ifndef SNAKE_H #define SNAKE_H #include +#include "SnakeFood.h" bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2); int SnakeMovement(); @@ -18,7 +19,8 @@ public: sf::Vector2f GetSnakeHeadPosition(); sf::RectangleShape GetSnakeHead(); void DisplaySnake(sf::RenderWindow& window); - void MoveSnake(sf::RectangleShape& snakeFood); + void MoveSnake(SnakeFood& playerFood, sf::VideoMode gameVideoMode); + void SnakeFoodCollision(SnakeFood& snakeFood, sf::VideoMode gameVideoMode); void CheckDirection(); bool CheckBoundaries(); bool IsSelfCollision(sf::RectangleShape testRectangle); diff --git a/src/SnakeFood.cpp b/src/SnakeFood.cpp index b5c0edb..9ae847f 100644 --- a/src/SnakeFood.cpp +++ b/src/SnakeFood.cpp @@ -1,3 +1,4 @@ +// SnakeFood.cpp #include #include "SnakeFood.h" @@ -13,11 +14,18 @@ SnakeFood::SnakeFood(sf::Vector2f snakeFoodSize) snakeFoodObject.setFillColor(sf::Color::Red); } -int SnakeFood::GenerateNewLocation(int maxLocation) +void SnakeFood::GenerateNewLocation(int horizontalLocation, int verticalLocation) { - int newPosition; - std::default_random_engine generator; - std::uniform_int_distribution distribution(0, maxLocation); - newPosition = distribution(generator); - return newPosition; + sf::Vector2f newPosition; + std::default_random_engine generator(time(NULL)); + std::uniform_int_distribution distributionX(0, horizontalLocation); + std::uniform_int_distribution distributionY(0, verticalLocation); + int newX = distributionX(generator); + int newY = distributionY(generator); + newX = newX - (newX % 25) - 25; + newY = newY - (newY % 25) - 25; + newPosition.x = newX; + newPosition.y = newY; + snakeFoodObject.setPosition(newPosition); + return; } diff --git a/src/SnakeFood.h b/src/SnakeFood.h index 18717d7..d39f52f 100644 --- a/src/SnakeFood.h +++ b/src/SnakeFood.h @@ -10,7 +10,7 @@ public: sf::RectangleShape snakeFoodObject; SnakeFood(); SnakeFood(sf::Vector2f snakeFoodSize); - int GenerateNewLocation(int maxLocation); + void GenerateNewLocation(int horizontalLocation, int verticalLocation); }; #endif From 88902fed6ae2d85d1949a2455d8b2dbe32bc06c1 Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Wed, 17 Aug 2022 00:41:29 -0500 Subject: [PATCH 3/4] Moved general functions to a general file Moved general functions to a general file and added a statement to catch if the newly generated location is the same. The snake food is not currently generating to a new random location like expected and is broken. --- src/GameState.cpp | 2 +- src/GeneralFunctions.cpp | 41 ++++++++++++++++++++++++++++++++++++++++ src/GeneralFunctions.h | 10 ++++++++++ src/Snake.cpp | 37 +++--------------------------------- src/Snake.h | 3 --- src/SnakeFood.cpp | 20 ++++++++++---------- 6 files changed, 65 insertions(+), 48 deletions(-) create mode 100644 src/GeneralFunctions.cpp create mode 100644 src/GeneralFunctions.h diff --git a/src/GameState.cpp b/src/GameState.cpp index 4700de2..4e9fc16 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -24,7 +24,7 @@ GameState::GameState(int newHorizontal, int newVertical) void GameState::startNewGame() { gameWindow.create(gameVideoMode, "SnakePlusPlus"); - sf::Time delay = sf::milliseconds(50); + sf::Time delay = sf::milliseconds(100); int snakeDirection = 0; Snake player(sf::Vector2f(25,25)); SnakeFood playerFood(sf::Vector2f(25,25)); diff --git a/src/GeneralFunctions.cpp b/src/GeneralFunctions.cpp new file mode 100644 index 0000000..0c9dd1a --- /dev/null +++ b/src/GeneralFunctions.cpp @@ -0,0 +1,41 @@ +#include +#include +#include "GeneralFunctions.h" + + +// Get a new coordinate position based on snake direction +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) +{ + if (direction == 0) + return position; + if (direction == 1) + position.x -= 25; + if (direction == 2) + position.y -= 25; + if (direction == 3) + position.y += 25; + if (direction == 4) + position.x += 25; + return position; +} + +// Test for collision between two object positions +bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position) +{ + if (object1Position.x != object2Position.x) + return 0; + if (object1Position.y != object2Position.y) + return 0; + + return 1; +} + +int GenerateRandomNumber(int generationLimit) +{ + int generatedNumber; + std::default_random_engine generator; + std::uniform_int_distribution<> distribution(0, generationLimit); + generatedNumber = distribution(generator); + generatedNumber -= (generatedNumber % 25); + return generatedNumber; +} \ No newline at end of file diff --git a/src/GeneralFunctions.h b/src/GeneralFunctions.h new file mode 100644 index 0000000..404ceb6 --- /dev/null +++ b/src/GeneralFunctions.h @@ -0,0 +1,10 @@ +#ifndef GENERALFUNCTIONS_H +#define GENERALFUNCTIONS_H +#include + +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position); +bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position); +int GenerateRandomNumber(int generationLimit); + + +#endif \ No newline at end of file diff --git a/src/Snake.cpp b/src/Snake.cpp index 1c9603f..b93a9c1 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -1,25 +1,10 @@ // Snake.cpp #include #include +#include "GeneralFunctions.h" #include "Snake.h" #include "SnakeFood.h" -// Test for collision between two objects -bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2) -{ - // Hack for getting a temporary collision - // Collision only tested for origin corrordinate - sf::Vector2f object1Position = object1.getPosition(); - sf::Vector2f object2Position = object2.getPosition(); - if (object1Position.x != object2Position.x) - return 0; - if (object1Position.y != object2Position.y) - return 0; - - return 1; - -} - // Check keyboard for new direction of snake void Snake::CheckDirection() { @@ -49,22 +34,6 @@ bool Snake::CheckBoundaries() return false; } -// Get a new coordinate position based on snake direction -sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) -{ - if (direction == 0) - return position; - if (direction == 1) - position.x -= 25; - if (direction == 2) - position.y -= 25; - if (direction == 3) - position.y += 25; - if (direction == 4) - position.x += 25; - return position; -} - // Move snake based on direction and test for eating food void Snake::MoveSnake(SnakeFood& snakeFood, sf::VideoMode gameVideoMode) { @@ -82,7 +51,7 @@ void Snake::MoveSnake(SnakeFood& snakeFood, sf::VideoMode gameVideoMode) } newBodyPart.setFillColor(sf::Color::Green); snakeBody.push_front(newBodyPart); - if (!SnakeCollision(GetSnakeHead(), snakeFood.snakeFoodObject)) + if (!GlobalCollision(GetSnakeHead().getPosition(), snakeFood.snakeFoodObject.getPosition())) snakeBody.pop_back(); SnakeFoodCollision(snakeFood, gameVideoMode); return; @@ -119,7 +88,7 @@ bool Snake::IsSelfCollision(sf::RectangleShape testRectangle) { for (auto it = snakeBody.cbegin(); it != snakeBody.cend(); ++it) { - if (SnakeCollision(testRectangle, *it)) + if (GlobalCollision(testRectangle.getPosition(), (*it).getPosition())) { return true; } diff --git a/src/Snake.h b/src/Snake.h index b6575e5..0752cbb 100644 --- a/src/Snake.h +++ b/src/Snake.h @@ -4,9 +4,6 @@ #include #include "SnakeFood.h" -bool SnakeCollision(sf::RectangleShape object1, sf::RectangleShape object2); -int SnakeMovement(); -sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position); class Snake { diff --git a/src/SnakeFood.cpp b/src/SnakeFood.cpp index 9ae847f..f14d188 100644 --- a/src/SnakeFood.cpp +++ b/src/SnakeFood.cpp @@ -1,5 +1,7 @@ // SnakeFood.cpp -#include +#include +#include +#include "GeneralFunctions.h" #include "SnakeFood.h" SnakeFood::SnakeFood() @@ -17,15 +19,13 @@ SnakeFood::SnakeFood(sf::Vector2f snakeFoodSize) void SnakeFood::GenerateNewLocation(int horizontalLocation, int verticalLocation) { sf::Vector2f newPosition; - std::default_random_engine generator(time(NULL)); - std::uniform_int_distribution distributionX(0, horizontalLocation); - std::uniform_int_distribution distributionY(0, verticalLocation); - int newX = distributionX(generator); - int newY = distributionY(generator); - newX = newX - (newX % 25) - 25; - newY = newY - (newY % 25) - 25; - newPosition.x = newX; - newPosition.y = newY; + newPosition.x = GenerateRandomNumber(horizontalLocation); + newPosition.y = GenerateRandomNumber(verticalLocation); + if (GlobalCollision(snakeFoodObject.getPosition(), newPosition)) + { + std::cout << "Location error: " << newPosition.x << " " << newPosition.y << '\n'; + throw std::runtime_error("Error! New generation on same location"); + } snakeFoodObject.setPosition(newPosition); return; } From 2c4537eda7393936f6acad3d1ef111d832509f79 Mon Sep 17 00:00:00 2001 From: TriantaTV <56975502+TriantaTV@users.noreply.github.com> Date: Sun, 21 Aug 2022 02:51:33 -0500 Subject: [PATCH 4/4] Fixed generation issue with snakeFood Fixed generation issue with snakeFood and game should be fully playable without an official end screen implemented. So when the snake gets stuck or the game finishes, there is nothing to close the game automatically. --- src/GameState.cpp | 1 - src/GeneralFunctions.cpp | 41 ---------------------------------------- src/GeneralFunctions.h | 10 ---------- src/Snake.cpp | 29 +++++++++++++++++++++++++++- src/Snake.h | 4 ++-- src/SnakeFood.cpp | 12 +++++++++++- src/SnakeFood.h | 3 +++ 7 files changed, 44 insertions(+), 56 deletions(-) delete mode 100644 src/GeneralFunctions.cpp delete mode 100644 src/GeneralFunctions.h diff --git a/src/GameState.cpp b/src/GameState.cpp index 4e9fc16..f9a89a1 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -2,7 +2,6 @@ #include #include #include "Snake.h" -#include "SnakeFood.h" #include "GameState.h" GameState::GameState() diff --git a/src/GeneralFunctions.cpp b/src/GeneralFunctions.cpp deleted file mode 100644 index 0c9dd1a..0000000 --- a/src/GeneralFunctions.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include "GeneralFunctions.h" - - -// Get a new coordinate position based on snake direction -sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) -{ - if (direction == 0) - return position; - if (direction == 1) - position.x -= 25; - if (direction == 2) - position.y -= 25; - if (direction == 3) - position.y += 25; - if (direction == 4) - position.x += 25; - return position; -} - -// Test for collision between two object positions -bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position) -{ - if (object1Position.x != object2Position.x) - return 0; - if (object1Position.y != object2Position.y) - return 0; - - return 1; -} - -int GenerateRandomNumber(int generationLimit) -{ - int generatedNumber; - std::default_random_engine generator; - std::uniform_int_distribution<> distribution(0, generationLimit); - generatedNumber = distribution(generator); - generatedNumber -= (generatedNumber % 25); - return generatedNumber; -} \ No newline at end of file diff --git a/src/GeneralFunctions.h b/src/GeneralFunctions.h deleted file mode 100644 index 404ceb6..0000000 --- a/src/GeneralFunctions.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef GENERALFUNCTIONS_H -#define GENERALFUNCTIONS_H -#include - -sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position); -bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position); -int GenerateRandomNumber(int generationLimit); - - -#endif \ No newline at end of file diff --git a/src/Snake.cpp b/src/Snake.cpp index b93a9c1..d1216cf 100644 --- a/src/Snake.cpp +++ b/src/Snake.cpp @@ -1,10 +1,37 @@ // Snake.cpp #include +#include #include -#include "GeneralFunctions.h" #include "Snake.h" #include "SnakeFood.h" +// Get a new coordinate position based on snake direction +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position) +{ + if (direction == 0) + return position; + if (direction == 1) + position.x -= 25; + if (direction == 2) + position.y -= 25; + if (direction == 3) + position.y += 25; + if (direction == 4) + position.x += 25; + return position; +} + +// Test for collision between two object positions +bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position) +{ + if (object1Position.x != object2Position.x) + return 0; + if (object1Position.y != object2Position.y) + return 0; + + return 1; +} + // Check keyboard for new direction of snake void Snake::CheckDirection() { diff --git a/src/Snake.h b/src/Snake.h index 0752cbb..b7f7a70 100644 --- a/src/Snake.h +++ b/src/Snake.h @@ -1,9 +1,9 @@ // Snake.h #ifndef SNAKE_H #define SNAKE_H -#include -#include "SnakeFood.h" +sf::Vector2f CalculateNewPosition(int direction, sf::Vector2f position); +bool GlobalCollision(sf::Vector2f object1Position, sf::Vector2f object2Position); class Snake { diff --git a/src/SnakeFood.cpp b/src/SnakeFood.cpp index f14d188..4a1dd0f 100644 --- a/src/SnakeFood.cpp +++ b/src/SnakeFood.cpp @@ -1,8 +1,8 @@ // SnakeFood.cpp #include #include -#include "GeneralFunctions.h" #include "SnakeFood.h" +#include "Snake.h" SnakeFood::SnakeFood() { @@ -29,3 +29,13 @@ void SnakeFood::GenerateNewLocation(int horizontalLocation, int verticalLocation snakeFoodObject.setPosition(newPosition); return; } + + +int SnakeFood::GenerateRandomNumber(int generationLimit) +{ + int generatedNumber; + std::uniform_int_distribution<> distribution(0, generationLimit); + generatedNumber = distribution(generator); + generatedNumber -= (generatedNumber % 25); + return generatedNumber; +} diff --git a/src/SnakeFood.h b/src/SnakeFood.h index d39f52f..67f603a 100644 --- a/src/SnakeFood.h +++ b/src/SnakeFood.h @@ -1,6 +1,7 @@ // SnakeFood.h #ifndef SNAKEFOOD_H #define SNAKEFOOD_H +#include #include class SnakeFood @@ -8,9 +9,11 @@ class SnakeFood private: public: sf::RectangleShape snakeFoodObject; + std::default_random_engine generator; SnakeFood(); SnakeFood(sf::Vector2f snakeFoodSize); void GenerateNewLocation(int horizontalLocation, int verticalLocation); + int GenerateRandomNumber(int generationLimit); }; #endif