#include #include #include #include "game.h" #include "player.h" #include "paddle.h" static void wait_game(struct game *g); static void input_game(struct game *g); static void clear_game(struct game *g); static void update_game(struct game *g); static void draw_game(struct game *g); struct game * new_game(char balls) { struct game *g; g = malloc(sizeof(*g)); if (g == NULL) { return NULL; } g->players[0] = new_player(0); g->players[1] = new_player(1); g->min_balls = balls; g->cur_balls = 0; return g; } void free_game(struct game *g) { free_player(g->players[0]); free_player(g->players[1]); free(g); } void run_game(struct game *g) { g->running = 1; while (g->running) { input_game(g); clear_game(g); update_game(g); draw_game(g); wait_game(g); } } static void wait_game(struct game *g) { ++g; usleep(1000000 / 30); } static void input_game(struct game *g) { int c; timeout(0); for (;;) { c = getch(); if (c == 'q') { g->running = 0; } else if (c == ERR) { break; } else if (c == 'a') { g->players[0]->paddle_h.dir = -1; } else if (c == 'd') { g->players[0]->paddle_h.dir = 1; } else if (c == 'w') { g->players[0]->paddle_v.dir = -1; } else if (c == 's') { g->players[0]->paddle_v.dir = 1; } else if (c == KEY_LEFT) { g->players[1]->paddle_h.dir = -1; } else if (c == KEY_RIGHT) { g->players[1]->paddle_h.dir = 1; } else if (c == KEY_UP) { g->players[1]->paddle_v.dir = -1; } else if (c == KEY_DOWN) { g->players[1]->paddle_v.dir = 1; } } } static void clear_game(struct game *g) { struct ball *b; clear_paddle(&g->players[0]->paddle_h); clear_paddle(&g->players[0]->paddle_v); clear_paddle(&g->players[1]->paddle_h); clear_paddle(&g->players[1]->paddle_v); for (b = g->balls_head; b != NULL; b = b->next) { clear_ball(b); } } static void update_game(struct game *g) { struct ball *b; update_paddle(&g->players[0]->paddle_h); update_paddle(&g->players[0]->paddle_v); update_paddle(&g->players[1]->paddle_h); update_paddle(&g->players[1]->paddle_v); for (b = g->balls_head; b != NULL; b = b->next) { update_ball(b); } while (g->cur_balls < g->min_balls) { b = new_ball(BALL_START_X_NORMAL, BALL_START_Y_NORMAL, 1, 0.f); b->next = g->balls_head; g->balls_head = b; ++g->cur_balls; } } static void draw_game(struct game *g) { struct ball *b; draw_paddle(&g->players[0]->paddle_h); draw_paddle(&g->players[0]->paddle_v); draw_paddle(&g->players[1]->paddle_h); draw_paddle(&g->players[1]->paddle_v); for (b = g->balls_head; b != NULL; b = b->next) { draw_ball(b); } }