Advertisement
Guest User

snake.cpp, snake_class.cpp, snake_class.h

a guest
Apr 11th, 2017
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.85 KB | None | 0 0
  1. //Plik snake.cpp - główny
  2.  
  3. #include "snake_class.h"
  4. #include <ncurses.h>
  5. #include <ctime>
  6.  
  7. WINDOW * create_win(int height, int width, int starty, int startx);
  8. void destroy_win(WINDOW *win);
  9. char sleep(int milliseconds);
  10. void turn_left(segment * obj);
  11. void turn_right(segment * obj);
  12.  
  13. int main()
  14. {
  15.     initscr();
  16.     cbreak();
  17.     noecho();
  18.     int height = LINES - 10, width = COLS - 10;
  19.     int starty = (LINES - height) / 2, startx = (COLS - width) / 2;
  20.     WINDOW *win = create_win(height, width, starty, startx);
  21.  
  22.     snake s(new segment(5, 5, segment::RIGHT, 0));
  23.     turn_point * turn = 0;
  24.     while(not s.move(height, width))
  25.     {
  26.         wclear(win);
  27.         box(win, 0, 0);
  28.         wrefresh(win);
  29.         segment * obj = s.head_val();
  30.         while(obj != 0)
  31.         {
  32.             mvwprintw(win, obj -> y_val(), obj -> x_val(), "%c", 'o');
  33.             turn_point * turn_obj = turn;
  34.             while(turn_obj != 0)
  35.             {
  36.                 if(turn_obj -> compare_with_segment(obj))
  37.                 {
  38.                     if(turn_obj -> side_val() == turn_point::LEFT)
  39.                         turn_left(obj);
  40.                     if(turn_obj -> side_val() == turn_point::RIGHT)
  41.                         turn_right(obj);
  42.                     if(obj -> next_segment() == 0)
  43.                         turn = turn -> next_turn();
  44.                 }
  45.                 turn_obj = turn_obj -> next_turn();
  46.             }
  47.             obj = obj -snake.cpp> next_segment();
  48.         }
  49.         wrefresh(win);
  50.         char c = sleep(500);
  51.         switch(c)
  52.         {
  53.             case ' ':
  54.                 break;
  55.             case 'a':
  56.                 turn_left(s.head_val());
  57.                 if(turn == 0)
  58.                     turn = new turn_point(s.head_val() -> x_val(), s.head_val() -> y_val(), 0, turn_point::LEFT);
  59.                 else
  60.                     turn -> add_turn(new turn_point(s.head_val() -> x_val(), s.head_val() -> y_val(), 0, turn_point::LEFT));
  61.                 break;
  62.             case 'd':
  63.                 turn_right(s.head_val());
  64.                 if(turn == 0)
  65.                     turn = new turn_point(s.head_val() -> x_val(), s.head_val() -> y_val(), 0, turn_point::RIGHT);
  66.                 else
  67.                     turn -> add_turn(new turn_point(s.head_val() -> x_val(), s.head_val() -> y_val(), 0, turn_point::RIGHT));
  68.                 break;
  69.             case 'q':
  70.                 s.add();
  71.                 break;
  72.         }
  73.         wrefresh(win);
  74.     }
  75.  
  76.     destroy_win(win);
  77.     endwin();
  78.     return 0;
  79. }
  80.  
  81. WINDOW * create_win(int height, int width, int starty, int startx)
  82. {
  83.     WINDOW *win;
  84.     win = newwin(height, width, starty, startx);
  85.     wrefresh(win);
  86.     refresh();
  87.     box(win, 0, 0);
  88.     wrefresh(win);
  89.     return win;
  90. }
  91.  
  92. void destroy_win(WINDOW *win)
  93. {  
  94.     wborder(win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
  95.     wrefresh(win);
  96.     delwin(win);
  97. }
  98.  
  99. char sleep(int milliseconds)
  100. {
  101.     clock_t stop = (double(milliseconds) / 1000) * CLOCKS_PER_SEC;
  102.     char c = ' ';
  103.     timeout(milliseconds);
  104.     c = getch();
  105.     while(clock() < stop)
  106.     {}
  107.     return c;
  108. }
  109.  
  110. void turn_left(segment * obj)
  111. {
  112.     segment::dest new_dest = obj -> dest_val();
  113.     switch(new_dest)
  114.     {
  115.         case segment::RIGHT:
  116.             obj -> set_dest(segment::UP);
  117.             break;
  118.         case segment::UP:
  119.             obj -> set_dest(segment::LEFT);
  120.             break;
  121.         case segment::LEFT:
  122.             obj -> set_dest(segment::DOWN);
  123.             break;
  124.         case segment::DOWN:
  125.             obj -> set_dest(segment::RIGHT);
  126.             break;
  127.     }
  128. }
  129.  
  130. void turn_right(segment * obj)
  131. {
  132.     segment::dest new_dest = obj -> dest_val();
  133.     switch(new_dest)
  134.     {
  135.         case segment::RIGHT:
  136.             obj -> set_dest(segment::DOWN);
  137.             break;
  138.         case segment::DOWN:
  139.             obj -> set_dest(segment::LEFT);
  140.             break;
  141.         case segment::LEFT:
  142.             obj -> set_dest(segment::UP);
  143.             break;
  144.         case segment::UP:
  145.             obj -> set_dest(segment::RIGHT);
  146.             break;
  147.     }
  148. }
  149.  
  150. //Plik nagłówkowy - snake_class.h
  151.  
  152. #ifndef _SNAKE_CLASS_H_
  153. #define _SNAKE_CLASS_H_
  154.  
  155. #include <iostream>
  156.  
  157. class segment //singe snake element
  158. {
  159. public:
  160.     enum dest {LEFT, RIGHT, UP, DOWN}; //destination
  161. private:
  162.     int x; //x value for a snake segment
  163.     int y; //y value for a snake segment
  164.     segment * next; //next snake element, 0 if last
  165.     dest seg_dest; //single segment destination
  166. public:
  167.     segment(); //defsault construtor
  168.     segment(int _x, int _y, dest _dest, segment * _next); //constructor
  169.     ~segment() {next = 0;} //destructor
  170.     void reset(int _x, int _y, dest _dest, segment * _next); //to same as constructor but not make on creating object
  171.     void set_next(segment * _next) {next = _next;} //set next segment
  172.     void set_dest(dest _dest) {seg_dest = _dest;} //set segment destination
  173.     segment * next_segment() const {return next;} //returns next segment pointer
  174.     int x_val() const {return x;} //returns x value of segment
  175.     int y_val() const {return y;} //returns y value of segment
  176.     dest dest_val() const {return seg_dest;} //returns destination of segment
  177. };
  178.  
  179. class snake
  180. {
  181. private:
  182.     segment * head; //first element of snake
  183. public:
  184.     snake(); //default constructor
  185.     snake(segment * _head); //constructor
  186.     ~snake() {head = 0;} //destructor
  187.     void add(); //adds one segment on end of snake
  188.     void remove(); //remove one segment from end of snake
  189.     bool move(int h, int w); //moves whole snake
  190.     segment * head_val() const {return head;} //returns pointer to snake head
  191. };
  192.  
  193. class turn_point
  194. {
  195. public:
  196.     enum side {LEFT, RIGHT};
  197. private:
  198.     int x; //x value for turn_point
  199.     int y; //y value for turn_point
  200.     turn_point * prev; //pointer to next turn_point
  201.     side turn_side;
  202. public:
  203.     turn_point();
  204.     turn_point(int _x, int _y, turn_point * _prev, side _side);
  205.     ~turn_point() {prev = 0;}
  206.     void add_turn(turn_point * _prev) {prev = _prev;}
  207.     turn_point * next_turn() const {return prev;}
  208.     bool compare_with_segment(segment * seg) const;
  209.     side side_val() const {return turn_side;}
  210. };
  211.  
  212. #endif
  213.  
  214. //Plik implementacyjny klas - snake_class.cpp
  215.  
  216. #include "snake_class.h"
  217.  
  218. /* Segment class implementation */
  219.  
  220. segment::segment()
  221. {
  222.     x = y = 0;
  223.     next = 0;
  224.     seg_dest = RIGHT;
  225. }
  226.  
  227. segment::segment(int _x, int _y, dest _dest, segment * _next)
  228. {
  229.     x = _x;
  230.     y = _y;
  231.     seg_dest = _dest;
  232.     next = _next;
  233. }
  234.  
  235. void segment::reset(int _x, int _y, dest _dest, segment * _next)
  236. {
  237.     x = _x;
  238.     y = _y;
  239.     seg_dest = _dest;
  240.     next = _next;
  241. }
  242.  
  243. /* Snake class implementation */
  244.  
  245. snake::snake()
  246. {
  247.     head = 0;
  248. }
  249.  
  250. snake::snake(segment * _head)
  251. {
  252.     head = _head;
  253. }
  254.  
  255. void snake::add()
  256. {
  257.     segment * obj = head;
  258.     while(obj -> next_segment() != 0)
  259.         obj = obj -> next_segment();
  260.     segment::dest last_dest = obj -> dest_val();
  261.     int obj_x = obj -> x_val();
  262.     int obj_y = obj -> y_val();
  263.     segment * last;
  264.     switch(last_dest)
  265.     {
  266.         case segment::UP:
  267.             last = new segment(obj_x, obj_y - 1, segment::UP, 0);
  268.             break;
  269.         case segment::DOWN:
  270.             last = new segment(obj_x, obj_y + 1, segment::DOWN, 0);
  271.             break;
  272.         case segment::RIGHT:
  273.             last = new segment(obj_x - 1, obj_y, segment::RIGHT, 0);
  274.             break;
  275.         case segment::LEFT:
  276.             last = new segment(obj_x + 1, obj_y, segment::LEFT, 0);
  277.             break;
  278.     }
  279.     obj -> set_next(last);
  280. }
  281.  
  282. void snake::remove()
  283. {
  284.     segment * obj = head;
  285.     while((obj -> next_segment()) -> next_segment() != 0)
  286.         obj = obj -> next_segment();
  287.     delete obj -> next_segment();
  288.     obj -> set_next(0);
  289. }
  290.  
  291. bool snake::move(int h, int w)
  292. {
  293.     segment * obj = head;
  294.     while(obj != 0)
  295.     {
  296.         segment::dest obj_dest = obj -> dest_val();
  297.         int obj_x = obj -> x_val();
  298.         int obj_y = obj -> y_val();
  299.         switch(obj_dest)
  300.         {
  301.             case segment::RIGHT:
  302.                 obj_x++;
  303.                 if(obj_x >= w - 1)
  304.                     return true;
  305.                 break;
  306.             case segment::LEFT:
  307.                 obj_x--;
  308.                 if(obj_x < 1)
  309.                     return true;
  310.                 break;
  311.             case segment::DOWN:
  312.                 obj_y++;
  313.                 if(obj_y >= h - 1)
  314.                     return true;
  315.                 break;
  316.             case segment::UP:
  317.                 obj_y--;
  318.                 if(obj_y < 1)
  319.                     return true;
  320.                 break;
  321.         }
  322.         obj -> reset(obj_x, obj_y, obj_dest, obj -> next_segment());
  323.         obj = obj -> next_segment();
  324.     }
  325.     return false;
  326. }
  327.  
  328. /* Turn point class implementation */
  329.  
  330. turn_point::turn_point()
  331. {
  332.     x = y = -1;
  333.     prev = 0;
  334.     turn_side = LEFT;
  335. }
  336.  
  337. turn_point::turn_point(int _x, int _y, turn_point * _prev, side _side)
  338. {
  339.     x = _x;
  340.     y = _y;
  341.     prev = _prev;
  342.     turn_side = _side;
  343. }
  344.  
  345. bool turn_point::compare_with_segment(segment * seg) const
  346. {
  347.     int seg_x = seg -> x_val();
  348.     int seg_y = seg -> y_val();
  349.     int obj_x = x;
  350.     int obj_y = y;
  351.     if(seg_x == obj_x && seg_y == obj_y)
  352.         return true;
  353.     return false;
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement