Загрузка данных


#include <stdio.h>

#define WIDTH 80
#define HEIGHT 25
#define PADDLE_SIZE 3
#define WIN_SCORE 21
#define INITIAL_PADDLE_Y (HEIGHT / 2 - 1)

int IsValidInput(int key);
int ReadKey(void);
int MovePaddle(int paddle_y, int key, int up_key, int down_key);
int GetBallDirectionY(int ball_y, int ball_direction_y);
int GetBallDirectionX(int ball_x, int ball_y, int ball_direction_x, int ball_direction_y, int left_paddle_y,
                      int right_paddle_y);
int GetGoal(int ball_x);
char GetSymbol(int x, int y, int ball_x, int ball_y, int left_paddle_y, int right_paddle_y);
void DrawField(int ball_x, int ball_y, int left_paddle_y, int right_paddle_y, int score_left,
               int score_right);
void PrintWinner(int score_left);

int main(void) {
    int ball_x = WIDTH / 2;
    int ball_y = HEIGHT / 2;
    int ball_direction_x = 1;
    int ball_direction_y = 1;
    int left_paddle_y = INITIAL_PADDLE_Y;
    int right_paddle_y = INITIAL_PADDLE_Y;
    int score_left = 0;
    int score_right = 0;

    while (score_left < WIN_SCORE && score_right < WIN_SCORE) {
        DrawField(ball_x, ball_y, left_paddle_y, right_paddle_y, score_left, score_right);
        int key = ReadKey();
        left_paddle_y = MovePaddle(left_paddle_y, key, 'a', 'z');
        right_paddle_y = MovePaddle(right_paddle_y, key, 'k', 'm');
        ball_direction_y = GetBallDirectionY(ball_y, ball_direction_y);
        ball_direction_x = GetBallDirectionX(ball_x, ball_y, ball_direction_x, ball_direction_y,
                                             left_paddle_y, right_paddle_y);
        ball_x += ball_direction_x;
        ball_y += ball_direction_y;
        int goal = GetGoal(ball_x);

        if (goal != 0) {
            score_left += goal == 1;
            score_right += goal == 2;
            ball_x = WIDTH / 2;
            ball_y = HEIGHT / 2;
            left_paddle_y = INITIAL_PADDLE_Y;
            right_paddle_y = INITIAL_PADDLE_Y;
        }
    }

    DrawField(ball_x, ball_y, left_paddle_y, right_paddle_y, score_left, score_right);
    PrintWinner(score_left);

    return 0;
}

int IsValidInput(int key) {
    int is_valid = 0;

    if (key == 'a' || key == 'z' || key == 'k' || key == 'm' || key == ' ') {
        is_valid = 1;
    }

    return is_valid;
}

int ReadKey(void) {
    int key = 0;
    int is_valid = 0;

    while (is_valid == 0) {
        key = getchar();

        if (key >= 'A' && key <= 'Z') {
            key += 'a' - 'A';
        }

        is_valid = IsValidInput(key);
    }

    return key;
}

int MovePaddle(int paddle_y, int key, int up_key, int down_key) {
    if (key == up_key && paddle_y > 1) {
        paddle_y--;
    } else if (key == down_key && paddle_y < HEIGHT - PADDLE_SIZE - 1) {
        paddle_y++;
    }

    return paddle_y;
}

int GetBallDirectionY(int ball_y, int ball_direction_y) {
    int next_ball_y = ball_y + ball_direction_y;

    if (next_ball_y <= 0 || next_ball_y >= HEIGHT - 1) {
        ball_direction_y = -ball_direction_y;
    }

    return ball_direction_y;
}

int GetBallDirectionX(int ball_x, int ball_y, int ball_direction_x, int ball_direction_y, int left_paddle_y,
                      int right_paddle_y) {
    int next_ball_x = ball_x + ball_direction_x;
    int next_ball_y = ball_y + ball_direction_y;

    if (ball_direction_x < 0 && next_ball_x == 1 && next_ball_y >= left_paddle_y &&
        next_ball_y < left_paddle_y + PADDLE_SIZE) {
        ball_direction_x = 1;
    } else if (ball_direction_x > 0 && next_ball_x == WIDTH - 2 && next_ball_y >= right_paddle_y &&
               next_ball_y < right_paddle_y + PADDLE_SIZE) {
        ball_direction_x = -1;
    }

    return ball_direction_x;
}

int GetGoal(int ball_x) {
    int goal = 0;

    if (ball_x <= 0) {
        goal = 2;
    } else if (ball_x >= WIDTH - 1) {
        goal = 1;
    }

    return goal;
}

char GetSymbol(int x, int y, int ball_x, int ball_y, int left_paddle_y, int right_paddle_y) {
    char symbol = ' ';

    if (y == 0 || y == HEIGHT - 1) {
        symbol = '-';
    } else if (x == 0 || x == WIDTH - 1) {
        symbol = '|';
    } else if (x == 1 && y >= left_paddle_y && y < left_paddle_y + PADDLE_SIZE) {
        symbol = '|';
    } else if (x == WIDTH - 2 && y >= right_paddle_y && y < right_paddle_y + PADDLE_SIZE) {
        symbol = '|';
    } else if (x == ball_x && y == ball_y) {
        symbol = '*';
    }

    return symbol;
}

void DrawField(int ball_x, int ball_y, int left_paddle_y, int right_paddle_y, int score_left,
               int score_right) {
    int x;
    int y;

    printf("\nPlayer 1: %d    Player 2: %d\n", score_left, score_right);

    for (y = 0; y < HEIGHT; y++) {
        for (x = 0; x < WIDTH; x++) {
            printf("%c", GetSymbol(x, y, ball_x, ball_y, left_paddle_y, right_paddle_y));
        }

        printf("\n");
    }

    return;
}

void PrintWinner(int score_left) {
    if (score_left == WIN_SCORE) {
        printf("Player 1 wins!\n");
    } else {
        printf("Player 2 wins!\n");
    }

    return;
}