#include #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 update(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) { input(g); update(g); draw(g); wait(g); } } static void wait(struct game *g) { g->running = 1; usleep(10000); } static void input(struct game *g) { int c; timeout(0); for (;;) { c = getch(); if (c == 'q') { g->running = 0; } else if (c == ERR) { break; } else if (c == KEY_LEFT) { g->players[0]->paddle_h.dir = -1; } else if (c == KEY_RIGHT) { g->players[0]->paddle_h.dir = 1; } else if (c == KEY_UP) { g->players[0]->paddle_v.dir = -1; } else if (c == KEY_DOWN) { g->players[0]->paddle_v.dir = 1; } } } static void update(struct game *g) { struct paddle *pad; /* Player 1 horizontal paddle */ pad = &g->players[0]->paddle_h; pad->pos += pad->speed * pad->dir; if (pad->pos < pad->size / 2 + 2) pad->pos = pad->size / 2 + 2; if (pad->pos > 78 - pad->size / 2) pad->pos = 78 - pad->size / 2; /* Player 1 vertical paddle */ pad = &g->players[0]->paddle_v; pad->pos += pad->speed * pad->dir; if (pad->pos < pad->size / 2 + 2) pad->pos = pad->size / 2 + 2; if (pad->pos > 23 - pad->size / 2) pad->pos = 23 - pad->size / 2; /* Player 2 horizontal paddle */ pad = &g->players[1]->paddle_h; pad->pos += pad->speed * pad->dir; if (pad->pos < pad->size / 2 + 2) pad->pos = pad->size / 2 + 2; if (pad->pos > 78 - pad->size / 2) pad->pos = 78 - pad->size / 2; /* Player 2 vertical paddle */ pad = &g->players[1]->paddle_v; pad->pos += pad->speed * pad->dir; if (pad->pos < pad->size / 2 + 2) pad->pos = pad->size / 2 + 2; if (pad->pos > 23 - pad->size / 2) pad->pos = 23 - pad->size / 2; } 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); } }