#include #include #include "game.h" #include "player.h" static void draw_paddles(struct game *g); static void wait(struct game *g); static void input(struct game *g); static void draw(struct game *g); struct game * new_game(void) { struct game *g; g = malloc(sizeof(*g)); if (g == NULL) { return NULL; } g->players[0] = new_player(); g->players[1] = new_player(); 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) { wait(g); input(g); draw(g); } } static void wait(struct game *g) { g->running = 1; } static void input(struct game *g) { int c; struct paddle *pad; int dir; timeout(0); for (;;) { c = getch(); if (c == 'q') { g->running = 0; } else if (c == ERR) { break; } else if (c == KEY_LEFT) { pad = &g->players[0]->paddle_h; dir = -1; if (pad->pos > pad->size / 2 + 3) { pad->pos += pad->speed * dir; } } else if (c == KEY_RIGHT) { pad = &g->players[0]->paddle_h; dir = 1; if (pad->pos < 77 - pad->size / 2) { pad->pos += pad->speed * dir; } } else if (c == KEY_UP) { pad = &g->players[0]->paddle_v; dir = -1; if (pad->pos > pad->size / 2 + 2) { pad->pos += pad->speed * dir; } } else if (c == KEY_DOWN) { pad = &g->players[0]->paddle_v; dir = 1; if (pad->pos < 23 - pad->size / 2) { pad->pos += pad->speed * dir; } } } } static void draw(struct game *g) { draw_paddles(g); } static void draw_paddles(struct game *g) { int off; int pos; /* Player 1 horizontal paddle */ for (pos = 0; pos < 79; ++pos) { mvprintw(23, pos, " "); } off = g->players[0]->paddle_h.pos; off -= g->players[0]->paddle_h.size / 2; for (pos = 0; pos < g->players[0]->paddle_h.size; ++pos) { attr_on(WA_REVERSE, NULL); mvprintw(23, off + pos, " "); attr_off(WA_REVERSE, NULL); } /* Player 1 vertical paddle */ for (pos = 0; pos < 24; ++pos) { mvprintw(pos, 2, " "); } off = g->players[0]->paddle_v.pos; off -= g->players[0]->paddle_v.size / 2; for (pos = 0; pos < g->players[0]->paddle_v.size; ++pos) { attr_on(WA_REVERSE, NULL); mvprintw(off + pos, 2, " "); attr_off(WA_REVERSE, NULL); } /* Player 2 horizontal paddle */ for (pos = 0; pos < 79; ++pos) { mvprintw(1, pos, " "); } off = g->players[1]->paddle_h.pos; off -= g->players[1]->paddle_h.size / 2; for (pos = 0; pos < g->players[1]->paddle_h.size; ++pos) { attr_on(WA_REVERSE, NULL); mvprintw(1, off + pos, " "); attr_off(WA_REVERSE, NULL); } /* Player 2 vertical paddle */ for (pos = 0; pos < 24; ++pos) { mvprintw(pos, 77, " "); } off = g->players[1]->paddle_v.pos; off -= g->players[1]->paddle_v.size / 2; for (pos = 0; pos < g->players[1]->paddle_v.size; ++pos) { attr_on(WA_REVERSE, NULL); mvprintw(off + pos, 77, " "); attr_off(WA_REVERSE, NULL); } }