Advertisement
dllbridge

Untitled

Oct 11th, 2024
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.48 KB | None | 0 0
  1. #include  <iostream>  //     стандартная библиотека
  2. #include    <time.h>  //            случайные числа
  3. #include   <stdio.h>  //                 для printf
  4. #include <windows.h>  // для HANDLE, курсора, цвета
  5. #include   <conio.h>  //                  для kbhit
  6.  
  7. //#include       "f.h"
  8.  
  9.  
  10.  
  11. enum uprawlenie { LEFT, UP, RIGHT, DOWN };     // направление змейки
  12.  
  13. enum {KONEC, STENA,  PLUS, MOVE};
  14.  
  15. ///////////////////////////////////
  16. enum ConsoleColor                // Цвет
  17. {
  18.         Black         =  0,
  19.         Blue          =  1,
  20.         Green         =  2,
  21.         Cyan          =  3,
  22.         Red           =  4,
  23.         Magenta       =  5,
  24.         Brown         =  6,
  25.         LightGray     =  7,
  26.         DarkGray      =  8,
  27.         LightBlue     =  9,
  28.         LightGreen    = 10,
  29.         LightCyan     = 11,
  30.         LightRed      = 12,
  31.         LightMagenta  = 13,
  32.         Yellow        = 14,
  33.         White         = 15
  34. };
  35.  
  36.  
  37. //////////////////////////////////////////////////////////////////////
  38. struct Zmeja                                                        // структура змейка
  39. {
  40.       COORD     *t;                                                 //            точки
  41.       int   PCount;                                                 // количество яблок
  42. };
  43.  
  44.  
  45. //////////////////////////////////////////////////////////////////////  даные-точности: змейки, яблок,                    
  46. struct Game                                                         //  передвижение по X и Y, задержка, направление
  47. {
  48.     Zmeja  gaduka;                                                  //           змейка
  49.     COORD jabloko;                                                  //           яблоко
  50.     int        dx,
  51.                dy,                                                  //     передвижение
  52.             pause,                                                  //         задержка
  53.               nap;                                                  //      направление
  54. };
  55.  
  56. using namespace std;
  57.  
  58.  
  59.  
  60. HANDLE hConsole;
  61. //HANDLE hStdout, hStdin;
  62. HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  63.  
  64. void GotoXY(int X, int Y)
  65. {
  66.     COORD coord = { X, Y };
  67.     SetConsoleCursorPosition(hStdOut, coord);
  68. }
  69.  
  70.  
  71.  
  72. //////////////////////////////////////////////////////////////////////
  73. void SetColor(ConsoleColor text, ConsoleColor background)
  74. {
  75.     SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
  76. }
  77.  
  78.  
  79.  
  80.  
  81.  
  82. void PlusJabloko(Game &g) //Функция разброски яблок
  83. {
  84.     int i,x,y;
  85.     int n = g.gaduka.PCount;
  86.     do
  87.     {
  88.         x = rand() % 56+3; //
  89.         y = rand() % 19+3; //кординаты яблока
  90.         for(i = 0; i < n; i++)
  91.         {
  92.             if(x == g.gaduka.t[i].X && y == g.gaduka.t[i].Y) // проверка чтоб яблоко не бросить на змею
  93.                 break;
  94.         }
  95.     }
  96.     while(i < n);
  97.     g.jabloko.X = x; //
  98.     g.jabloko.Y = y; //запоминаем позицию яблока
  99.     SetConsoleCursorPosition(hConsole, g.jabloko); //переносим курсор в эту позицию
  100.     SetConsoleTextAttribute(hConsole,0x0c); //цвет яблока  
  101.     printf("%c", 4); //рисуем яблоко каким хотим символом
  102.    
  103. }
  104.  
  105.  
  106. void skorostGame(Game &g) // Функцыя старта змейки ее координат и скорости
  107. {
  108.     system("cls");
  109.     g.gaduka.PCount = 3;                                                //сколько точек в змейке
  110.     g.gaduka.t = new COORD [3];                                                  //создали точки
  111.     for(int i = 0; i < 3; i++)
  112.     {
  113.         g.gaduka.t[i].X = 20 + i;
  114.         g.gaduka.t[i].Y = 20;
  115.        
  116.     }
  117.     g.dx = 1;
  118.     g.dy = 0;
  119.     g.pause = 100;//скорость передвижение змеи
  120.     PlusJabloko(g);//рисуем яблока
  121. }
  122. void Level()
  123. {
  124.     GotoXY(10,10);cout <<"Vy nikogda ne vyigraete"<<endl; //НАДПИСЬ: Вы никогда не выиграете
  125.     GotoXY(10,11);cout <<"esli ne budete bditelny!"<<endl; //НАДПИСЬ: Если не будете бдительны!
  126. }
  127. void ZmejaStart()
  128. {
  129.     GotoXY(10,15);cout <<"Soberi 50 yablok, togda posmotrim ;)"<<endl; //НАДПИСЬ: Собери 50 яблок, тогда посмотрим ;)
  130. }
  131. void STENA_2() //Вся информация, отображаемая на стене
  132. {
  133.     SetColor(LightBlue , Black); GotoXY(20,0);
  134.                    cout <<  "Snake game by Danilenko Alexander"  <<endl;  //НАДПИСЬ: Игра Змейка Даниленко Александра
  135.     GotoXY(64, 2); cout <<  "Dannue:"                <<  endl;   // Данные
  136.     GotoXY(64, 3); cout <<  "Yablok:0"               <<  endl;   // Яблок
  137.     GotoXY(64, 4); cout <<  "Dlina:3"                <<  endl;   // Длина
  138.     GotoXY(64, 5); cout <<  "Speed:0"                <<  endl;   // Скорость
  139.     GotoXY(64, 7); cout <<  "Uprawlenie:"            <<  endl;   // Управление
  140.     GotoXY(64, 8); cout <<  "Esc:Wuxod"              <<  endl;   // Выход
  141.     GotoXY(64, 9); cout <<  "P:Pause"                <<  endl;   // Пауза
  142.     GotoXY(64,10); cout <<  "S:Start"                <<  endl;   // Старт
  143.     GotoXY(64,11); cout <<  "L:Level"                <<  endl;   // Уровень
  144.     GotoXY(64,13); printf("%c", 24); cout <<":Wwerx" <<  endl;   // Вверх
  145.     GotoXY(64,14); printf("%c", 25); cout <<":Wniz"  <<  endl;   // Вниз
  146.     GotoXY(64,15); printf("%c", 27); cout <<":Wlewo" <<  endl;   // Влево
  147.     GotoXY(64,16); printf("%c", 26); cout <<":Wprawo"<<  endl;   // Вправо
  148.                 {SetColor(LightMagenta , Black);
  149.                
  150.                 GotoXY(2,2); //Рисуем верхнюю горизонтальную линию-стенку
  151.                 int m = 0;
  152.                 for(m = 0; m < 60; m++)
  153.                 {
  154.                     printf("*");
  155.                 }
  156.                 }
  157.                
  158.                 {
  159.                     GotoXY(2,24); //Рисуем нижнюю горизонтальную линию-стенку
  160.                     int m = 0;
  161.                     for(m = 0; m < 60;m++)
  162.                     {
  163.                         printf("*");
  164.                     }
  165.                 }
  166.                 {   //Рисуем левую вертикальную линию-стенку
  167.                     GotoXY(2,3); cout << "*"<<endl;
  168.                     GotoXY(2,4); cout << "*"<<endl;
  169.                     GotoXY(2,5); cout << "*"<<endl;
  170.                     GotoXY(2,6); cout << "*"<<endl;
  171.                     GotoXY(2,7); cout << "*"<<endl;
  172.                     GotoXY(2,8); cout << "*"<<endl;
  173.                     GotoXY(2,9); cout << "*"<<endl;
  174.                     GotoXY(2,10); cout << "*"<<endl;
  175.                     GotoXY(2,11); cout << "*"<<endl;
  176.                     GotoXY(2,12); cout << "*"<<endl;
  177.                     GotoXY(2,13); cout << "*"<<endl;
  178.                     GotoXY(2,14); cout << "*"<<endl;
  179.                     GotoXY(2,15); cout << "*"<<endl;
  180.                     GotoXY(2,16); cout << "*"<<endl;
  181.                     GotoXY(2,17); cout << "*"<<endl;
  182.                     GotoXY(2,18); cout << "*"<<endl;
  183.                     GotoXY(2,19); cout << "*"<<endl;
  184.                     GotoXY(2,20); cout << "*"<<endl;
  185.                     GotoXY(2,21); cout << "*"<<endl;
  186.                     GotoXY(2,22); cout << "*"<<endl;
  187.                     GotoXY(2,23); cout << "*"<<endl;
  188.                 }
  189.                 {   //Рисуем правую вертикальную линию-стенку
  190.                     GotoXY(61,3); cout << "*"<<endl;
  191.                     GotoXY(61,4); cout << "*"<<endl;
  192.                     GotoXY(61,5); cout << "*"<<endl;
  193.                     GotoXY(61,6); cout << "*"<<endl;
  194.                     GotoXY(61,7); cout << "*"<<endl;
  195.                     GotoXY(61,8); cout << "*"<<endl;
  196.                     GotoXY(61,9); cout << "*"<<endl;
  197.                     GotoXY(61,10); cout << "*"<<endl;
  198.                     GotoXY(61,11); cout << "*"<<endl;
  199.                     GotoXY(61,12); cout << "*"<<endl;
  200.                     GotoXY(61,13); cout << "*"<<endl;
  201.                     GotoXY(61,14); cout << "*"<<endl;
  202.                     GotoXY(61,15); cout << "*"<<endl;
  203.                     GotoXY(61,16); cout << "*"<<endl;
  204.                     GotoXY(61,17); cout << "*"<<endl;
  205.                     GotoXY(61,18); cout << "*"<<endl;
  206.                     GotoXY(61,19); cout << "*"<<endl;
  207.                     GotoXY(61,20); cout << "*"<<endl;
  208.                     GotoXY(61,21); cout << "*"<<endl;
  209.                     GotoXY(61,22); cout << "*"<<endl;
  210.                     GotoXY(61,23); cout << "*"<<endl;
  211.                 }
  212. }
  213.  
  214.  
  215. //Функция которая двигает и рисует
  216.  
  217. int Move(Game &g)
  218. {
  219.     int & n = g.gaduka.PCount;
  220.     COORD head = g.gaduka.t[n - 1]; //голова
  221.     COORD tail = g.gaduka.t[0]; //хвост
  222.     COORD next;
  223.     next.X = head.X + g.dx;
  224.     next.Y = head.Y + g.dy; //проверка следующей точки по направлению
  225.  
  226.     if(next.X < 3 || next.Y < 3 || next.X > 60 || next.Y > 23)//не уперлась ли в стену?
  227.         return STENA;
  228.  
  229.     if(n > 4)
  230.     {
  231.         for(int i = 0; i < n; i++)
  232.             if(next.X == g.gaduka.t[i].X && next.Y == g.gaduka.t[i].Y) //не наехали ли на себя?
  233.                 return KONEC;
  234.     }
  235.  
  236.     if(next.X == g.jabloko.X && next.Y == g.jabloko.Y)
  237.     {
  238.         COORD*temp = new COORD[ ++n ]; //новый масив больший на 1
  239.         for(int i = 0; i < n; i++)
  240.             temp[i] = g.gaduka.t[i]; //перекопируем
  241.         temp[n - 1] = next; //добавляем одну
  242.         delete [] g.gaduka.t;
  243.         g.gaduka.t = temp;
  244.  
  245.         SetConsoleCursorPosition(hConsole,head);
  246.         SetConsoleTextAttribute(hConsole, 0x0a); //закрашываем яблоко которое сели
  247.         printf("*");
  248.         SetConsoleCursorPosition(hConsole,next);
  249.         SetConsoleTextAttribute(hConsole,0x0a);
  250.         printf("%c",1);
  251.         PlusJabloko(g);
  252.         return PLUS;
  253.     }
  254.  
  255.     for(int i = 0; i < n - 1; i++)
  256.         g.gaduka.t[i] = g.gaduka.t[i + 1];
  257.     g.gaduka.t[n - 1] = next;
  258.     SetConsoleCursorPosition(hConsole,tail);//закрашиваем хвостик
  259.     printf(" ");
  260.  
  261.     SetConsoleCursorPosition(hConsole,head);
  262.     SetConsoleTextAttribute(hConsole, 0x0a);//красим хвост змеи в зелений цвет
  263.     printf("*");
  264.     SetConsoleCursorPosition(hConsole,next);
  265.     SetConsoleTextAttribute(hConsole,0x0f); //красим курсор в белый цвет (голову змеи)
  266.     printf("%c",1);
  267.  
  268.     return MOVE;
  269. }
  270.  
  271. void intro()
  272. {
  273.         GotoXY(3,10); //Интруха
  274.     printf("ЋЎлз**п §¬Ґ©Є*. “Їа*ў«Ґ*ЁҐ §¬ҐоЄ®© - бв५®зЄ*¬Ё. Esc - ўл室 Ё§ ЁЈал.");
  275.     GotoXY(15,11);
  276.     printf("…б«Ё б®ЎҐас⥠50 пЎ«®Є, в® ў*б ¦¤св боаЇаЁ§ ;)");
  277.     GotoXY(18,15);
  278.     printf("„«п Їа®¤®«¦Ґ*Ёп влЄ*ЁвҐ ** **ЁЄҐ© :D");
  279.     getch();
  280. }
  281.  
  282. int main()
  283. {
  284.  
  285.  
  286.     hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //получаем дескриптор консоли
  287.     intro();
  288.     int key = 0, count = 0;
  289.     bool Pause=false;
  290.     Game g;
  291.     skorostGame(g);
  292.     STENA_2();
  293.     srand(time(0));
  294.     bool pause = false;
  295.     while(key != 27)
  296.     {
  297.         while(!kbhit()) //ждет пока нажмем
  298.         {
  299.             if(Pause==true)
  300.             {
  301.                 Sleep(1);
  302.                 continue;
  303.             }
  304.  
  305.             switch (Move(g))//движение
  306.             {
  307.  
  308.             case PLUS:
  309.                 ++count;
  310.                 g.pause-=1;
  311.                 SetColor(LightBlue , Black);
  312.                 GotoXY(64,2);cout <<  "Danue:" << endl ;
  313.                 GotoXY(64,3); cout << "Jablok:" <<count << endl;
  314.                 GotoXY(64,4); cout << "Dlina:" <<g.gaduka.PCount << endl;
  315.                 GotoXY(64,5); cout << "Speed:" <<g.pause<< endl;
  316.                 GotoXY(64,7); cout << "Uprawlenie:" <<  endl;
  317.                 GotoXY(64,8); cout << "Esc:Wuxod" <<  endl;
  318.                 GotoXY(64,9); cout << "P:Pause" <<  endl;
  319.                 GotoXY(64,10); cout <<"S:Start" <<  endl;
  320.                 GotoXY(64,11); cout <<"L:Level" <<  endl;
  321.                 GotoXY(64,13);printf("%c",24);cout <<":Wwerx"<<endl;
  322.                 GotoXY(64,14);printf("%c",25);cout<<":Wniz"<<endl;
  323.                 GotoXY(64,15);printf("%c",27);cout<<":Wlewo"<<endl;
  324.                 GotoXY(64,16);printf("%c",26);cout<<":Wprawo"<<endl;
  325.                 if (count == 50)
  326.                 {
  327.                     SetColor(White , Black);
  328.                     GotoXY(24,1); cout << "Vy vyigrali! Pozdravlyayu! Vy ne chelovek! xD" << endl; //Вы выиграли
  329.                     getch();
  330.                     return(0);
  331.                 }
  332.                 break;
  333.  
  334.             case STENA:
  335.  
  336.             case KONEC:
  337.                 GotoXY(23,1); printf("‚л Їа®ЁЈа*«Ё! •*-е*-е*!!!\n\n\t\t\t"); //Вы проиграли, ХА ХА ХА
  338.                 getch();
  339.                 break;
  340.             }
  341.  
  342.             Sleep(g.pause); //Задержка
  343.         }
  344.     key = getch();
  345.  
  346.         if(key=='P'||key=='p')
  347.             Pause=!Pause;
  348.             else if(key=='S'||key=='s')
  349.             ZmejaStart();
  350.         else if(key=='L'||key=='l')
  351.             Level();
  352.         else if(key==0||key==224)
  353.         {
  354.             key=getch();
  355.            
  356.             if(key == 72 && g.nap != DOWN)
  357.             {
  358.                 g.nap = UP;
  359.                 g.dx = 0;
  360.                 g.dy = -1;
  361.             }
  362.             else if(key == 80 && g.nap != UP)
  363.             {
  364.                 g.nap = DOWN;
  365.                 g.dx = 0;
  366.                 g.dy = 1;
  367.             }
  368.             else if(key == 75 && g.nap != RIGHT)
  369.             {
  370.                 g.nap = LEFT;
  371.                 g.dx = -1;
  372.                 g.dy = 0;
  373.             }
  374.             else if(key == 77 && g.nap != LEFT)
  375.             {
  376.                 g.nap = RIGHT;
  377.                 g.dx = 1;
  378.                 g.dy = 0;
  379.             }
  380.         }
  381.     }
  382. }
  383.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement