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


#include <stdio.h>

void print_welcome() {
    for (int i = 0; i < 20; i++) printf("\n");

    printf("|==================================================|\n");
    printf("|           ПРИВЕТСТВУЮ В ИГРЕ 'ПОНГ' :)           |\n");
    printf("|==================================================|\n");
    printf("|                                                  |\n");
    printf("|  Управление:                                     |\n");
    printf("|  Игрок 1 [СЛЕВА]:  [A] - Вверх, [Z] - Вниз       |\n");
    printf("|  Игрок 2 [СПРАВА]: [K] - Вверх, [M] - Вниз       |\n");
    printf("|  Пропуск хода:     [Пробел]                      |\n");
    printf("|                                                  |\n");
    printf("|  Правила:                                        |\n");
    printf("|  Эта игра идет до 21 очка.                       |\n");
    printf("|  Каждое действие подтверждайте клавишей 'ENTER'. |\n");
    printf("|                                                  |\n");
    printf("|                                                  |\n");
    printf("|   ДЛЯ ЗАПУСКА ИГРЫ НАЖМИТЕ ЛЮБУЮ, КЛАВИШУ        |\n");
    printf("|==================================================|\n");

    for (int i = 0; i < 5; i++) printf("\n");

    while (getchar() != '\n');
}

void print_field(int ball_x, int ball_y, int racket_left_y, int racket_right_y) {
    const int X_SIZE = 80;
    const int Y_SIZE = 25;
    const int RACKET_SIZE = 3;
    const int LEFT_X = 3;
    const int RIGHT_X = X_SIZE - LEFT_X - 1;

    int x, y;
    for (y = 0; y < Y_SIZE; y++) {
        for (x = 0; x < X_SIZE; x++) {
            if (y == 0 || y == Y_SIZE - 1) {
                printf("-");
            } else if (x == ball_x && y == ball_y) {
                printf("o");
            } else if (x == LEFT_X && y >= racket_left_y && y < racket_left_y + RACKET_SIZE) {
                printf("|");
            } else if (x == RIGHT_X && y >= racket_right_y && y < racket_right_y + RACKET_SIZE) {
                printf("|");
            } else if (x == X_SIZE / 2) {
                printf("|");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
}

void print_score(int score_left, int score_right) {
    for (int i = 0; i < 30; i++) {
        printf("\n");
    }
    int margin_left = 27;
    for (int i = 0; i < margin_left; i++) {
        printf(" ");
    }
    printf("          SCORE\n\n");
    for (int i = 0; i < margin_left; i++) {
        printf(" ");
    }
    printf("Player 1          Player 2\n\n");
    for (int i = 0; i < margin_left; i++) {
        printf(" ");
    }
    printf("   %d                 %d  \n\n\n", score_left, score_right);
}

void who_win(int player_number) {
    if (player_number == 0) {
        printf(
            "-------------------------------------------------------------------"
            "-------------\n              "
            "    "
            "                                                              \n   "
            "                             "
            "    "
            "                                            \n                     "
            "                             "
            "    "
            "                          \n                                       "
            "                             "
            "    "
            "        \n                                                         "
            "                       \n    "
            "    "
            "                                                                   "
            "     \n                      "
            "    "
            "                                                      \n           "
            "                             "
            "    "
            "                                    \n                             "
            "                             "
            "    "
            "                  \n                                               "
            "                             "
            "    "
            "\n            ████  █     ███  █   █ ████ ███    █      █   █ █ █  "
            " █            \n            "
            "█   "
            "█ █    █   █  █ █  █    █  █  ██      █   █ █ ██  █            \n  "
            "          ████  █    █████   "
            "█   "
            "███  ███    █      █ █ █ █ █ █ █            \n            █     █  "
            "  █   █   █   █    █ █    █  "
            "    "
            "██ ██ █ █  ██            \n            █     ████ █   █   █   ████ "
            "█  █  ███      █ █  █ █   █  "
            "    "
            "      \n                                                           "
            "                     \n      "
            "    "
            "                                                                   "
            "   \n                        "
            "    "
            "                                                    \n             "
            "                             "
            "    "
            "                                  \n                               "
            "                             "
            "    "
            "                \n                                                 "
            "                             "
            "  "
            "\n                                                                 "
            "               \n            "
            "    "
            "                                                                "
            "\n-----------------------------------------------------------------"
            "---------------\n");
    } else {
        printf(
            "-------------------------------------------------------------------"
            "-------------\n              "
            "    "
            "                                                              \n   "
            "                             "
            "    "
            "                                            \n                     "
            "                             "
            "    "
            "                          \n                                       "
            "                             "
            "    "
            "        \n                                                         "
            "                       \n    "
            "    "
            "                                                                   "
            "     \n                      "
            "    "
            "                                                      \n           "
            "                             "
            "    "
            "                                    \n                             "
            "                             "
            "    "
            "                  \n                                               "
            "                             "
            "    "
            "\n            ████  █     ███  █   █ ████ ████  ████     █   █ █ █ "
            "  █            \n            "
            "█   "
            "█ █    █   █  █ █  █    █   █    █     █   █ █ ██  █            \n "
            "           ████  █    █████  "
            " █  "
            " ███  ████   ███     █ █ █ █ █ █ █            \n            █     "
            "█    █   █   █   █    █ █   █ "
            "    "
            "   ██ ██ █ █  ██            \n            █     ████ █   █   █   "
            "████ █  █  █████     █ █  █ █  "
            " █  "
            "          \n                                                       "
            "                         \n  "
            "    "
            "                                                                   "
            "       \n                    "
            "    "
            "                                                        \n         "
            "                             "
            "    "
            "                                      \n                           "
            "                             "
            "    "
            "                    \n                                             "
            "                             "
            "    "
            "  \n                                                               "
            "                 \n          "
            "    "
            "                                                                  "
            "\n-----------------------------------------------------------------"
            "---------------\n");
    }
}

int move_racket(int racket_left_y, int racket_right_y, int direction, int player_number) {
    const int RACKET_SIZE = 3;
    const int Y_SIZE = 25;

    if (direction == -1 && player_number == 0 && racket_left_y > 1) {
        racket_left_y--;
    } else if (player_number == 0 && direction == 1 && (racket_left_y + (RACKET_SIZE + 1) < Y_SIZE)) {
        racket_left_y++;
    } else if (player_number == 1 && direction == -1 && racket_right_y > 1) {
        racket_right_y--;
    } else if (player_number == 1 && direction == 1 && (racket_right_y + (RACKET_SIZE + 1) < Y_SIZE)) {
        racket_right_y++;
    }

    int trigger_racket;
    if (player_number == 0) {
        trigger_racket = racket_left_y;
    } else {
        trigger_racket = racket_right_y;
    }

    return trigger_racket;
}

int move_ball_x(int ball_x, int ball_y, int speed_x, int racket_left_y, int racket_right_y, int speed_y) {
    const int X_SIZE = 79;
    const int RACKET_MARGIN = 3;
    const int SHADOW_WALL_LEFT_X = 4;
    const int SHADOW_WALL_RIGHT_X = X_SIZE - 1 - RACKET_MARGIN;
    int res = ball_x + speed_x;

    if ((res == SHADOW_WALL_LEFT_X - 1) && (ball_y + speed_y >= racket_left_y) &&
        (ball_y + speed_y <= racket_left_y + 2)) {
        res -= 2 * speed_x;
    } else if ((res == SHADOW_WALL_RIGHT_X + 1) && (ball_y + speed_y >= racket_right_y) &&
               (ball_y + speed_y <= racket_right_y + 2)) {
        res -= 2 * speed_x;
    } else if (res < SHADOW_WALL_LEFT_X && ball_y >= racket_left_y && ball_y <= racket_left_y + 2) {
        res += 2 * (SHADOW_WALL_LEFT_X - res);
    } else if (res > SHADOW_WALL_RIGHT_X && ball_y >= racket_right_y && ball_y <= racket_right_y + 2) {
        res -= 2 * (res - SHADOW_WALL_RIGHT_X);
    } else if (ball_x == SHADOW_WALL_LEFT_X && ball_y >= racket_left_y && ball_y <= racket_left_y + 2 &&
               speed_x < 0) {
        res -= 2 * speed_x;
    } else if (ball_x == SHADOW_WALL_RIGHT_X && ball_y >= racket_right_y && ball_y <= racket_right_y + 2 &&
               speed_x > 0) {
        res -= 2 * speed_x;
    } else if ((res == SHADOW_WALL_LEFT_X - 1) && (ball_y + speed_y >= racket_left_y) &&
               (ball_y + speed_y <= racket_left_y + 2)) {
        res -= 2 * speed_x;
    } else if ((res == SHADOW_WALL_RIGHT_X + 1) && (ball_y + speed_y >= racket_right_y) &&
               (ball_y + speed_y <= racket_right_y + 2)) {
        res -= 2 * speed_x;
    }
    return res;
}

int move_ball_y(int ball_y, int speed_y) {
    const int Y_SIZE = 24;
    const int SHADOW_WALL_BOTTOM_Y = 1;
    const int SHADOW_WALL_TOP_Y = Y_SIZE - 1;

    int res = ball_y + speed_y;
    if (ball_y == SHADOW_WALL_BOTTOM_Y && speed_y < 0) {
        res -= 2 * speed_y;
    } else if (ball_y == SHADOW_WALL_TOP_Y && speed_y > 0) {
        res -= 2 * speed_y;
    } else if (res > SHADOW_WALL_TOP_Y) {
        res -= 2 * (res - SHADOW_WALL_TOP_Y);
    } else if (res < SHADOW_WALL_BOTTOM_Y) {
        res += 2 * (SHADOW_WALL_BOTTOM_Y - res);
    }

    return res;
}

int get_valid_input() {
    int chr;
    int valid = 0;

    while (!valid) {
        chr = getchar();
        if (chr == EOF) return 0;

        int is_valid_char = chr == ' ' || chr == 'A' || chr == 'a' || chr == 'Z' || chr == 'z' ||
                            chr == 'K' || chr == 'k' || chr == 'M' || chr == 'm';

        if (is_valid_char) {
            int next = getchar();
            if (next == '\n') {
                valid = 1;
            } else {
                int c;
                while ((c = getchar()) != '\n' && c != EOF);
            }
        } else {
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
        }
    }

    return chr;

    int ret;
    if (chr == 'A' || chr == 'a' || chr == 'K' || chr == 'k') {
        ret = -1;
    } else if (chr == 'Z' || chr == 'z' || chr == 'M' || chr == 'm') {
        ret = 1;
    } else {
        ret = 0;
    }
    return ret;
}

int get_player_by_char(char chr) {
    int player_number;
    if (chr == 'A' || chr == 'a' || chr == 'Z' || chr == 'z') {
        player_number = 0;
    } else if (chr == 'K' || chr == 'k' || chr == 'M' || chr == 'm') {
        player_number = 1;
    } else {
        player_number = -1;
    }
    return player_number;
}

int get_direction_by_char(char chr) {
    int dir;
    if (chr == 'A' || chr == 'a' || chr == 'K' || chr == 'k') {
        dir = -1;
    } else if (chr == 'Z' || chr == 'z' || chr == 'M' || chr == 'm') {
        dir = 1;
    } else {
        dir = 0;
    }
    return dir;
}

int main() {
    const int X_SIZE = 80;
    const int Y_SIZE = 25;
    const int BALL_X_START = X_SIZE / 2;
    const int BALL_Y_START = Y_SIZE / 2;
    const int RACKET_MARGIN = 3;
    const int RACKET_LEFT_Y_START = Y_SIZE / 2 - 1;
    const int RACKET_RIGHT_Y_START = Y_SIZE / 2 - 1;
    const int SPEED_X_START = 1;
    const int SPEED_Y_START = 1;
    const int MAX_SCORE = 21;
    int ball_x = BALL_X_START;
    int ball_y = BALL_Y_START;
    int speed_x = -SPEED_X_START;
    int speed_y = SPEED_Y_START;
    int racket_left_y = RACKET_LEFT_Y_START;
    int racket_right_y = RACKET_RIGHT_Y_START;
    int score_left = 0;
    int score_right = 0;

    print_welcome();

    while (score_left < MAX_SCORE && score_right < MAX_SCORE) {
        print_score(score_left, score_right);
        print_field(ball_x, ball_y, racket_left_y, racket_right_y);

        char chr = get_valid_input();
        int player_number = get_player_by_char(chr);
        int direction = get_direction_by_char(chr);

        if (player_number == 0) {
            racket_left_y = move_racket(racket_left_y, racket_right_y, direction, player_number);
        } else if (player_number == 1) {
            racket_right_y = move_racket(racket_left_y, racket_right_y, direction, player_number);
        }

        int temp_ball_x = move_ball_x(ball_x, ball_y, speed_x, racket_left_y, racket_right_y, speed_y);
        if (speed_x > 0 && temp_ball_x <= ball_x) {
            speed_x = -speed_x;
        } else if (speed_x < 0 && temp_ball_x >= ball_x) {
            speed_x = -speed_x;
        }
        ball_x = temp_ball_x;

        int temp_ball_y = move_ball_y(ball_y, speed_y);
        if (speed_y > 0 && temp_ball_y <= ball_y) {
            speed_y = -speed_y;
        } else if (speed_y < 0 && temp_ball_y >= ball_y) {
            speed_y = -speed_y;
        }
        ball_y = temp_ball_y;

        if (ball_x < RACKET_MARGIN - 1 || ball_x > X_SIZE - RACKET_MARGIN + 1) {
            if (ball_x < RACKET_MARGIN) {
                score_right++;
            } else {
                score_left++;
            }
            ball_x = BALL_X_START;
            ball_y = BALL_Y_START;
            racket_left_y = RACKET_LEFT_Y_START;
            racket_right_y = RACKET_RIGHT_Y_START;
            speed_x = -speed_x;
            speed_y = -speed_y;
        }
    }

    print_score(score_left, score_right);
    who_win(score_left >= MAX_SCORE ? 0 : 1);

    return 0;
}