Advertisement
kirya_shkolnik

rt

Jan 29th, 2023 (edited)
918
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.61 KB | None | 0 0
  1. // I WANT TO PLAY WITH YOU
  2. //         YOUR FRIEND, AI
  3.  
  4. #include <stdio.h>
  5. #include <termios.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8.  
  9. #define MAX_X 80
  10. #define MAX_Y 24
  11. #define MAX_S 7
  12. #define MAX_S1 73
  13. #define Y_MIN 0
  14. #define X_MIN 0
  15. #define WIN_SCORE 21
  16. #define FAST_MODE 1
  17.  
  18.  
  19. int keypressed();
  20. void draw(int racket1_kkor1, int racket1_kkor2, int racket1_kkor3, int racket2_kkor1, int racket2_kkor2,
  21.   int racket2_kkor3, int ball_x, int ball_y, int resLeft, int resRight);
  22. int perem();
  23. int ball_coord(int * way, int * x, int * y, int Ly, int Ry);
  24.  
  25. int main() {
  26.   int countLeft = 0;
  27.   int countRight = 0;
  28.   int way = 2;
  29.  
  30.   while (1) {
  31.     int racket1_kkor1 = (MAX_Y) / 2 + 1;
  32.     int racket1_kkor2 = (MAX_Y) / 2;
  33.     int racket1_kkor3 = (MAX_Y) / 2 - 1;
  34.  
  35.     int racket2_kkor1 = (MAX_Y) / 2 + 1;
  36.     int racket2_kkor2 = (MAX_Y) / 2;
  37.     int racket2_kkor3 = (MAX_Y) / 2 - 1;
  38.  
  39.     int ball_x = MAX_X / 2;
  40.     int ball_y = MAX_Y / 2;
  41.     way = 1 + (countLeft + countRight) % 4;
  42.  
  43.     while (1) {
  44.       // system("clear");
  45.       // рисовка
  46.       printf("\033[2J\033[1;1H");
  47.       draw(racket1_kkor1, racket1_kkor2, racket1_kkor3, racket2_kkor1, racket2_kkor2, racket2_kkor3,
  48.         ball_x, ball_y, countLeft, countRight);
  49.       int res = ball_coord( & way, & ball_x, & ball_y, racket1_kkor2, racket2_kkor2);
  50.       if (res == 1) {
  51.         // ракетки
  52.         int peremvalue = 0;
  53.         if(FAST_MODE == 1){
  54.           int tempperem = perem();
  55.           if(tempperem != 0){
  56.             peremvalue = tempperem;
  57.           }
  58.         }
  59.         else{
  60.           peremvalue = perem();
  61.         }
  62.  
  63.         printf("%d", peremvalue);
  64.         if (peremvalue == 10 && racket1_kkor3 != MAX_Y - 3) {
  65.           racket1_kkor1++;
  66.           racket1_kkor2++;
  67.           racket1_kkor3++;
  68.         }
  69.         if (peremvalue == 11 && racket1_kkor1 != 4) {
  70.           racket1_kkor1--;
  71.           racket1_kkor2--;
  72.           racket1_kkor3--;
  73.         }
  74.         if (peremvalue == 20 && racket2_kkor3 != MAX_Y - 3) {
  75.           racket2_kkor1++;
  76.           racket2_kkor2++;
  77.           racket2_kkor3++;
  78.         }
  79.         if (peremvalue == 21 && racket2_kkor1 != 4) {
  80.           racket2_kkor1--;
  81.           racket2_kkor2--;
  82.           racket2_kkor3--;
  83.         }
  84.       } else if (res == 0) {
  85.         countLeft++;
  86.         break;
  87.       } else {
  88.         countRight++;
  89.         break;
  90.       }
  91.        usleep(200000);
  92.     }
  93.     if (countLeft == WIN_SCORE) {
  94.       printf("\033[2J\033[1;1H");
  95.       printf("FINAL SCORE: %d:%d\nLEFT PLAYER WON!!\nCONGRATULATIONS", countLeft, countRight);
  96.       getchar();
  97.       break;
  98.     }
  99.     if (countRight == WIN_SCORE) {
  100.       printf("\033[2J\033[1;1H");
  101.       printf("FINAL SCORE: %d:%d\nRIGHT PLAYER WON!!\nCONGRATULATIONS", countLeft, countRight);
  102.       getchar();
  103.       break;
  104.     }
  105.   }
  106. }
  107.  
  108. void draw(int racket1_kkor1, int racket1_kkor2, int racket1_kkor3, int racket2_kkor1, int racket2_kkor2,
  109.   int racket2_kkor3, int ball_x, int ball_y, int res_left, int res_right) {
  110.   char space = ' '; //переменая для пробела
  111.   char top = '#'; // переменная для верха/низа
  112.   char left = '#'; // переменная право/лево и ракеток
  113.   char rk = '|';
  114.   char sh = '*'; // переменная шара
  115.  
  116.   // проходим по всем полю для отрисовки
  117.   for (int i = 0; i <= MAX_Y; i++) {
  118.     // printf("%d", i);
  119.     if (i == 0 || i == MAX_Y) { // прописовка верха
  120.       for (int j = 0; j <= MAX_X; j++) {
  121.         printf("%c", top);
  122.       }
  123.       printf("\n");
  124.     }
  125.     // прорисовка тела
  126.  
  127.     if ((i > 0 && i < MAX_Y)) { //прорисовка сторон
  128.       printf("%c", left);
  129.       for (int j = 1; j < MAX_X; j++) {
  130.         if ((i == racket1_kkor1 || i == racket1_kkor2 || i == racket1_kkor3) && j == 7) {
  131.           printf("%c", rk);
  132.         } else if ((i == racket2_kkor1 || i == racket2_kkor2 || i == racket2_kkor3) && j == 73) {
  133.           printf("%c", rk);
  134.         } else if (i == ball_y && j == ball_x) {
  135.           printf("%c", sh);
  136.           /// *******
  137.         } else if (i == (MAX_Y - 3) && j == 3) {
  138.           if (res_left < 10) {
  139.             printf("%d", res_left);
  140.           } else {
  141.             printf("%d", res_left / 10);
  142.           }
  143.         } else if (i == (MAX_Y - 3) && j == 4) {
  144.           if (res_left >= 10) {
  145.             printf("%d", res_left % 10);
  146.           } else {
  147.  
  148.             printf("%c", space);
  149.           }
  150.         } else if (i == (MAX_Y - 3) && j == (MAX_X - 4)) {
  151.           if (res_left >= 10) {
  152.             printf("%d", res_right / 10);
  153.           } else {
  154.  
  155.             printf("%c", space);
  156.           }
  157.         } else if (i == (MAX_Y - 3) && j == (MAX_X - 3)) {
  158.           if (res_left < 10) {
  159.             printf("%d", res_right);
  160.           } else {
  161.             printf("%d", res_right % 10);
  162.           }
  163.         } else
  164.         /// *******
  165.           printf("%c", space);
  166.       }
  167.       printf("%c\n", left);
  168.     }
  169.   }
  170. }
  171. int keypressed() {
  172.     // termios - для управления терминальным интерфейсом
  173.     struct termios oldt, newt; // termios структура используется для настройки терминала. oldt newt - это два экземпляра этой структуры, которые будут использоваться для хранения текущих настроек терминала и измененных настроек соответственно.
  174.     char ch; //  будет использоваться для записывания символа с клавиатуры
  175.     int oldf; // будет использоваться для хранения старых флагов терминала
  176.  
  177.     tcgetattr(STDIN_FILENO, &oldt); // Этот вызов функции извлекает текущие настройки терминала и сохраняет их в oldt.
  178.     newt = oldt; // Переносим настройки в new
  179.     newt.c_lflag &= ~(ICANON | ECHO); // изменяем конфиги терминала. ICANON - это флаг для ввода. ECHO - флаг для вывода. С помощью ~ инвертируем флаги и получаем что отключен ввод и вывод
  180.     tcsetattr(STDIN_FILENO, TCSANOW, &newt); // Устанавливаем настройки из newt в терминал. TCSANOW - команда чтобы установить правила незамедлительно
  181.     oldf = fcntl(STDIN_FILENO, F_GETFL, 0); // извлекаем флаги терминала  в oldf
  182.     fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); // Устанавливаем флаги из oldf и добавляем к ним флаг NONBLOCK, чтобы не блокировать поток при вводе из консоли
  183.  
  184.     ch = getchar(); // символ из консоли
  185.  
  186.     tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // Эта строка восстанавливает исходные настройки терминала, устанавливая настройки терминала на исходные настройки, сохраненные в oldt
  187.     fcntl(STDIN_FILENO, F_SETFL, oldf); // Восстаналиваем оригинальныеы флаги
  188.  
  189.     if (ch != EOF) { // символ был прочитан и он не конец строки
  190.         ungetc(ch, stdin); // вернуть символ обратно в поток ввода и он будет прочитан функцией perem() в строке помеченной (**)
  191.         return 1;
  192.     }
  193.  
  194.     return 0;
  195. }
  196.  
  197. int perem() {
  198.   if(keypressed()){ // функция keypressed определяет было ли нажатие на кнопку
  199.   char k = 'k';
  200.   char m = 'm';
  201.   char a = 'a';
  202.   char z = 'z';
  203.   char prin;
  204.   prin = getchar(); // (**) - здесь точно такой же обычный ввод но теперь мы читаем именно тот возвращенный символ
  205.   printf("%c\n\n", prin);
  206.   if (prin == k) {
  207.     return 21;
  208.   } else if (prin == m) {
  209.     return 20;
  210.   } else if (prin == a) {
  211.     return 11;
  212.   } else if (prin == z) {
  213.     return 10;
  214.   } else {
  215.     return 0;
  216.   }
  217.   }
  218.   return 0;
  219. }
  220.  
  221. int ball_coord(int * way, int * x, int * y, int Ly, int Ry) {
  222.   //если кто-то из игроков забил гол
  223.   if ( * x == MAX_X - 5) {
  224.     return 0;
  225.   }
  226.   if ( * x == X_MIN + 5) {
  227.     return -1;
  228.   }
  229.   //если мяч ударяется о рокетку (1)
  230.   if (( * way == 2 && * x == MAX_S1 - 1 && * y == Ry + 2)) {
  231.     * way = 4;
  232.     return 1;
  233.   }
  234.   if (( * way == 3 && * x == MAX_S1 - 1 && * y == Ry - 2)) {
  235.     * way = 1;
  236.     return 1;
  237.   }
  238.   if (( * way == 1 && * x == MAX_S + 1 && * y == Ly + 2)) {
  239.     * way = 3;
  240.     return 1;
  241.   }
  242.   if (( * way == 4 && * x == MAX_S + 1 && * y == Ly - 2)) {
  243.     * way = 2;
  244.     return 1;
  245.   }
  246.   //если мяч ударяется о рокетку (2)
  247.   if (( * way == 2) && ( * x == MAX_S1 - 1) && ( * y == Ry || * y == Ry - 1 || * y == Ry + 1)) {
  248.     * way = 1;
  249.     * y = * y - 1;
  250.     * x = * x - 1;
  251.     return 1;
  252.   }
  253.   if (( * way == 3) && ( * x == MAX_S1 - 1) && ( * y == Ry || * y == Ry - 1 || * y == Ry + 1)) {
  254.     * way = 4;
  255.     * y = * y + 1;
  256.     * x = * x - 1;
  257.     return 1;
  258.   }
  259.   if (( * way == 1) && ( * x == MAX_S + 1) && ( * y == Ly || * y == Ly - 1 || * y == Ly + 1)) {
  260.     * way = 2;
  261.     * y = * y - 1;
  262.     * x = * x + 1;
  263.     return 1;
  264.   }
  265.   if (( * way == 4) && ( * x == MAX_S + 1) && ( * y == Ly || * y == Ly - 1 || * y == Ly + 1)) {
  266.     * way = 3;
  267.     * y = * y + 1;
  268.     * x = * x + 1;
  269.     return 1;
  270.   }
  271.   //если мяч ударяется о стенки
  272.   if ( * y == Y_MIN + 1 || * y == MAX_Y - 1) {
  273.     if ( * way == 1) {
  274.       * x = * x - 1;
  275.       * y = * y + 1;
  276.       * way = 4;
  277.       return 1;
  278.     }
  279.     if ( * way == 2) {
  280.       * x = * x + 1;
  281.       * y = * y + 1;
  282.       * way = 3;
  283.       return 1;
  284.     }
  285.     if ( * way == 3) {
  286.       * x = * x + 1;
  287.       * y = * y - 1;
  288.       * way = 2;
  289.       return 1;
  290.     }
  291.     if ( * way == 4) {
  292.       * x = * x - 1;
  293.       * y = * y - 1;
  294.       * way = 1;
  295.       return 1;
  296.     }
  297.   }
  298.   //остальные случаи
  299.   if ( * way == 1) {
  300.     * x = * x - 1;
  301.     * y = * y - 1;
  302.     return 1;
  303.   }
  304.   if ( * way == 2) {
  305.     * x = * x + 1;
  306.     * y = * y - 1;
  307.     return 1;
  308.   }
  309.   if ( * way == 3) {
  310.     * x = * x + 1;
  311.     * y = * y + 1;
  312.     return 1;
  313.   }
  314.   if ( * way == 4) {
  315.     * x = * x - 1;
  316.     * y = * y + 1;
  317.     return 1;
  318.   }
  319.   return 1;
  320. }
  321.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement