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