#include <SFML/Graphics.hpp> #include <vector> class Entity { public: sf::RectangleShape body; Entity(sf::Vector2f size, sf::Color color) { body.setSize(size); body.setFillColor(color); } }; class Snake : public Entity { public: std::vector<sf::Vector2f> positions; Snake() : Entity(sf::Vector2f(10.f, 10.f), sf::Color::Green) { positions.push_back(body.getPosition()); } void grow() { positions.push_back(body.getPosition()); } void move(sf::Vector2f direction) { positions.insert(positions.begin(), positions[0] + direction * body.getSize().x); positions.pop_back(); } bool checkCollision() { for (std::size_t i = 1; i < positions.size(); ++i) { if (positions[0] == positions[i]) return true; } return false; } }; class Food : public Entity { public: Food() : Entity(sf::Vector2f(10.f, 10.f), sf::Color::Red) {} void spawn(std::vector<sf::Vector2f> snakePositions) { while (true) { body.setPosition(rand() % 800, rand() % 600); bool onSnake = false; for (auto pos : snakePositions) { if (body.getPosition() == pos) onSnake = true; } if (!onSnake) break; } } }; class Game { public: sf::RenderWindow window; Snake snake; Food food; sf::Clock clock; sf::Time timer; sf::Vector2f direction; float speed; sf::Texture backgroundTexture; sf::Sprite backgroundSprite; Game() : window(sf::VideoMode(800, 600), "Snake Game") {} void setLevel(int level) { if (level == 1) { // Easy speed = 0.2f; backgroundTexture.loadFromFile("background1.png"); } else if (level == 2) { // Medium speed = 0.1f; backgroundTexture.loadFromFile("background2.png"); } else if (level == 3) { // Hard speed = 0.05f; backgroundTexture.loadFromFile("background3.png"); } backgroundSprite.setTexture(backgroundTexture); } void run() { while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); else if (event.type == sf::Event::KeyPressed) { if (event.key.code == sf::Keyboard::Up) direction = {0, -1}; else if (event.key.code == sf::Keyboard::Down) direction = {0, 1}; else if (event.key.code == sf::Keyboard::Left) direction = {-1, 0}; else if (event.key.code == sf::Keyboard::Right) direction = {1, 0}; } } timer += clock.restart(); if (timer > sf::seconds(speed)) { timer = sf::Time::Zero; snake.move(direction); if (snake.checkCollision()) window.close(); if (snake.positions[0] == food.body.getPosition()) { snake.grow(); food.spawn(snake.positions); } } window.clear(); window.draw(backgroundSprite); for (auto pos : snake.positions) { snake.body.setPosition(pos); window.draw(snake.body); } window.draw(food.body); window.display(); } } }; int main() { srand(time(NULL)); Game game; // Set the level here game.setLevel(1); // Easy level game.run(); }
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++
and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}