Kienan

pong <3

Jul 12th, 2025
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #define HEIGHT 25
  3. #define WIDTH 80
  4. #define WIN_SCORE 21
  5. #define ROCKET_HEIGHT 3
  6.  
  7. #define TRUE 1
  8. #define FALSE 0
  9.  
  10. int drawField(int x_ball, int y_ball, int y_rocket1, int y_rocket2);
  11. int calc_new_rocket_pos(int current_rocket_y);
  12. int is_ball_outside_left_border(int ball_x);
  13. int is_ball_outside_right_border(int ball_x);
  14. int calculate_ball_velocity_y(int y_ball_velocity, int y_ball);
  15. int calculate_ball_velocity_x(int x_ball_velocity, int x_ball, int y_ball, int y_rocket_left, int y_rocket_right);
  16.  
  17. int main(void)
  18. {
  19.     int score1 = 0, score2 = 0;
  20.  
  21.     while (1) {
  22.         int x_ball = WIDTH / 2;
  23.         int y_ball = HEIGHT / 2;
  24.  
  25.         int x_ball_velocity = -1;
  26.         int y_ball_velocity = 1;
  27.  
  28.         int y_rocket1 = HEIGHT / 2 - 1;
  29.         int y_rocket2 = HEIGHT / 2 - 1;
  30.         int is_playing = TRUE;
  31.         int player_turn_num = 1; // 1 - первый игрок, 2 - второй игрок
  32.         drawField(x_ball, y_ball, y_rocket1, y_rocket2);
  33.  
  34.         while (is_playing == TRUE) {
  35.             printf("\t\t \t\t%d \t : \t %d\n", score1, score2);
  36.  
  37.             if (player_turn_num == 1) {
  38.                 printf("First player turn:");
  39.                 y_rocket1 = calc_new_rocket_pos(y_rocket1);
  40.                 player_turn_num = 2;
  41.             } else {
  42.                 printf("\nSecond player turn:");
  43.                 y_rocket2 = calc_new_rocket_pos(y_rocket2);
  44.                 player_turn_num = 1;
  45.             }
  46.  
  47.             y_ball_velocity = calculate_ball_velocity_y(y_ball_velocity, y_ball);
  48.             x_ball_velocity = calculate_ball_velocity_x(x_ball_velocity, x_ball, y_ball, y_rocket1, y_rocket2);
  49.  
  50.             x_ball += x_ball_velocity;
  51.             y_ball += y_ball_velocity;
  52.  
  53.             if (is_ball_outside_left_border(x_ball) == TRUE) {
  54.                 score2 += 1;
  55.                 is_playing = FALSE;
  56.             }
  57.             else if (is_ball_outside_right_border(x_ball) == TRUE) {
  58.                 score1 += 1;
  59.                 is_playing = FALSE;
  60.             }
  61.  
  62.             drawField(x_ball, y_ball, y_rocket1, y_rocket2);
  63.         }
  64.     }
  65. }
  66.  
  67. int drawField(int x_ball, int y_ball, int y_rocket1, int y_rocket2)
  68. {
  69.     const char vertical = '|';
  70.     const char gorizontal = '-';
  71.     const char corner = '+';
  72.     const char ball = '0';
  73.     const int x_rocket1 = 2;
  74.     const int x_rocket2 = WIDTH - 3;
  75.  
  76.     for (int y = 0; y < HEIGHT; y++)
  77.     {
  78.         for (int x = 0; x < WIDTH; x++)
  79.         {
  80.             if ((x == 0 || x == WIDTH - 1) && (y == 0 || y == HEIGHT - 1))
  81.             {
  82.                 printf("%c", corner);
  83.             }
  84.  
  85.             else if (y == 0 || y == HEIGHT - 1)
  86.             {
  87.                 printf("%c", gorizontal);
  88.             }
  89.  
  90.             else if (x == 0 || x == WIDTH - 1)
  91.             {
  92.                 printf("%c", vertical);
  93.             }
  94.  
  95.             else if (x == x_ball && y == y_ball)
  96.             {
  97.                 printf("%c", ball);
  98.             }
  99.  
  100.             else if (x == x_rocket1 && (y == y_rocket1 || y == y_rocket1 + 1 || y == y_rocket1 + 2))
  101.             {
  102.                 printf("%c", vertical);
  103.             }
  104.  
  105.             else if (x == x_rocket2 && (y == y_rocket2 || y == y_rocket2 + 1 || y == y_rocket2 + 2))
  106.             {
  107.                 printf("%c", vertical);
  108.             }
  109.  
  110.             else
  111.             {
  112.                 printf(" ");
  113.             }
  114.         }
  115.         printf("\n");
  116.     }
  117.     return 0;
  118. }
  119.  
  120. int calc_new_rocket_pos(int current_rocket_y) {
  121.     char button;
  122.     scanf(" %c", &button);
  123.  
  124.     if (button == 'a' || button == 'k') {
  125.         current_rocket_y -= 1;
  126.     }
  127.     else if (button == 'z' || button == 'm') {
  128.         current_rocket_y += 1;
  129.     }
  130.  
  131.     int max_rocket_y = HEIGHT - ROCKET_HEIGHT - 1;
  132.     if (current_rocket_y > max_rocket_y)
  133.         return max_rocket_y;
  134.  
  135.     int min_rocket_y = 1;
  136.     if (current_rocket_y < min_rocket_y)
  137.         return min_rocket_y;
  138.  
  139.     return current_rocket_y;
  140. }
  141.  
  142. int is_ball_outside_left_border(int ball_x) {
  143.     if (ball_x <= 1)
  144.         return TRUE;
  145.  
  146.     return FALSE;
  147. }
  148.  
  149. int is_ball_outside_right_border(int ball_x) {
  150.     if (ball_x >= WIDTH - 1)
  151.         return TRUE;
  152.  
  153.     return FALSE;
  154. }
  155.  
  156. int calculate_ball_velocity_y(int y_ball_velocity, int y_ball) {
  157.     if (y_ball <= 2)
  158.         y_ball_velocity = 1;
  159.  
  160.     if (y_ball >= HEIGHT - 2)
  161.         y_ball_velocity = -1;
  162.  
  163.     printf("\ncalculate_ball_velocity_y: %d %d\n", y_ball, y_ball_velocity);
  164.  
  165.     return y_ball_velocity;
  166. }
  167.  
  168. int calculate_ball_velocity_x(int x_ball_velocity, int x_ball, int y_ball, int y_rocket_left, int y_rocket_right) {
  169.     if (x_ball == 3) {
  170.         if (y_ball < y_rocket_left + ROCKET_HEIGHT && y_ball >= y_rocket_left) {
  171.             x_ball_velocity *= -1;
  172.         }
  173.     }
  174.  
  175.     if (x_ball == WIDTH - 4) {
  176.         if (y_ball < y_rocket_right + ROCKET_HEIGHT && y_ball >= y_rocket_right) {
  177.             x_ball_velocity *= -1;
  178.         }
  179.     }
  180.  
  181.     return x_ball_velocity;
  182. }
  183.  
Advertisement
Add Comment
Please, Sign In to add comment