int tgets(char *buf) { int c; int i; char *lp = buf; for (i = 240000; i > 0; i--) { c = tgetchar() & 0177; if (c) { for (;;) { switch (c) { case '\n': case '\r': *lp = '\0'; putchar('\n'); return (1); case '\b': case '\177': if (lp > buf) { lp--; putchar('\b'); putchar(' '); putchar('\b'); } break; case '#': if (lp > buf) --lp; break; case 'r' & 037: { char *p; putchar('\n'); for (p = buf; p < lp; ++p) putchar(*p); } break; case '@': case 'u' & 037: case 'w' & 037: lp = buf; putchar('\n'); break; default: *lp++ = c; putchar(c); } c = getchar() & 0177; } } } return (0); }
int main(int argc, char **argv) { int c; int x=0; genshapes(); init(); splash(); for(;;) { starfield(); moveto(1,24); flush(); gametick(); gametick(); c = tgetchar(); switch(c) { case 'n': game(); splash(); flushstdin(); break; case 's': if (sspeed != maxspeed) sspeed++; printsspeed(); break; case 'S': if (sspeed != minspeed) sspeed--; printsspeed(); break; case 'h': splash(); break; case 'q': goto out; default: break; } } out: resetfgbg(); normal(); moveto(1,li); restoreterm(); return 0; }
static void game(void) { char c; int counter = sspeed, rs, a, blocks = 0, paused = 0; gamescreen(); clearboard(); nexts = rnd()%28; nextc = rnd()%7 + 1; newshape(); score = view = 0; if (view) drawview(nexts, nextc); level = 1; speed = sspeed; printscore(); printlevel(); for(;;) { if (paused) { gametick(); c = tgetchar(); switch(c) { case 'q': goto stopgame; case 'p': paused = 0; moveto(68,5); setbg(black); printf(" "); normal(); flush(); default: break; } continue; } if (counter <= 0) { counter = 14 - speed; if (shapefits(current.s, current.x, current.y+1)) { drawshape(current.s, 0, 40-WIDTH-8+current.x*2, current.y-3); current.y++; drawshape(current.s, current.color, 40-WIDTH-8+current.x*2, current.y-3); } else { markboard(current.s, current.color, current.x, current.y); checkboard(current.y); incrscore(1); newshape(); if (!shapefits(current.s, current.x, current.y)) goto stopgame; blocks++; if (blocks == blocksperlevel) { blocks = 0; incrlevel(1); } if (view) drawview(nexts, nextc); } } counter--; moveto(1,24); flush(); gametick(); c = tgetchar(); switch(c) { case 'q': goto stopgame; case 'j': if (shapefits(current.s, current.x-1, current.y)) { drawshape(current.s, 0, 40-WIDTH-8+current.x*2, current.y-3); current.x--; drawshape(current.s, current.color, 40-WIDTH-8+current.x*2, current.y-3); } break; case 'l': if (shapefits(current.s, current.x+1, current.y)) { drawshape(current.s, 0, 40-WIDTH-8+current.x*2, current.y-3); current.x++; drawshape(current.s, current.color, 40-WIDTH-8+current.x*2, current.y-3); } break; case 'k': rs = (current.s & ~0x03) | ((current.s + 1) & 0x03); if (shapefits(rs, current.x, current.y)) { drawshape(current.s, 0, 40-WIDTH-8+current.x*2, current.y-3); current.s = rs; drawshape(current.s, current.color, 40-WIDTH-8+current.x*2, current.y-3); } break; case ' ': for (a=1; ; a++) { if (!shapefits(current.s, current.x, current.y+a)) break; } if (shapefits(current.s, current.x, current.y+a-1)) { drawshape(current.s, 0, 40-WIDTH-8+current.x*2, current.y-3); current.y += a-1; drawshape(current.s, current.color, 40-WIDTH-8+current.x*2, current.y-3); } incrscore(view ? (a-1) * 3 / 4 : a-1); break; case 'n': view ^= 1; if (view) drawview(nexts, nextc); else clearview(); break; case 'p': paused = 1; moveto(68,5); setfg(white); setbg(blue); printf(" PAUSED!!! "); moveto(1,24); flush(); default: break; } } stopgame: setbg(white); rect(20,8,60,12); setbg(red); frect(21,9,59,11); setfg(white); bold(); moveto(30,10); printf(" G A M E O V E R "); moveto(1,24); flush(); for(;;) { c = tgetchar(); if (c > 0) return; } }
static void flushstdin(void) { while (tgetchar() > 0) { } }
int tgets(char *buf) { int c, i; char *p, *lp = buf; time_t seconds1, seconds2; seconds1 = getsecs(); for (i = 10; i > 0; ) { c = tgetchar() & 0177; if (c) { for (;;) { switch (c) { case '\n': case '\r': *lp = '\0'; putchar('\n'); return (1); case '\b': case '\177': if (lp > buf) { lp--; putchar('\b'); putchar(' '); putchar('\b'); } break; case '#': if (lp > buf) --lp; break; case 'r'&037: putchar('\n'); for (p = buf; p < lp; ++p) putchar(*p); break; case '@': case 'u'&037: case 'w'&037: lp = buf; putchar('\n'); break; default: *lp++ = c; putchar(c); } c = getchar() & 0177; } } if ((seconds2 = getsecs()) != seconds1) { seconds1 = seconds2; i--; } } return (0); }