рд╕рд░рд▓ SFML рдЦреЗрд▓

рд╣рдо SFML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ рдЧреЗрдо "рдЯреИрдЧ" рдмрдирд╛рдПрдВрдЧреЗред рдкрдВрджреНрд░рд╣ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдкрд╣реЗрд▓реА рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


4x4 рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░, 1 рд╕реЗ 15 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде 15 рдкрд╛рд╕рд╛ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╕реНрдерд┐рдд рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкрд╛рд╕рд╛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдкрд░ред рдЦреЗрд▓ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд░рдо рдореЗрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдкрд╛рд╕рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЖрдк рдЗрд╕реЗ рдЬреЛ рдЪрд╛рд╣реЗрдВ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ "15" рдХрд╣рд╛ред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдПрдХ рдирдИ main.cpp рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдмрдирд╛рдПрдБ:

// main.cpp int main() { return 0; } 

рдЗрд╕рдХреЗ рдмрд╛рдж sfml-dev.org рд╕реЗ SFML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░реЗрдВред рдЕрдирдкреИрдХреНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╡реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рд╢рд╛рдорд┐рд▓ , рд▓рд┐рдм рдФрд░ рдмрд┐рди ред рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд╛рдорд┐рд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ C / C ++ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рд╢рд╛рдорд┐рд▓ рд╣реИрдВ :


рд╡рд╣рд╛рдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рдореЗрдВ рд▓рд┐рдВрдХрд░ рд╕реЗрдХреНрд╢рди рдореЗрдВ , рд▓реЗрдмрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рдЬреЛрдбрд╝реЗрдВ:


рдФрд░ рдмрд┐рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдЖрдкрдХреЛ DLL рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА exe рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдВрдХрд░ рдЦрдВрдб рдореЗрдВ, рдЗрдирдкреБрдЯ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреАрди рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рд╣реИ: sfml-system-d.lib, sfml-window-d.lib рдФрд░ sfml-graphics-d.lib:


рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдореЗрдВ -d рдкреНрд░рддреАрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбреАрдмрдЧ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдФрд░ рдЗрд╕реЗ рдбреАрдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдЖрдкрдХреЛ рдирд╛рдо рдореЗрдВ -d рдЪрд░рд┐рддреНрд░ рдХреЗ рдмрд┐рдирд╛ рдлрд╛рдЗрд▓реЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

SFML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрджреЗрд╢ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╣реИ ред

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдПрдВ рдФрд░ рдИрд╡реЗрдВрдЯ рд▓реВрдк рд╢реБрд░реВ рдХрд░реЗрдВ:

main.cpp
 // main.cpp #include <SFML/Graphics.hpp> int main() { //    600  600    60    sf::RenderWindow window(sf::VideoMode(600, 600), "15"); window.setFramerateLimit(60); sf::Event event; while (window.isOpen()) { while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); if (event.type == sf::Event::KeyPressed) { //    -    if (event.key.code == sf::Keyboard::Escape) window.close(); } } //      window.clear(); window.display(); } return 0; } 


рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд░реНрдЧ рдЦрд┐рдбрд╝рдХреА рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдХрд╛рд▓реЗ рд░рдВрдЧ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде 600 рдЧреБрдгрд╛ 600 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрдВрдЧреЗ:


рдЦрд┐рдбрд╝рдХреА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде, рдпрд╛ Esc рдХреБрдВрдЬреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рд▓реВрдк рдореЗрдВ рдПрдХ рдХреАрдмреЛрд░реНрдб рдХреАрд╕реНрдЯреНрд░реЛрдХ рд╣реИрдВрдбрд▓рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдЙрддрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝реЙрдиреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлрд╝реЙрдиреНрдЯ рдЯреНрд░реВ рдЯрд╛рдЗрдк Calibri рд▓рд┐рдпрд╛ред

рдЕрдм рд╣рдо рдЕрдкрдирд╛ рдЦреЗрд▓ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдирдпрд╛ рдЧреЗрдо рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:


рдЦреЗрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрд╕рдПрдлрдПрдордПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдбреНрд░реЙрдПрдмрд▓ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

Game.h
 #pragma once #include <SFML/Graphics.hpp> const int SIZE = 4; //      const int ARRAY_SIZE = SIZE * SIZE; //   const int FIELD_SIZE = 500; //      const int CELL_SIZE = 120; //     enum class Direction { Left = 0, Right = 1, Up = 2, Down = 3 }; class Game : public sf::Drawable, public sf::Transformable { protected: int elements[ARRAY_SIZE]; int empty_index; bool solved; sf::Font font; public: Game(); void Init(); bool Check(); void Move(Direction direction); public: virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; }; 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 #include <SFML/Graphics.hpp> 

рдпрд╣рд╛рдБ рд╣рдо рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:

 const int SIZE = 4; //      const int ARRAY_SIZE = SIZE * SIZE; //    const int FIELD_SIZE = 500; //      const int CELL_SIZE = 120; //     

рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд▓реЗрдЯ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 enum class Direction { Left = 0, Right = 1, Up = 2, Down = 3 }; 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╡рд░реНрдЧ рд╣реА:

 class Game : public sf::Drawable, public sf::Transformable { protected: int elements[ARRAY_SIZE]; int empty_index; bool solved; sf::Font font; public: Game(); void Init(); bool Check(); void Move(Direction direction); public: virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; }; 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рд╣реИ, рд╡рд╣ рд╣реИ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕рдореЗрдВ рдкреНрд▓реЗрдЬрд░ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдРрд░реЗ рдореЗрдВ рддрддреНрд╡ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ, рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдПрд░реЗ рдХреЗ рдкрд╣рд▓реЗ 4 рддрддреНрд╡ рдлреАрд▓реНрдб рдХреА рдкрд╣рд▓реА рд▓рд╛рдЗрди, рджреВрд╕рд░реА 4 рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рд╕реЗ рджреВрд╕рд░реА рд▓рд╛рдЗрди рдЖрджрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, рджреЛ рдЪрд░ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рд░ рдЪрд╛рд▓ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рд╡реЗ рд╣реИрдВ рдЦрд╛рд▓реА_рдЗрдВрдбреЗрдХреНрд╕ (рдПрдХ рдореБрдХреНрдд рд╕реЗрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ) рдФрд░ рд╣рд▓ (рдПрдХ рд╕рдВрдХреЗрдд рдЬреЛ рдкрд╣реЗрд▓реА рд╣рд▓ рд╣реИ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝реЙрдиреНрдЯ рдЪрд░ рд╡рд░реНрдЧ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЙрд╕ рдлрд╝реЙрдиреНрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред

Game.cpp
 #include "Game.h" Game::Game() { //      font.loadFromFile("calibri.ttf"); Init(); } void Game::Init() { //    for (int i = 0; i < ARRAY_SIZE - 1; i++) elements[i] = i + 1; //        empty_index = ARRAY_SIZE - 1; elements[empty_index] = 0; //     = 0 solved = true; } bool Game::Check() { //    for (unsigned int i = 0; i < ARRAY_SIZE; i++) { if (elements[i] > 0 && elements[i] != i + 1) return false; } return true; } void Game::Move(Direction direction) { //       int col = empty_index % SIZE; int row = empty_index / SIZE; //          int move_index = -1; if (direction == Direction::Left && col < (SIZE - 1)) move_index = empty_index + 1; if (direction == Direction::Right && col > 0) move_index = empty_index - 1; if (direction == Direction::Up && row < (SIZE - 1)) move_index = empty_index + SIZE; if (direction == Direction::Down && row > 0) move_index = empty_index - SIZE; //      if (empty_index >= 0 && move_index >= 0) { int tmp = elements[empty_index]; elements[empty_index] = elements[move_index]; elements[move_index] = tmp; empty_index = move_index; } solved = Check(); } void Game::draw(sf::RenderTarget& target, sf::RenderStates states) const { states.transform *= getTransform(); sf::Color color = sf::Color(200, 100, 200); //     sf::RectangleShape shape(sf::Vector2f(FIELD_SIZE, FIELD_SIZE)); shape.setOutlineThickness(2.f); shape.setOutlineColor(color); shape.setFillColor(sf::Color::Transparent); target.draw(shape, states); //       shape.setSize(sf::Vector2f(CELL_SIZE - 2, CELL_SIZE - 2)); shape.setOutlineThickness(2.f); shape.setOutlineColor(color); shape.setFillColor(sf::Color::Transparent); //        sf::Text text("", font, 52); for (unsigned int i = 0; i < ARRAY_SIZE; i++) { shape.setOutlineColor(color); text.setFillColor(color); text.setString(std::to_string(elements[i])); if (solved) { //      shape.setOutlineColor(sf::Color::Cyan); text.setFillColor(sf::Color::Cyan); } else if (elements[i] == i + 1) { //        text.setFillColor(sf::Color::Green); } //   ,   if (elements[i] > 0) { //      sf::Vector2f position(i % SIZE * CELL_SIZE + 10.f, i / SIZE * CELL_SIZE + 10.f); shape.setPosition(position); //     text.setPosition(position.x + 30.f + (elements[i] < 10 ? 15.f : 0.f), position.y + 25.f); target.draw(shape, states); target.draw(text, states); } } } 


рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреЗрдо рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИ:

 Game::Game() { //      font.loadFromFile("calibri.ttf"); Init(); } 

рдЦреЗрд▓ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдХреЛ рднрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд▓ рдХреА рдЧрдИ рдкрд╣реЗрд▓реА рдХрд╛ рд╕рдВрдХреЗрдд рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

 void Game::Init() { //    for (int i = 0; i < ARRAY_SIZE - 1; i++) elements[i] = i + 1; //   -     empty_index = ARRAY_SIZE - 1; elements[empty_index] = 0; //     = 0 solved = true; } 

рд╣рд╛рдВ, рд╢реБрд░реВ рдореЗрдВ рдЦреЗрд▓ рдХреЛ рд╣рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд░реИрдВрдбрдо рдЪрд╛рд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд╕рд╛ рдХреЛ рдорд┐рд▓рд╛рдПрдВрдЧреЗред

рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬрд╛рдБрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкрд╣реЗрд▓реА рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЪреЗрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 bool Game::Check() { //    for (unsigned int i = 0; i < ARRAY_SIZE; i++) { if (elements[i] > 0 && elements[i] != i + 1) return false; } return true; } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рдЦреЗрд▓ рдореЗрдВ рдкреНрд▓реЗрдЯ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:

 void Game::Move(Direction direction) { //       int col = empty_index % SIZE; int row = empty_index / SIZE; //          int move_index = -1; if (direction == Direction::Left && col < (SIZE - 1)) move_index = empty_index + 1; if (direction == Direction::Right && col > 0) move_index = empty_index - 1; if (direction == Direction::Up && row < (SIZE - 1)) move_index = empty_index + SIZE; if (direction == Direction::Down && row > 0) move_index = empty_index - SIZE; //      if (empty_index >= 0 && move_index >= 0) { int tmp = elements[empty_index]; elements[empty_index] = elements[move_index]; elements[move_index] = tmp; empty_index = move_index; } solved = Check(); } 

рдХрдХреНрд╖рд╛ рдХреА рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рд╡рд╣ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИ:

рдЦреАрдВрдЪрдирд╛
 void Game::draw(sf::RenderTarget& target, sf::RenderStates states) const { states.transform *= getTransform(); sf::Color color = sf::Color(200, 100, 200); //     sf::RectangleShape shape(sf::Vector2f(FIELD_SIZE, FIELD_SIZE)); shape.setOutlineThickness(2.f); shape.setOutlineColor(color); shape.setFillColor(sf::Color::Transparent); target.draw(shape, states); //       shape.setSize(sf::Vector2f(CELL_SIZE - 2, CELL_SIZE - 2)); shape.setOutlineThickness(2.f); shape.setOutlineColor(color); shape.setFillColor(sf::Color::Transparent); //        sf::Text text("", font, 52); for (unsigned int i = 0; i < ARRAY_SIZE; i++) { shape.setOutlineColor(color); text.setFillColor(color); text.setString(std::to_string(elements[i])); if (solved) { //      shape.setOutlineColor(sf::Color::Cyan); text.setFillColor(sf::Color::Cyan); } else if (elements[i] == i + 1) { //        text.setFillColor(sf::Color::Green); } //   ,   if (elements[i] > 0) { //      sf::Vector2f position(i % SIZE * CELL_SIZE + 10.f, i / SIZE * CELL_SIZE + 10.f); shape.setPosition(position); //     text.setPosition(position.x + 30.f + (elements[i] < 10 ? 15.f : 0.f), position.y + 25.f); //    target.draw(shape, states); //    target.draw(text, states); } } } 


рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдореЗрдВ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рд░реВрдкрд╛рдВрддрд░рдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдХреЗ, рд╕рдордиреНрд╡рдп рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, SFML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реЗрдХреНрдЯреЗрдВрдЧрд▓рд╢реИрдк рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рд╕реАрдорд╛рдУрдВ рдФрд░ рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдбреНрд░рд╛ рдХрд░реЗрдВред рдкрд╛рд╕рд╛ рдкрд░ рд╣рдо рдкреНрд▓реЗрдЯ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдкрд╛рда рднреА рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдкрд╣реЗрд▓реА рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдкрд╛рд╕рд╛ рдХрд╛ рд░рдВрдЧ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓реМрдЯрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

main.cpp
 // main.cpp #include <SFML/Graphics.hpp> #include "Game.h" int main() { //    600  600    60    sf::RenderWindow window(sf::VideoMode(600, 600), "15"); window.setFramerateLimit(60); sf::Font font; font.loadFromFile("calibri.ttf"); //     sf::Text text("F2 - New Game / Esc - Exit / Arrow Keys - Move Tile", font, 20); text.setFillColor(sf::Color::Cyan); text.setPosition(5.f, 5.f); //    Game game; game.setPosition(50.f, 50.f); sf::Event event; int move_counter = 0; //       while (window.isOpen()) { while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); if (event.type == sf::Event::KeyPressed) { //    -    if (event.key.code == sf::Keyboard::Escape) window.close(); if (event.key.code == sf::Keyboard::Left) game.Move(Direction::Left); if (event.key.code == sf::Keyboard::Right) game.Move(Direction::Right); if (event.key.code == sf::Keyboard::Up) game.Move(Direction::Up); if (event.key.code == sf::Keyboard::Down) game.Move(Direction::Down); //   if (event.key.code == sf::Keyboard::F2) { game.Init(); move_counter = 100; } } } //     ,    if (move_counter-- > 0) game.Move((Direction)(rand() % 4)); //      window.clear(); window.draw(game); window.draw(text); window.display(); } return 0; } 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реА рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (50.50) рдХреЗ рд╕рд╛рде рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ - рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдХреИрд╕реЗ рдЗрдВрдбреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдХреАрдмреЛрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреЗрдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рддреАрд░ рдХреБрдВрдЬреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд▓реЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдореВрд╡ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

F2 рдХреБрдВрдЬреА рджрдмрд╛рдиреЗ рд╕реЗ рдПрдХ рдирдП рдЧреЗрдо рдХреА рд╢реБрд░реБрдЖрдд рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣рдо рдЧреЗрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдЙрдирдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдкрд╛рд╕рд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧрд╛), рдФрд░ рдЪрд╛рд▓реЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдорд╛рди рднреА 100 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЪрд╛рд▓реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд╛рд╕рд╛ рдорд┐рд╢реНрд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╣реЗрд▓реА рдХреА рд╣рд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рднреА, рд╕рдВрдХрд▓рди, рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛, рдЪрд▓рд╛рдирд╛ рд╣реИ:



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЖрдк рдПрд╕рдПрдлрдПрдордПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕реА ++ рдЧреЗрдо рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реНрд╡рдпрдВ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi449596/


All Articles