libdo

Untitled

Sep 14th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.12 KB | None | 0 0
  1. // fourthAttemptSnake.cpp: определяет точку входа для консольного приложения.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <GL/glut.h>
  6. #include <vector> // лучше лист
  7. //using namespace System;
  8. //using namespace System::Collections::Generic;
  9. class Point
  10. {
  11. public:
  12.     Point() { };
  13.     Point(int inputx, int inputy)
  14.     {
  15.         this->SetFirstCoordinate(inputx);
  16.         this->SetSecondCoordinate(inputy);
  17.     };
  18.     Point(Point & point)
  19.     {
  20.         x = point.x;
  21.         y = point.y;
  22.     };
  23.     bool isEquals(Point input)
  24.     {
  25.         return ((this->GetFirstCoordinate()==input.GetFirstCoordinate())&&(this->GetSecondCoordinate() == input.GetSecondCoordinate()));
  26.     }
  27.     void SetFirstCoordinate(int input) { x = input; };
  28.     void SetSecondCoordinate(int input) { y = input; };
  29.     int GetFirstCoordinate() { return x; };
  30.     int GetSecondCoordinate() { return y; };
  31.  
  32. private:
  33.     int x; int y;
  34. };
  35. // enum cellValue { Nothing, SnakeBodyBlock, Apple, WallBlock };  
  36. //static cellValue map[Size1][Size2];
  37. class Game
  38. {
  39. public:
  40.     Game()
  41.     {
  42.         /*for (int i = 0; i < Size1; i++)
  43.         for (int j = 0; j < Size2; j++)
  44.         *this->map[i, j] = Nothing;*/
  45.     };
  46. public:
  47.     static const int WindowSize1 = 800;
  48.     static const int WindowSize2 = 600;
  49.     static const int Size1 = 20;
  50.     static const int Size2 = 20;
  51.     static const int CellSize = WindowSize1 / Size1;
  52.     enum direction { Up, Right, Left, Down };
  53.     //static Graphic graph;
  54. };
  55. Point Apple;
  56. class Snake :public Game
  57. {
  58.  
  59.  
  60. public:
  61.  
  62.     class SnakeBodyElement// :public Snake
  63.     {
  64.     public:
  65.         SnakeBodyElement() {};
  66.         Point GetLocation()
  67.         {
  68.             return location;
  69.         }
  70.         void SetLocation(Point inputLocation)
  71.         {
  72.             location = inputLocation;
  73.         };
  74.     private:
  75.         Point location;
  76.     };
  77.     int bodySize;//
  78.     SnakeBodyElement body[5];
  79.     Snake(int size = 4)//!!!!
  80.     {
  81.         bodySize = size;
  82.         HeadDirection = Up;
  83.         for (int i = 0; i < bodySize; i++)
  84.         {
  85.             body[i].SetLocation(Point(Size1 / 2*CellSize, (Size2 / 2 - i)*CellSize));
  86.         }
  87.     };
  88.     void Move()// возможно вставить аргумент - нажатую клавишу
  89.     {
  90.         MoveHead();
  91.         CheckHeadCell();
  92.         BodyFollowHead();
  93.     };
  94.     void SetDirection(direction input)
  95.     {
  96.         HeadDirection = input;
  97.     };
  98.    
  99. private:
  100.     Point lastHeadLocation;
  101.     direction HeadDirection;//= Up;
  102.     void BodyFollowHead()
  103.     {
  104.         for (int i = bodySize - 1; i > 1; i--)
  105.         {
  106.             auto location = body[i].GetLocation();         
  107.             body[i].SetLocation(body[i - 1].GetLocation()); //- не рбит правильно
  108.             location = body[i].GetLocation();          
  109.         }
  110.         //auto location = body[1].GetLocation();       
  111.         body[1].SetLocation(lastHeadLocation);     
  112.     };
  113.     void CheckHeadCell()//
  114.     {   //либо здесь же вызывать функцию проигрыша\роста и т.д.
  115.         auto location = body[0].GetLocation();
  116.         if (Apple.isEquals(location))
  117.             this->Grow();
  118.         //this->Grow();
  119.         //ограничение по стенам
  120.     };
  121.     void Grow()
  122.     {
  123.         //change Apple
  124.         bodySize++;
  125.     };
  126.     void MoveHead()
  127.     {
  128.         Point location = body[0].GetLocation();
  129.         lastHeadLocation = location;
  130.         switch (HeadDirection)//все это убрать и напиисать foreach по ключам словаря
  131.         {
  132.         case Up:
  133.             body[0].SetLocation(Point(location.GetFirstCoordinate(), location.GetSecondCoordinate() + CellSize));
  134.             break;
  135.         case Down:
  136.             body[0].SetLocation(Point(location.GetFirstCoordinate(), location.GetSecondCoordinate() -  CellSize));
  137.             break;
  138.         case Right:
  139.             body[0].SetLocation(Point(location.GetFirstCoordinate() + CellSize, location.GetSecondCoordinate()));
  140.             break;
  141.         case Left:
  142.             body[0].SetLocation(Point(location.GetFirstCoordinate() - CellSize, location.GetSecondCoordinate()));
  143.             break;
  144.         }
  145.     };
  146. };
  147. class SnakeBodyElement :public Snake
  148. {
  149. public:
  150.     SnakeBodyElement() {};
  151.     Point GetLocation()
  152.     {
  153.         return location;
  154.     }
  155.     void SetLocation(Point inputLocation)
  156.     {
  157.         location = inputLocation;
  158.     };
  159. private:
  160.     Point location;
  161. };
  162. Snake snake;
  163. class Graphic :public Game
  164. {
  165. public:
  166.      static void processSpecialKeys(int key, int x, int y) {
  167.         switch (key) {
  168.         case GLUT_KEY_LEFT:
  169.             snake.SetDirection(Left);
  170.             break;
  171.         case GLUT_KEY_UP:
  172.             snake.SetDirection(Up);
  173.             break;
  174.         case GLUT_KEY_DOWN:
  175.             snake.SetDirection(Down);
  176.             break;
  177.         case GLUT_KEY_RIGHT:
  178.             snake.SetDirection(Right);
  179.             break;
  180.         }
  181.     }
  182.      static void DrawLines()
  183.     {
  184.         //glClear(GL_COLOR_BUFFER_BIT);
  185.         glBegin(GL_LINES);
  186.         glColor3f(0.2, 0.4, 0.6);
  187.         for (int x = 0; x < WindowSize1; x += CellSize)
  188.         {
  189.             glVertex2i(x, 0);
  190.             glVertex2i(x, WindowSize2);
  191.         }
  192.         for (int y = 0; y < WindowSize2; y += CellSize)
  193.         {
  194.             glVertex2i(0, y);
  195.             glVertex2i(WindowSize1, y);
  196.         }
  197.         glEnd();
  198.     }
  199.      static void DrawSnake()
  200.     {
  201.         glBegin(GL_QUADS);
  202.             glColor3f(0.2, 0.1, 0.7);//цвет змейки
  203.         for (int i = 0; i< snake.bodySize; i++)
  204.         {
  205.             Point location = snake.body[i].GetLocation();
  206.             glVertex2i(location.GetFirstCoordinate()+1, location.GetSecondCoordinate()+1);
  207.             glVertex2i(location.GetFirstCoordinate() + CellSize-1 , location.GetSecondCoordinate()+1);
  208.             glVertex2i(location.GetFirstCoordinate() + CellSize-1, location.GetSecondCoordinate() + CellSize-1);
  209.             glVertex2i(location.GetFirstCoordinate()+1, location.GetSecondCoordinate() + CellSize -1);
  210.            
  211.         }
  212.         glEnd;
  213.  
  214.     }
  215.     static void  DrawApple()
  216.     {
  217.         glBegin(GL_QUADS);
  218.         glColor3f(0.4, 0.3, 0.6);
  219.         glVertex2i(Apple.GetFirstCoordinate(), Apple.GetSecondCoordinate());
  220.         glVertex2i(Apple.GetFirstCoordinate() + CellSize , Apple.GetSecondCoordinate());
  221.         glVertex2i(Apple.GetFirstCoordinate() + CellSize, Apple.GetSecondCoordinate() + CellSize);
  222.         glVertex2i(Apple.GetFirstCoordinate(), Apple.GetSecondCoordinate() + CellSize );       
  223.         glEnd;
  224.     }
  225.      static void Display()
  226.     {
  227.         glClear(GL_COLOR_BUFFER_BIT);
  228.         //glClear();
  229.         glClearColor(0.0, 0.0, 0.0, 0.0);
  230.         DrawLines();
  231.         DrawSnake();
  232.         DrawApple();
  233.         glutSwapBuffers();
  234.     }
  235.      void static Reshape(int w, int h)
  236.     {
  237.         glViewport(0, 0, w, h);
  238.  
  239.         glMatrixMode(GL_PROJECTION);
  240.         glLoadIdentity();
  241.         gluOrtho2D(0, w, 0, h);
  242.  
  243.         glMatrixMode(GL_MODELVIEW);
  244.         glLoadIdentity();
  245.     }
  246.      void static Step(int input )
  247.      {
  248.         // Reshape(WindowSize1, WindowSize2);
  249.          
  250.          Display();      
  251.          snake.Move();
  252.          glutPostRedisplay();
  253.          glutTimerFunc(500, Step, 1);
  254.     //   Step(0);
  255.      }
  256.  
  257.     void GraphMain(int argc, char * argv[])
  258.     {
  259.  
  260.         glutInit(&argc, argv);
  261.         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); /*двойная буферизация и 4хкомпонентный цвет*/
  262.         glutInitWindowSize(WindowSize1, WindowSize2);
  263.         glutCreateWindow("Snake");
  264.         glutSpecialFunc(processSpecialKeys);
  265.         glClearColor(0, 0, 0,0);
  266.         /*glMatrixMode(GL_PROJECTION);
  267.         glLoadIdentity();*/
  268.         glutReshapeFunc(Reshape);
  269.         glutDisplayFunc(Display);      
  270.         glutTimerFunc(50, Step, 1);
  271.         //glutTimerFunc()
  272.         glutMainLoop();
  273.  
  274.     };
  275. };
  276. int main(int argc, char * argv[])
  277. {
  278.     Game b;
  279.     Graphic a;
  280.     a.GraphMain(argc,argv);
  281.     //*b.map[1, 2] = b.Nothing;
  282.     //b.a.Move();
  283.     //for (auto i = 0; i < b.Size2; i++)
  284.     //{
  285.     //  for (auto j = 0; j < b.Size1; j++)
  286.     //  {
  287.     //      std::cout << *b.map[j, i];// что-то не так с картой
  288.     //  }
  289.     //}
  290.  
  291.     return 0;
  292. };
Add Comment
Please, Sign In to add comment