Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h> // TODO: Если нельзя юзать либу для bool типов, то вместо них используй int, где 0 - false, 1 - true
- #include <unistd.h>
- #define WIDTH 80
- #define HEIGHT 24
- #define PADDLE_HEIGHT 3
- #define LOOP_UPDATE_MS 100000
- #define POINTS_PER_HIT 1
- // TODO: Если нельзя юзать структуры, то переделайте просто на обычные int переменые
- typedef struct {
- int position_x, position_y;
- int velocity_x, velocity_y;
- } Ball;
- typedef struct {
- int y;
- } Paddle;
- typedef struct {
- bool is_playing;
- int score;
- } GameStatus;
- void clear_screen() {
- printf("\033[2J\033[H"); // TODO: написать логику очистки консоли, хз сработает ли эта реализация
- }
- void draw_game(const Ball ball, const Paddle left_paddle, const Paddle right_paddle) {
- clear_screen();
- for (int x = 0; x < WIDTH + 2; x++) printf("#");
- printf("\n");
- for (int y = 0; y < HEIGHT; y++) {
- printf("#"); // Left border
- for (int x = 0; x < WIDTH; x++) {
- // Draw ball
- if (x == ball.position_x && y == ball.position_y) {
- printf("O");
- }
- // Draw paddles
- else if ((x == 0 && (y >= left_paddle.y && y < left_paddle.y + PADDLE_HEIGHT)) ||
- (x == WIDTH - 1 && (y >= right_paddle.y && y < right_paddle.y + PADDLE_HEIGHT))) {
- printf("|");
- } else {
- printf(" ");
- }
- }
- printf("#\n"); // Right border
- }
- // Draw bottom border
- for (int x = 0; x < WIDTH + 2; x++)
- printf("#");
- printf("\n");
- }
- void check_paddle_collision(Ball *ball, const Paddle *paddle, GameStatus *status) {
- bool is_ball_hit_paddle = ball->position_y <= paddle->y + PADDLE_HEIGHT && ball->position_y >= paddle->y;
- if (!is_ball_hit_paddle) {
- status->is_playing = false;
- } else {
- status->score += POINTS_PER_HIT;
- ball->velocity_x *= -1;
- }
- }
- void simulate_game(Ball *ball, const Paddle *left_paddle, const Paddle *right_paddle, GameStatus *status) {
- // двигаем мяч
- ball->position_x += ball->velocity_x;
- ball->position_y += ball->velocity_y;
- // просчет ударов об верхние границы
- if (ball->position_y <= 0 || ball->position_y >= HEIGHT - 1)
- ball->velocity_y *= -1;
- // просчет ударов об боковые границы или об платформы.
- if (ball->position_x <= 0)
- check_paddle_collision(ball, left_paddle, status);
- else if (ball->position_x >= WIDTH - 1)
- check_paddle_collision(ball, right_paddle, status);
- }
- int clamp(int value, int min_value, int max_value) {
- if (value > max_value)
- return max_value;
- if (value < min_value)
- return min_value;
- return value;
- }
- // TODO: написать логику инпута. где 1 = движение вверх; -1 = вниз; 0 = бездействие;
- // left_paddle_input - инпут для левой платформы
- // right_paddle_input - инпут для правой платформы
- void update_input(Paddle *left_paddle, Paddle *right_paddle) {
- int left_paddle_input = 0; // 1 = up; -1 = down; 0 = no input;
- int max_pos = HEIGHT - PADDLE_HEIGHT;
- left_paddle->y = clamp(left_paddle->y + left_paddle_input, 0, max_pos);
- int right_paddle_input = -1;
- right_paddle->y = clamp(right_paddle->y + right_paddle_input, 0, max_pos);
- }
- void draw_score(const GameStatus *game_status) {
- printf("\nGame End");
- printf("Score: %d\n", game_status->score);
- }
- int main() {
- Ball ball = {WIDTH / 2, HEIGHT / 2, 1, 1};
- Paddle left_paddle = {HEIGHT / 2 - 1};
- Paddle right_paddle = {HEIGHT / 2 - 1};
- GameStatus game_status = {true, 0};
- while (game_status.is_playing) {
- update_input(&left_paddle, &right_paddle);
- simulate_game(&ball, &left_paddle, &right_paddle, &game_status);
- draw_game(ball, left_paddle, right_paddle);
- usleep(LOOP_UPDATE_MS);
- }
- draw_score(&game_status);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement