#include #include #include #include #include struct screen { unsigned char grid[25][40]; }; enum direction { UP, DOWN, LEFT, RIGHT, }; struct player { char x; char y; enum direction dir; unsigned char joy; unsigned char prev_joy; unsigned char next_char; }; #define SCREEN (*(struct screen*) 0x0400) #define SCREEN_AT(x, y) (SCREEN.grid[y][x]) #define MAX_PLAYERS 2 #define EMPTY '\x20' #define PLAYER '\x71' #define CHR_V '\x42'+128 #define CHR_H '\x43'+128 #define CHR_DR '\xed'+128 #define CHR_RD '\xee'+128 #define CHR_UR '\xf0'+128 #define CHR_RU '\xfd'+128 static void update_player(struct player *p) { /* has direction been changed? */ if (p->joy == p->prev_joy) { if (p->dir == DOWN || p->dir == UP) { p->next_char = CHR_V; } else if (p->dir == LEFT || p->dir == RIGHT) { p->next_char = CHR_H; } return; } if (JOY_UP(p->joy) && p->dir != DOWN) { switch (p->dir) { case RIGHT: p->next_char = CHR_RU; break; case LEFT: p->next_char = CHR_DR; break; } p->dir = UP; } else if (JOY_DOWN(p->joy) && p->dir != UP) { switch (p->dir) { case RIGHT: p->next_char = CHR_RD; break; case LEFT: p->next_char = CHR_UR; break; } p->dir = DOWN; } else if (JOY_LEFT(p->joy) && p->dir != RIGHT) { switch (p->dir) { case UP: p->next_char = CHR_RD; break; case DOWN: p->next_char = CHR_RU; break; } p->dir = LEFT; } else if (JOY_RIGHT(p->joy) && p->dir != LEFT) { switch (p->dir) { case UP: p->next_char = CHR_UR; break; case DOWN: p->next_char = CHR_DR; break; } p->dir = RIGHT; } p->prev_joy = p->joy; } static char move_player(struct player *p) { int res = 1; SCREEN_AT(p->x, p->y) = p->next_char; switch (p->dir) { case UP: p->y--; break; case DOWN: p->y++; break; case LEFT: p->x--; break; case RIGHT: p->x++; break; } if (SCREEN_AT(p->x, p->y) != EMPTY || p->x < 0 || p->x >= 40 || p->y < 0 || p->y >= 25) { res = 0; } SCREEN_AT(p->x, p->y) = PLAYER; return res; } static void play_game(char n_players) { uint16_t busy_wait = 300; struct player players[MAX_PLAYERS] = { { 5, 12, RIGHT, 0, 0, CHR_H }, { 35, 12, LEFT, 0, 0, CHR_H }, }; clrscr(); while(1) { char i; uint16_t n; for (i=0; i