# # tet.in - # NULL = 0; EOF = -1; FALSE = 0; TRUE = 1; SIZEOF_INT = 4; RAND_MAX = 0x7fffffff; # XC nealy has a BUG # # # _cgstr = "¡¡¢¢ÌÚÀî´ä»³Á𳤿¹¢¨"; _cgstr = "¡¡¢¢ÅìÆîÀ¾ËÌÇòÈ¯ÃæÎ®"; _cgstr = "¡¡÷á÷â÷ã÷ä÷å÷æ÷ç÷è÷é"; func wch(ch) { int idx; idx = ch * 2; putchar(_cgstr@[idx]); putchar(_cgstr@[idx + 1]); } func move(y, x) { printf("\033[%d;%dH", y + 1, x * 2 + 1); } func mvwch(y, x, ch) { int idx; idx = ch * 2; printf("\033[%d;%dH%c%c", y + 1, x * 2 + 1, _cgstr@[idx], _cgstr@[idx + 1]); } func mvwstr(y, x, str) { move(y, x); fputs(str, STDOUT()); } func move2(y, x) { printf("\033[%d;%dH", y + 1, x + 1); } func wstr(str) { fputs(str, STDOUT()); } func cursor(sw) { if (sw) printf("\033[>5l"); else printf("\033[>5h"); } func clear() { printf("\033[2J"); } # # È¢¤ÎÉý¤È¹â¤µ # WIDTH = 12; HEIGHT = 22; SPACE = 0; WALL = 1; _high_score = 0; _level = 0; _score = 0; _lines = 0; # ¾Ã¤·¤¿¥é¥¤¥ó¿ô _sigma = 0; # Íî¤Á¤Æ¤­¤¿Áí¿ô _stats = dim(7); # Íî¤Á¤Æ¤­¤¿Áí¿ô¡Ê¼ïÎऴ¤È¡Ë # # ɽ¼¨ # _outbuf = malloc(256); func print_high(s) { sprintf(_outbuf, " High Score=%5d", s); mvwstr(HEIGHT + 3, 0, _outbuf); } func print_level(s) { sprintf(_outbuf, "level=%5d", s); mvwstr(HEIGHT + 0, 0, _outbuf); } func print_lines(s) { sprintf(_outbuf, "lines=%5d", s); mvwstr(HEIGHT + 0, 6, _outbuf); } func print_score(s) { sprintf(_outbuf, "score=%5d", s); mvwstr(HEIGHT + 1, 0, _outbuf); } func print_sigma(s) { sprintf(_outbuf, "sigma=%5d", s); mvwstr(HEIGHT + 1, 6, _outbuf); } func print_stats(pno, s) { sprintf(_outbuf, "%2d", s); move2(HEIGHT + 2, pno * 3); wstr(_outbuf); } # # È¢ int _box[HEIGHT][WIDTH]; # º¸±¦¤ÈÄì¤ËÊɤ¬¤¢¤ë¡£¶õ´Ö¤Ï _box[0][1] ¤«¤é _box[HEIGHT-2][WIDTH-2] ¤Þ¤Ç # _box = dim(HEIGHT * WIDTH); # # È¢¤òɽ¼¨¤¹¤ë # func box_draw() { int y, x, s; int mv; # int *mv; mv = _box; for (y = 0; y < HEIGHT; y++) { move(y, 0); for (x = 0; x < WIDTH; x++) { wch(mv[0]); mv += SIZEOF_INT; } } }# box_draw # # Êɤâ´Þ¤á£±¹Ôɽ¼¨¤¹¤ë # func box_draw_whole_line(y) { int x; int mv; mv = _box + (y * WIDTH) * SIZEOF_INT; move(y, 0); for (x = 0; x < WIDTH; x++) { wch(mv[x]); } }# box_draw_whole_line # # Êɤò´Þ¤Þ¤º£±¹Ôɽ¼¨¤¹¤ë # func box_draw_line(y) { int x; int mv; mv = _box + (y * WIDTH) * SIZEOF_INT; move(y, 1); for (x = 1; x < WIDTH - 1; x++) { wch(mv[x]); } } # # £±¹ÔʬÇò¹õȿž¤¹¤ë # func box_draw_invert_line(y) { printf("\033[7m"); box_draw_line(y); printf("\033[0m"); }# box_draw_invert_line # # È¢¤ÎÃæ£±¹Ô¥¯¥ê¥¢¡Êɽ¼¨¤¹¤ë¡Ë # func box_draw_clear_line(y) { int x; move(y, 1); for (x = 1; x < WIDTH - 1; x++) { wch(0); } }# box_draw_clear_line # # È¢¤ÎÃæ¿È¤ò¥¹¥¯¥í¡¼¥ë¡Êɽ¼¨¤¹¤ë¡Ë # ¥¹¥¯¥í¡¼¥ë¤Î¥ì¥¯¥¿¥ó¥°¥ë¤Ï¡¢±£¤ì¤Æ¤¤¤ë¤È¤³¤í¤Ï»ØÄꤷ¤Ê¤¤¤è¤¦¤Ë¡£ # func box_draw_scroll(y) { if (y >= 2) { int i; for (i = 0; i < y + 1; i++) { box_draw_line(i); } } }# box_draw_scroll # # Êɤòºî¤ë¡Êɽ¼¨Ìµ¤·¡Ë # func box_make_wall() { int i; for (i = 0; i < HEIGHT; i++) { _box[i * WIDTH] = WALL; _box[i * WIDTH + WIDTH - 1] = WALL; } for (i = 0; i < WIDTH; i++) { _box[(HEIGHT - 1) * WIDTH + i] = WALL; } }# box_make_wall # # È¢¤ò¶õ¤Ã¤Ý¤Ë¤¹¤ë¡Êɽ¼¨Ìµ¤·¡Ë # func box_clear() { int i; memset(_box, SPACE, HEIGHT * WIDTH * SIZEOF_INT); box_make_wall(); }# box_clear # # È¢¤ÎÃæ£±¹Ô¥¯¥ê¥¢¡Êɽ¼¨Ìµ¤·¡Ë # func box_clear_line(y) { memset(_box + (y * WIDTH + 1) * SIZEOF_INT, SPACE, (WIDTH - 2) * SIZEOF_INT); }# box_clear_line # # È¢¤ÎÃæ¿È¤ò¥¹¥¯¥í¡¼¥ë¡Êɽ¼¨Ìµ¤·¡Ë # func box_scroll(y) { int dst, src; int size; dst = _box + WIDTH * SIZEOF_INT; src = _box; size = y * WIDTH * SIZEOF_INT; memmove(dst, src, size); }# box_scroll # # ¥Æ¥È¥í¥ß¥Î # # pno = 0 1 2 3 4 5 6 # ¢¢¢¢¢¢ ¢¢¢¢¢¢ ¢¢¢¢ ¢¢¢¢¢¢¢¢ ¢¢¢¢ ¢¢¢¢ ¢¢¢¢¢¢ # ¢¢ ¢¢ ¢¢¢¢ ¢¢¢¢ ¢¢¢¢ ¢¢ # # dir = 0 1 2 3 # ¢¢ ¢¢ ¢¢¢¢ # ¢¢¢¢¢¢ ¢¢ ¢¢¢¢¢¢ ¢¢ # ¢¢ ¢¢¢¢ ¢¢ _pats = dim(7 * 4 * 3 * 2); # int _pats[7][4][3][2]; __p = "653556545765457554565345457556565365653554545745455465455465455465455465457565545756457565545756456465564454456465564454654445566454654445566454457546565366653564545744"; # # ʸ»úÎó __p ¤«¤é _pats ¤ò·×»»¤¹¤ë¡£ # _pats[pno][dir] ¤¬¡¢¥Æ¥È¥í¥ß¥ÎÈÖ¹æ¤È¸þ¤­¤òɽ¤·¡¢ # _pats[][][0..2][0] ¤È _pats[][][0..2][1] ¤¬ x Áýʬ¤È y Áýʬ¤òɽ¤¹¡£ # _pats ¤Ï __p ¤«¤éľÀܵá¤á¤ë¤³¤È¤¬¤Ç¤­¡¢ASCII¥³¡¼¥É¤«¤é '5' ¤ò°ú¤±¤Ð¤è¤¤¡£ # func pats_make() { int pno, dir, dv; int dst; # int *dst; int src; # char *src; dst = _pats; # &_pats[0][0][0][0] src = __p; for (pno = 0; pno < 7; pno++) { int pat; pat = dst; for (dir = 0; dir < 4; dir++) { for (dv = 0; dv < 3; dv++) { dst[0] = src@[0] - '5'; # delta x dst[1] = src@[1] - '5'; # delta y dst += 2 * SIZEOF_INT; src += 2; } } } }# pats_make # # ÁýʬÄÉÀפ·¤Ê¤¬¤é¥Æ¥È¥í¥ß¥Î¤ò½ñ¤¯ # func pats_trace(pno, dir, px, py, c) { int pat; pat = _pats + (pno * 24 + dir * 6) * SIZEOF_INT; # &pats[pno][dir] mvwch(py, px, c); mvwch(py += pat[1], px += pat[0], c); mvwch(py += pat[3], px += pat[2], c); mvwch(py += pat[5], px += pat[4], c); } # # ¥Æ¥È¥í¥ß¥Î¤Îɽ¼¨ # func pat_draw(pno, dir, cx, cy) { v = pno * 4 + dir; pats_trace(pno, dir, cx, cy, pno + 2); }# pat_draw # # ¥Æ¥È¥í¥ß¥Î¤Î¾Ãµî # func pat_erase(pno, dir, cx, cy) { pats_trace(pno, dir, cx, cy, 0); }# pat_erase # # ¥Æ¥È¥í¥ß¥Î¤Îº¸±¦°Üưɽ¼¨ # func pat_move_level(pno, dir, px, py, dx) { pat_erase(pno, dir, px, py); pat_draw(pno, dir, px + dx, py); }# pat_move_level # # ¥Æ¥È¥í¥ß¥Î¤Î²¼°Üưɽ¼¨ # func pat_move_down(pno, dir, px, py) { pat_erase(pno, dir, px, py); pat_draw(pno, dir, px, py + 1); }# pat_move_down # # ¥Æ¥È¥í¥ß¥Î¤Î²óžɽ¼¨ # func pat_round(pno, dir, px, py) { int ndir; ndir = (dir + 1) & 3; pat_erase(pno, dir, px, py); pat_draw(pno, ndir, px, py); }# pat_round # # È¢¤Ë¥Æ¥È¥í¥ß¥Î¤òÃÖ¤¯¡£É½¼¨Ìµ¤· # func pat_put(pno, dir, cx, cy) { int pat, c; c = pno + 2; pat = _pats + (pno * 24 + dir * 6) * SIZEOF_INT; # &pats[pno][dir] _box[cy * WIDTH + cx] = c; _box[(cy += pat[1]) * WIDTH + (cx += pat[0])] = c; _box[(cy += pat[3]) * WIDTH + (cx += pat[2])] = c; _box[(cy += pat[5]) * WIDTH + (cx += pat[4])] = c; }# pat_put # # È¢¤Ë¥Æ¥È¥í¥ß¥Î¤òÃÖ¤±¤ë¤Ê¤é¤Ð non 0 ¤òÊÖ¤¹¡£ # func pat_putable(pno, dir, cx, cy) { int pat; pat = _pats + (pno * 24 + dir * 6) * SIZEOF_INT; # &pats[pno][dir] return _box[cy * WIDTH + cx] == SPACE && _box[(cy += pat[1]) * WIDTH + (cx += pat[0])] == SPACE && _box[(cy += pat[3]) * WIDTH + (cx += pat[2])] == SPACE && _box[(cy += pat[5]) * WIDTH + (cx += pat[4])] == SPACE; }# pat_putable # # ²èÌ̤òºÆÉ½¼¨ # func refresh() { int pno; box_draw(); print_high(_high_score); print_level(_level); print_lines(_lines); print_score(_score); print_sigma(_sigma); for (pno = 0; pno < 7; pno++) print_stats(pno, _stats[pno]); } # # ¥ì¥Ù¥ë == lvl ¤Î»þ¤ÎÉ⤤¤Æ¤¤¤ë»þ´Ö # func hovering_time_of(lvl) { return (10 - lvl) * 80; } # # ¥ì¥Ù¥ë == lvl ¤Î»þ¤Ë¡¢¹â¤µ y ¤«¤éÍî¤Á¤¿»þ¤Î¥¹¥³¥¢ # func score_of(lvl, y) { return lvl * 2 + 25 - y; } # # °ÌÃÖ¤¬³ÎÄꤹ¤ë¤Þ¤Ç¤Î½èÍý # func until_down(pno, dir, px, py) { int more, touch, limit, t0, t1; touch = 0; more = TRUE; t0 = milliclock(); limit = t0 + hovering_time_of(_level); while (more) { do { if ((key = INPOUT(0xff)) == EOF) return -1; t1 = milliclock(); } while (t1 < limit && key == 0 && strchr("\003\014\033 24568", key) != NULL); if (key == '4' || key == '6') {# º¸±¦°Üư int dx; dx = (key == '4') ? -1 : 1; if (pat_putable(pno, dir, px + dx, py)) { pat_move_level(pno, dir, px, py, dx); px += dx; } } else if (key == '5') {# ²óž int ndir; ndir = (dir + 1) & 3; if (pat_putable(pno, ndir, px, py)) { pat_round(pno, dir, px, py); dir = ndir; } } else if (key == '8') {# ¼¡¥ì¥Ù¥ë if (_level < 9) { _level++; limit = t0 + hovering_time_of(_level); print_level(_level); } } else if (key == ' ' || key == '2') {# Íî²¼ int ny; ny = py; more = FALSE; _score += score_of(_level, py); while (pat_putable(pno, dir, px, ny + 1)) { ny++; } pat_erase(pno, dir, px, py); pat_draw(pno, dir, px, ny); py = ny; } else if (key == 003) {# ¶¯À©½ªÎ» return -1; } else if (key == 014) {# ºÆÉ½¼¨ refresh(); } else if (key == 033) {# ¥Ý¡¼¥º while ((key = INPOUT(0xff)) != EOF && key != 033) ; } if (more && t1 >= limit) {# ¼«Æ°Íî²¼ int ny; ny = py + 1; if (pat_putable(pno, dir, px, ny)) { pat_move_down(pno, dir, px, py); py = ny; t0 = milliclock(); limit = t0 + hovering_time_of(_level); touch = 0; # °ìÃÊÍî¤Á¤¿¤é¤â¤¦°ìÅÙ¥Á¥ã¥ó¥¹¤¢¤ê¤è¡£ } else { if (touch++ == 0) {# ¾²¤Ë¿¨¤ì¤Æ¤â¥ï¥ó¥â¥¢¥Á¥ã¥ó¥¹ t0 = milliclock(); limit = t0 + hovering_time_of(5); } else {# ³ÎÄê more = FALSE; _score += score_of(_level, py); } } }# if (t1 >= limit) }# while pat_put(pno, dir, px, py); return 0; }# until_down # # È¢¤òÄ´¤Ù¡¢¾Ã¤¨¤ë¥é¥¤¥ó¤ò¿ô¤¨¤ë¡£ # Ìá¤êÃͤϥ饤¥ó¤ÎÁí¿ô¡¢int argv[] ¤Ë¥é¥¤¥óÈÖ¹æ¤ò¥»¥Ã¥È¤¹¤ë¡£ # func check_lines(argv) { int y, argc; int curline; argc = 0; for (y = 2; y < HEIGHT - 1; y++) { curline = _box + (y * WIDTH) * SIZEOF_INT; if (curline[1] && curline[2] && curline[3] && curline[4] && curline[5] && curline[6] && curline[7] && curline[8] && curline[9] && curline[10]) { argv[argc++] = y; } } return argc; }# check_lines # # ¾Ã¤¨¤ë¥é¥¤¥ó¤¬¤¢¤ë¤Ê¤é½èÍý¤¹¤ë¡£ # ¾Ã¤·¤¿¥é¥¤¥ó¿ô¤òÊÖ¤¹¡£ # func clear_lines() { int argc; int argv; argv = dim(HEIGHT); argc = check_lines(argv); if (argc > 0) { int i, t0; # ¾Ã¤¨¤ë¥é¥¤¥ó¤ò¥Ô¥«¥Ô¥«¤¹¤ë t0 = milliclock(); while (milliclock() - t0 < 500) { for (i = 0; i < argc; i++) box_draw_invert_line(argv[i]); for (i = 0; i < argc; i++) box_draw_line(argv[i]); }# while # ¾Ã¤¨¤ë¥é¥¤¥ó¤ò¾Ã¤¹ for (i = 0; i < argc; i++) { box_draw_clear_line(argv[i]); box_clear_line(argv[i]); } # ¥´¥ó¥´¥ó¤ÈÍî¤Á¤Æ¤¯¤ë for (i = argc - 1; i >= 0; i--) { int curline; curline = argv[i] + (argc - 1 - i); box_scroll(curline); box_draw_scroll(curline); } } free(argv); return argc; }# clear_lines # # ¾Ã¤·¤¿¥é¥¤¥ó¤È¥ì¥Ù¥ë¤Î´Ø·¸ # lines > 10 ¤Ê¤é¥ì¥Ù¥ë¤Ï 1 ¤À¡£ # _next_level = dim(10); sscanf("10 20 30 40 55 70 85 100 115 2147483647", "%d %d %d %d %d %d %d %d %d %d", _next_level, _next_level + 1 * SIZEOF_INT, _next_level + 2 * SIZEOF_INT, _next_level + 3 * SIZEOF_INT, _next_level + 4 * SIZEOF_INT, _next_level + 5 * SIZEOF_INT, _next_level + 6 * SIZEOF_INT, _next_level + 7 * SIZEOF_INT, _next_level + 8 * SIZEOF_INT, _next_level + 9 * SIZEOF_INT); # # # func over() { int y, x; for (y = 0; y < HEIGHT - 1; y++) { for (x = 1; x < WIDTH - 1; x++) { _box[y * WIDTH + x] = 7 + 2; } } refresh(); }# over # # £±²ó¤Î¥×¥ì¥¤ # func play() { int pno, npno, dir, px, py, quit, ex; dir = 0; px = 5; py = 1; _level = 0; _score = 0; _lines = 0; _sigma = 0; for (pno = 0; pno < 7; pno++) _stats[pno] = 0; npno = rand() / (RAND_MAX / 7 + 1) ; box_clear(); refresh(); ex = 0; quit = 0; while (!quit) { pno = npno; npno = rand() / (RAND_MAX / 7 + 1); print_sigma(++_sigma); _stats[pno]++; # infix ¤Î¥Ð¥°¤Î¤»¤¤¤Ç `++stats[pno]' ¤Ï¤Ç¤­¤Ê¤¤ print_stats(pno, _stats[pno]); print_score(_score); pat_draw(pno, dir, px, py); if (pat_putable(pno, dir, px, py)) { if (until_down(pno, dir, px, py) < 0) { ex = 1; quit = TRUE; } else { int dl; dl = clear_lines(); # dl = ¾Ã¤·¤¿¥é¥¤¥ó¿ô if (dl > 0) { _lines += dl; print_lines(_lines); if (_lines > _next_level[_level]) { _level++; print_level(_level); } } } } else quit = TRUE; }# while if (_score > _high_score) print_high(_high_score = _score); return ex; }# play # # # func main() { cursor(0); clear(); puts("\t\t\t**** SXinfix ÍÑ tet*is ****"); puts("\t\t\tÁàºîÊýË¡"); puts("\t\t\t [8:¥ì¥Ù¥ë¥¢¥Ã¥×]"); puts("\t\t\t[4:°Üư ] [5:²óž] [6:°Üư]"); puts("\t\t\t [2:Íî²¼]"); puts("\t\t\tSPACE Íî²¼"); puts("\t\t\tESC °ì»þÄä»ß"); puts("\t\t\t^L ºÆÉ½¼¨"); pats_make(); ch = 'y'; while (ch == 'y') { play(); over(); while ((ch = INPOUT(0xff)) != EOF && ch != 0) ; mvwstr(HEIGHT / 2, 1, " PLAY AGAIN (Y/N)? "); while ((ch = INPOUT(0xff)) != EOF && ch != 'y' && ch != 'n') ; }# while cursor(1); }# main srand(time(NULL)); main();