Загрузка данных
#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;
}