/* Tetris I/O function definitions for Win32 by Ben Hoyt, April 2008 */ #include #include "tio.h" #define WAITKEY_MS 50 /* handles for screen and keyboard I/O */ static HANDLE screen; static HANDLE keyboard; /* colour definitions */ static WORD colours[9] = { 0, /* black */ BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE, /* cyan */ BACKGROUND_INTENSITY | BACKGROUND_BLUE, /* blue */ BACKGROUND_RED | BACKGROUND_GREEN, /* "brown" */ BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN, /* yellow */ BACKGROUND_INTENSITY | BACKGROUND_GREEN, /* green */ BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE, /* purple */ BACKGROUND_INTENSITY | BACKGROUND_RED, /* red */ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE /* grey (border) */ }; /* put a square using two spaces with a fancy background colour */ void putsquare(int x, int y, int colour) { COORD coord; DWORD n; coord.X = x*2; coord.Y = y; SetConsoleCursorPosition(screen, coord); SetConsoleTextAttribute(screen, colours[colour]); WriteConsole(screen, " ", 2, &n, NULL); } /* set up: init handles, clear screen */ void setup(void) { COORD home = {0, 0}; DWORD size, n; CONSOLE_SCREEN_BUFFER_INFO csbi; screen = GetStdHandle(STD_OUTPUT_HANDLE); keyboard = GetStdHandle(STD_INPUT_HANDLE); GetConsoleScreenBufferInfo(screen, &csbi); size = csbi.dwSize.X * csbi.dwSize.Y; FillConsoleOutputCharacter(screen, ' ', size, home, &n); FillConsoleOutputAttribute(screen, colours[0], size, home, &n); } /* tidy up: return colours to normal, go to sensible cursor position */ void teardown(void) { WORD normal = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; COORD home = {0, 22}; SetConsoleTextAttribute(screen, normal); SetConsoleCursorPosition(screen, home); } /* wait up to 50 ms for a key, return its character value or -1 on timeout */ int waitkey(void) { DWORD n, tick0; INPUT_RECORD input; tick0 = GetTickCount(); do { GetNumberOfConsoleInputEvents(keyboard, &n); if (n) { ReadConsoleInput(keyboard, &input, 1, &n); if (input.EventType != KEY_EVENT || !input.Event.KeyEvent.bKeyDown) continue; return (int)input.Event.KeyEvent.uChar.AsciiChar; } Sleep(10); } while (GetTickCount() - tick0 < WAITKEY_MS); return -1; }