Annotation of coherent/d/usr/games/ttt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * ttt -- 3-dimensional tic-tac-toe.
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: 
        !             7: #define        EMPTY   0
        !             8: #define        MAN     1
        !             9: #define        BEAST   5
        !            10: 
        !            11: /*
        !            12:  * This is a table of all winning
        !            13:  * combinations.
        !            14:  * I stole it out of Kilobaud, April
        !            15:  * 78.
        !            16:  * You can look there to see how it
        !            17:  * is ordered.
        !            18:  */
        !            19: char   w[] = {
        !            20:        0,      1,      2,      3,
        !            21:        4,      5,      6,      7,
        !            22:        8,      9,      10,     11,
        !            23:        12,     13,     14,     15,
        !            24:        0,      4,      8,      12,
        !            25:        1,      5,      9,      13,
        !            26:        2,      6,      10,     14,
        !            27:        3,      7,      11,     15,
        !            28:        0,      5,      10,     15,
        !            29:        3,      6,      9,      12,
        !            30:        16,     17,     18,     19,
        !            31:        20,     21,     22,     23,
        !            32:        24,     25,     26,     27,
        !            33:        28,     29,     30,     31,
        !            34:        16,     20,     24,     28,
        !            35:        17,     21,     25,     29,
        !            36:        18,     22,     26,     30,
        !            37:        19,     23,     27,     31,
        !            38:        16,     21,     26,     31,
        !            39:        19,     22,     25,     28,
        !            40:        32,     33,     34,     35,
        !            41:        36,     37,     38,     39,
        !            42:        40,     41,     42,     43,
        !            43:        44,     45,     46,     47,
        !            44:        32,     36,     40,     44,
        !            45:        33,     37,     41,     45,
        !            46:        34,     38,     42,     46,
        !            47:        35,     39,     43,     47,
        !            48:        32,     37,     42,     47,
        !            49:        35,     38,     41,     44,
        !            50:        48,     49,     50,     51,
        !            51:        52,     53,     54,     55,
        !            52:        56,     57,     58,     59,
        !            53:        60,     61,     62,     63,
        !            54:        48,     52,     56,     60,
        !            55:        49,     53,     57,     61,
        !            56:        50,     54,     58,     62,
        !            57:        51,     55,     59,     63,
        !            58:        48,     53,     58,     63,
        !            59:        51,     54,     57,     60,
        !            60:        0,      16,     32,     48,
        !            61:        1,      17,     33,     49,
        !            62:        2,      18,     34,     50,
        !            63:        3,      19,     35,     51,
        !            64:        4,      20,     36,     52,
        !            65:        5,      21,     37,     53,
        !            66:        6,      22,     38,     54,
        !            67:        7,      23,     39,     55,
        !            68:        8,      24,     40,     56,
        !            69:        9,      25,     41,     57,
        !            70:        10,     26,     42,     58,
        !            71:        11,     27,     43,     59,
        !            72:        13,     29,     45,     61,
        !            73:        12,     28,     44,     60,
        !            74:        14,     30,     46,     62,
        !            75:        15,     31,     47,     63,
        !            76:        0,      21,     42,     63,
        !            77:        4,      21,     38,     55,
        !            78:        8,      25,     42,     59,
        !            79:        12,     25,     38,     51,
        !            80:        1,      21,     41,     61,
        !            81:        13,     25,     37,     49,
        !            82:        2,      22,     42,     62,
        !            83:        14,     26,     38,     50,
        !            84:        3,      22,     41,     60,
        !            85:        7,      22,     37,     52,
        !            86:        11,     26,     41,     56,
        !            87:        15,     26,     37,     48,
        !            88:        0,      20,     40,     60,
        !            89:        0,      17,     34,     51,
        !            90:        3,      18,     33,     48,
        !            91:        3,      23,     43,     63,
        !            92:        12,     24,     36,     48,
        !            93:        12,     29,     46,     63,
        !            94:        15,     30,     45,     60,
        !            95:        15,     27,     39,     51
        !            96: };
        !            97: 
        !            98: char   b[64];
        !            99: char   sep[]   = "----------- ----------- ----------- -----------";
        !           100: 
        !           101: main(argc, argv)
        !           102: char *argv[];
        !           103: {
        !           104:        if (yes("Print rules"))
        !           105:                rules();
        !           106:        if (yes("Play first"))
        !           107:                man();
        !           108:        for (;;) {
        !           109:                beast();
        !           110:                man();
        !           111:        }
        !           112: }
        !           113: 
        !           114: yes(s)
        !           115: char *s;
        !           116: {
        !           117:        char b[20];
        !           118: 
        !           119:        for (;;) {
        !           120:                printf("%s? ", s);
        !           121:                if (gets(b) == NULL)
        !           122:                        exit(0);
        !           123:                if (b[0] == 'y')
        !           124:                        return (1);
        !           125:                if (b[0] == 'n')
        !           126:                        return (0);
        !           127:                printf("Answer `yes' or `no'.\n");
        !           128:        }
        !           129: }
        !           130: 
        !           131: rules()
        !           132: {
        !           133:        printf("Three dimensional tic-tac-toe is played on a 4x4x4\n");
        !           134:        printf("board. To win you must get 4 in a row.  Your moves\n");
        !           135:        printf("are specified as a 3 digit number; the first digit\n");
        !           136:        printf("is the level, the second the row and the third the\n");
        !           137:        printf("column. Levels and columns  go  from left to right\n");
        !           138:        printf("from 0 to 3. Rows go from top to bottom with  0 on\n");
        !           139:        printf("the top.\n");
        !           140: }
        !           141: 
        !           142: man()
        !           143: {
        !           144:        register i, j, t;
        !           145:        char buf[20];
        !           146: 
        !           147:        board();
        !           148:        for (;;) {
        !           149:                if (gets(buf) == NULL)
        !           150:                        exit(0);
        !           151:                i = 16*(buf[0]-'0') + (buf[1]-'0') + 4*(buf[2]-'0');
        !           152:                if (i>=0 && i<=63 && b[i]==EMPTY)
        !           153:                        break;
        !           154:                printf("?\n");
        !           155:        }
        !           156:        b[i] = MAN;
        !           157:        for (i=0; i<4*76; i+=4) {
        !           158:                t = 0;
        !           159:                for (j=0; j<4; ++j)
        !           160:                        t += b[w[i+j]];
        !           161:                if (t == 4*MAN) {
        !           162:                        printf("You win.\n");
        !           163:                        exit(0);
        !           164:                }
        !           165:        }
        !           166: }
        !           167: 
        !           168: board()
        !           169: {
        !           170:        register i, j;
        !           171: 
        !           172:        for (i=0; i<4; ++i) {
        !           173:                if (i != 0)
        !           174:                        puts(sep);
        !           175:                for (j=0; j<64; j+=4) {
        !           176:                        psq(i+j);
        !           177:                        if (j==12 || j==28 || j==44)
        !           178:                                putchar(' ');
        !           179:                        else if (j >= 60)
        !           180:                                putchar('\n');
        !           181:                        else
        !           182:                                putchar('!');
        !           183:                }
        !           184:        }
        !           185: }
        !           186: 
        !           187: psq(s)
        !           188: {
        !           189:        register v;
        !           190: 
        !           191:        v = b[s];
        !           192:        if (v == MAN)
        !           193:                printf("UU");
        !           194:        else if (v == BEAST)
        !           195:                printf("CC");
        !           196:        else
        !           197:                printf("  ");
        !           198: }
        !           199: 
        !           200: beast()
        !           201: {
        !           202:        register i, j, t;
        !           203:        int s, bs, bt, v[76];
        !           204: 
        !           205:        for (i=0; i<4*76; i+=4) {
        !           206:                t = 0;
        !           207:                for (j=0; j<4; ++j)
        !           208:                        t += b[w[i+j]];
        !           209:                v[i>>2] = t;
        !           210:                if (t == 3*BEAST)
        !           211:                        break;
        !           212:        }
        !           213:        if (i < 4*76) {
        !           214:                for (j=0; j<4; ++j)
        !           215:                        if (b[w[i+j]] == EMPTY) {
        !           216:                                b[w[i+j]] = BEAST;
        !           217:                                break;
        !           218:                        }
        !           219:                board();
        !           220:                printf("I win.\n");
        !           221:                exit(0);
        !           222:        }
        !           223:        bt = 0;
        !           224:        for (s=0; s<64; ++s) {
        !           225:                if (b[s] != EMPTY)
        !           226:                        continue;
        !           227:                t = 0;
        !           228:                for (i=0; i<4*76; i+=4) {
        !           229:                        for (j=0; j<4; ++j)
        !           230:                                if (w[i+j] == s)
        !           231:                                        break;
        !           232:                        if (j != 4) {
        !           233:                                if (v[i>>2] == 3*MAN) {
        !           234:                                        b[s] = BEAST;
        !           235:                                        return;
        !           236:                                }
        !           237:                                t += weight(v[i>>2]);
        !           238:                        }
        !           239:                }
        !           240:                if (t > bt) {
        !           241:                        bt = t;
        !           242:                        bs = s;
        !           243:                }
        !           244:        }
        !           245:        if (bt != 0)
        !           246:                b[bs] = BEAST;
        !           247:        else {
        !           248:                for (s=0; s<64; ++s)
        !           249:                        if (b[s] == EMPTY)
        !           250:                                break;
        !           251:                if (s == 64) {
        !           252:                        printf("Draw.\n");
        !           253:                        exit(0);
        !           254:                }
        !           255:                b[s] = BEAST;
        !           256:        }
        !           257: }
        !           258: 
        !           259: weight(t)
        !           260: register t;
        !           261: {
        !           262:        if (t == MAN)
        !           263:                return(1);
        !           264:        if (t == 2*MAN)
        !           265:                return(4);
        !           266:        if (t == BEAST)
        !           267:                return(1);
        !           268:        if (t == 2*BEAST)
        !           269:                return(2);
        !           270:        return(0);
        !           271: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.