Advertisement
Kienan

Pong

Jul 11th, 2025 (edited)
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h> // TODO: Если нельзя юзать либу для bool типов, то вместо них используй int, где 0 - false, 1 - true
  3. #include <unistd.h>
  4.  
  5. #define WIDTH 80
  6. #define HEIGHT 24
  7. #define PADDLE_HEIGHT 3
  8. #define LOOP_UPDATE_MS 100000
  9. #define POINTS_PER_HIT 1
  10.  
  11. // TODO: Если нельзя юзать структуры, то переделайте просто на обычные int переменые
  12. typedef struct {
  13.     int position_x, position_y;
  14.     int velocity_x, velocity_y;
  15. } Ball;
  16.  
  17. typedef struct {
  18.     int y;
  19. } Paddle;
  20.  
  21. typedef struct {
  22.     bool is_playing;
  23.     int score;
  24. } GameStatus;
  25.  
  26. void clear_screen() {
  27.     printf("\033[2J\033[H"); // TODO: написать логику очистки консоли, хз сработает ли эта реализация
  28. }
  29.  
  30. void draw_game(const Ball ball, const Paddle left_paddle, const Paddle right_paddle) {
  31.     clear_screen();
  32.  
  33.     for (int x = 0; x < WIDTH + 2; x++) printf("#");
  34.     printf("\n");
  35.  
  36.     for (int y = 0; y < HEIGHT; y++) {
  37.         printf("#"); // Left border
  38.  
  39.         for (int x = 0; x < WIDTH; x++) {
  40.             // Draw ball
  41.             if (x == ball.position_x && y == ball.position_y) {
  42.                 printf("O");
  43.             }
  44.             // Draw paddles
  45.             else if ((x == 0 && (y >= left_paddle.y && y < left_paddle.y + PADDLE_HEIGHT)) ||
  46.                      (x == WIDTH - 1 && (y >= right_paddle.y && y < right_paddle.y + PADDLE_HEIGHT))) {
  47.                 printf("|");
  48.             } else {
  49.                 printf(" ");
  50.             }
  51.         }
  52.  
  53.         printf("#\n"); // Right border
  54.     }
  55.  
  56.     // Draw bottom border
  57.     for (int x = 0; x < WIDTH + 2; x++)
  58.         printf("#");
  59.  
  60.     printf("\n");
  61. }
  62.  
  63. void check_paddle_collision(Ball *ball, const Paddle *paddle, GameStatus *status) {
  64.     bool is_ball_hit_paddle = ball->position_y <= paddle->y + PADDLE_HEIGHT && ball->position_y >= paddle->y;
  65.     if (!is_ball_hit_paddle) {
  66.         status->is_playing = false;
  67.     } else {
  68.         status->score += POINTS_PER_HIT;
  69.         ball->velocity_x *= -1;
  70.     }
  71. }
  72.  
  73. void simulate_game(Ball *ball, const Paddle *left_paddle, const Paddle *right_paddle, GameStatus *status) {
  74.     // двигаем мяч
  75.     ball->position_x += ball->velocity_x;
  76.     ball->position_y += ball->velocity_y;
  77.  
  78.     // просчет ударов об верхние границы
  79.     if (ball->position_y <= 0 || ball->position_y >= HEIGHT - 1)
  80.         ball->velocity_y *= -1;
  81.  
  82.     // просчет ударов об боковые границы или об платформы.
  83.     if (ball->position_x <= 0)
  84.         check_paddle_collision(ball, left_paddle, status);
  85.     else if (ball->position_x >= WIDTH - 1)
  86.         check_paddle_collision(ball, right_paddle, status);
  87. }
  88.  
  89. int clamp(int value, int min_value, int max_value) {
  90.     if (value > max_value)
  91.         return max_value;
  92.  
  93.     if (value < min_value)
  94.         return min_value;
  95.  
  96.     return value;
  97. }
  98.  
  99. // TODO: написать логику инпута. где 1 = движение вверх; -1 = вниз; 0 = бездействие;
  100. // left_paddle_input - инпут для левой платформы
  101. // right_paddle_input - инпут для правой платформы
  102. void update_input(Paddle *left_paddle, Paddle *right_paddle) {
  103.     int left_paddle_input = 0; // 1 = up; -1 = down; 0 = no input;
  104.     int max_pos = HEIGHT - PADDLE_HEIGHT;
  105.     left_paddle->y = clamp(left_paddle->y + left_paddle_input, 0, max_pos);
  106.  
  107.     int right_paddle_input = -1;
  108.     right_paddle->y = clamp(right_paddle->y + right_paddle_input, 0, max_pos);
  109. }
  110.  
  111. void draw_score(const GameStatus *game_status) {
  112.     printf("\nGame End");
  113.     printf("Score: %d\n", game_status->score);
  114. }
  115.  
  116. int main() {
  117.     Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1};
  118.     Paddle left_paddle = {HEIGHT / 2 - 1};
  119.     Paddle right_paddle = {HEIGHT / 2 - 1};
  120.     GameStatus game_status = {true, 0};
  121.  
  122.     while (game_status.is_playing) {
  123.         update_input(&left_paddle, &right_paddle);
  124.         simulate_game(&ball, &left_paddle, &right_paddle, &game_status);
  125.         draw_game(ball, left_paddle, right_paddle);
  126.         usleep(LOOP_UPDATE_MS);
  127.     }
  128.  
  129.     draw_score(&game_status);
  130.  
  131.     return 0;
  132. }
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement