#include <stdio.h>
void draw(int ball_x, int ball_y, int r1_y, int r2_y, int score1, int score2);
int move_r1(int y, char key);
int move_r2(int y, char key);
int get_next_dy(int ball_y, int ball_dy);
int get_next_dx(int ball_x, int ball_y, int ball_dx, int ball_dy, int r1_y, int r2_y);
int main(void) {
int r1_y = 12, r2_y = 12, ball_x = 39, ball_y = 12;
int ball_dx = -1, ball_dy = -1, score1 = 0, score2 = 0, game_over = 0;
char key = ' ';
draw(ball_x, ball_y, r1_y, r2_y, score1, score2);
while (score1 < 21 && score2 < 21 && game_over == 0) {
do {
if (scanf("%c", &key) != 1) {
key = 'q';
}
} while (key == '\n');
if (key == 'q' || key == 'Q') {
game_over = 1;
} else {
r1_y = move_r1(r1_y, key);
r2_y = move_r2(r2_y, key);
ball_dx = get_next_dx(ball_x, ball_y, ball_dx, ball_dy, r1_y, r2_y);
ball_dy = get_next_dy(ball_y, ball_dy);
ball_x += ball_dx;
ball_y += ball_dy;
if (ball_x <= 0 || ball_x >= 79) {
if (ball_x <= 0) {
score2++;
ball_dx = 1;
} else {
score1++;
ball_dx = -1;
}
ball_x = 39;
ball_y = 12;
}
draw(ball_x, ball_y, r1_y, r2_y, score1, score2);
}
}
if (score1 == 21) {
printf("Player 1 WINS!\n");
} else if (score2 == 21) {
printf("Player 2 WINS!\n");
}
return 0;
}
void draw(int ball_x, int ball_y, int r1_y, int r2_y, int score1, int score2) {
printf("\033[H\033[J");
printf("Score: Player 1 = %d | Player 2 = %d\n", score1, score2);
for (int y = 0; y < 25; y++) {
for (int x = 0; x < 80; x++) {
if (y == 0 || y == 24) {
printf("-");
} else if (x == ball_x && y == ball_y) {
printf("O");
} else if (x == 2 && y >= r1_y - 1 && y <= r1_y + 1) {
printf("|");
} else if (x == 77 && y >= r2_y - 1 && y <= r2_y + 1) {
printf("|");
} else if (x == 39) {
printf("|");
} else {
printf(" ");
}
}
printf("\n");
}
}
int move_r1(int y, char key) {
int new_y = y;
if ((key == 'a' || key == 'A') && y > 2) {
new_y = y - 1;
} else if ((key == 'z' || key == 'Z') && y < 22) {
new_y = y + 1;
}
return new_y;
}
int move_r2(int y, char key) {
int new_y = y;
if ((key == 'k' || key == 'K') && y > 2) {
new_y = y - 1;
} else if ((key == 'm' || key == 'M') && y < 22) {
new_y = y + 1;
}
return new_y;
}
int get_next_dy(int ball_y, int ball_dy) {
int new_dy = ball_dy;
int next_y = ball_y + ball_dy;
if (next_y <= 0 || next_y >= 24) {
new_dy = -ball_dy;
}
return new_dy;
}
int get_next_dx(int ball_x, int ball_y, int ball_dx, int ball_dy, int r1_y, int r2_y) {
int new_dx = ball_dx;
int next_x = ball_x + ball_dx;
int next_y = ball_y + ball_dy;
if (next_y <= 0 || next_y >= 24) {
next_y = ball_y - ball_dy;
}
if (ball_dx < 0 && next_x == 2 && next_y >= r1_y - 1 && next_y <= r1_y + 1) {
new_dx = -ball_dx;
} else if (ball_dx > 0 && next_x == 77 && next_y >= r2_y - 1 && next_y <= r2_y + 1) {
new_dx = -ball_dx;
}
return new_dx;
}