roland@ttds.UUCP (Roland Karlsson) (11/01/85)
This program plays the game of noughts and crosses. It uses termcap. Enjoy! ============================================================================== Have a nice day wishes: Roland Karlsson (roland@ttds) Dpt. of Telecomm. & Computer Systems Royal Institute of Technology S-100 44 Stockholm SWEDEN ============================================================================== cut - cut ---- cut ------------ cut ---------------------- cut -------------- : This is a shar archive. Extract with sh, not csh. : This archive ends with exit, so do not worry about trailing junk. echo 'Extracting README' sed 's/^X//' > README << '+ END-OF-FILE README' XREADME This file. X Xmakefile X Xdef.h header. X Xadm.c X cheat() Interupt routine to run when someone trys to X exit program. X main() The main program which make initialisations and X administrates who is on the move. X Xinmove.c X normal() stops the program play self. X inmove() The main event loop. X inposition() Converts text string to position. X emptyline() empty a line at input. X Xterminal.c X getcap() Initialises termcap. X pos() Positions on the screen. X up() Move up one line. X clear() Clear screen from cursor. X home() Cursor home. X Xutboard.c X utboard() Draws the board. X Xautomat.c X automat[][] A computer generated table which defines a finite X automat for calculating points in a string of X <space> o and x. X Xautom.c X autom() A subroutine which from the table automat[][] X calculates points. X Xchose.c X chose() This one is the most central subroutine. It choses X a move to do. You may call this the algorithm for X chosing moves. Now it only choses the move that X gets the highest threat and point score. To be X better it should also test moves and see whats X changing on the board! X Xcatch.c X catch() Fetches patterns from the board and puts them in X temporaray strings. X Xupd.c X update() This one is the second most central subroutine. X It administrates the updating of points and X threats. The code can be difficult to read because X it is optimised for doing as little as possible. X If a more complicated algorithm is used in chose() X this have to be a fast one! X Xupdtht.c X updtht() A help routine for update. It updates the points X on the threat board. X XThere are three more files. Those files you don't need if you don't want Xto change the computing of points. The comments are in Swedish but i don't Xthink that will be of any inconvinience. X Xmake_header The beginning of an automat.c file. X Xmaketabell Defines the computing of points. First there is a table X that defines threatpoint and point for some letters. Then X those letters are used in patterns to define where those X points are found. X Xmakeautomat.c Compile this with cc and run makeautomat < maketabell to X make a new automat.c file. X XPS. If you make any improvments or/and have any suggestions please send the Ximprovments/suggestions to me. X X Roland Karlsson roland@ttds X Dept. of Telecomm. and Computer Systems X Royal Institute of Technology X S-100 44 Stockholm X Sweden + END-OF-FILE README chmod 'u=rw,g=r,o=r' 'README' echo ' -rw-r--r-- 1 roland 2553 Oct 23 08:26 README (as sent)' echo -n ' ' /bin/ls -l README echo 'Extracting adm.c' sed 's/^X//' > adm.c << '+ END-OF-FILE adm.c' X# include "def.h" X# include <stdio.h> X# include <signal.h> X X/* If you push BREAK you are a cheater */ Xcheat(){ X signal(SIGINT, cheat); X pos(1, YZIZE + 2); X if(!slf) X printf("Cheater. I win on V.O.\n"); X exit(); X} X X/* The main program which administrate who's on the move etc */ X Xmain(){ X int x, y; X char svar[16]; X char *term, *getenv(); X X term = getenv("TERM"); X if(getcap(term) == -1){ X printf("Wrong or no TERM: %s\n", term); X exit(); X } X if((height < 24) || (width < 80)){ X printf("To smal screen (%d x %d). Min is (80 x 24)\n", X width, height); X exit(); X } X X for(x = 0; x < XZIZE; x++) X for(y = 0; y < YZIZE; y++) X board[x][y] = ' '; X srand( getpid() ); X utboard(0); X signal(SIGINT, cheat); X pos(1, YZIZE + 1); X printf("Your move f.ex: k12. Computer start: start"); X X while(TRUE){ X if(!slf) X inmove(&x, &y); X if(slf) X if(!chose('x', &x, &y)){ X pos(1, YZIZE + 2); X printf("Can't find a place for my 'x'\n"); X break; X } X play[x][y] = ++playcnt; X pos(x, y); printf("x\b"); fflush(stdout); X board[x][y] = 'x'; X if(update(x, y)){ X pos(1, YZIZE + 2); X printf("Congratulations you won\n"); X break; X } X if(playcnt > 1) X for(x = 0; x < XZIZE; x++) X for(y = 0; y < YZIZE; y++) X if(play[x][y] == playcnt - 1){ X pos(x, y); X printf("o\b"); X fflush(stdout); X } X if(!chose('o', &x, &y)){ X pos(1, YZIZE + 2); X printf("Can't find a place for my 'o'\n"); X break; X } X play[x][y] = ++playcnt; X if(!slf){ X pos(1, YZIZE + 1); X printf("My move: %c%d", 'a' + x, y); X } X pos(x, y); X printf("O\b"); X fflush(stdout); X board[x][y] = 'o'; X if(update(x, y)){ X pos(1, YZIZE + 2); X printf("I won\n"); X break; X } X } X signal(SIGINT, SIG_DFL); /* Skip cheat */ X printf("Do you want to save the game? (y/n) "); X svar[0] = getchar(); emptyline(); X if(svar[0] == 'y'){ X save(); X exit(); X } X if(svar[0] == 'n') X exit(); X printf("Hmmm. Asumes you don't.\n"); X} + END-OF-FILE adm.c chmod 'u=r,g=r,o=r' 'adm.c' echo ' -r--r--r-- 1 roland 1925 Jan 29 1985 adm.c (as sent)' echo -n ' ' /bin/ls -l adm.c echo 'Extracting autom.c' sed 's/^X//' > autom.c << '+ END-OF-FILE autom.c' X# include "def.h" X X/* Scans the tabel who defines the finite automat */ X Xautom(){ X register int state, i, way; X short int who, j; X unsigned char *atm; X char (*p)[17], (*t)[17]; X unsigned char *newpts; X char *oldpts; X unsigned char *newtht; X char *oldtht; X char max; X X for(way = 0; way < 4; way++){ X state = 0; X atm = automat[0]; X p = tmppts[way]; X t = tmptht[way]; X for(i = 0; i < 17; i++){ X p[0][i] = 0; X p[1][i] = 0; X t[0][i] = 0; X t[1][i] = 0; X } X for(i = 0; i < 17; i++){ X switch(hvlr[way][i]){ X case ' ': X state = atm[0]; X break; X case 'o': X state = atm[1]; X who = 0; X break; X case 'x': X state = atm[2]; X who = 1; X break; X default: X state = 0; X } X atm = automat[state]; X if(atm[3]){ X max = 3 * atm[3] + 4; X for(j = 4; j < max; j += 3){ X oldpts = &p[who][i - atm[j]]; X newpts = &atm[j + 2]; X oldtht = &t[who][i - atm[j]]; X newtht = &atm[j + 1]; X if(*newtht > *oldtht) X *oldtht = *newtht; X if(*newpts > *oldpts) X *oldpts = *newpts; X } X } X } X } X} + END-OF-FILE autom.c chmod 'u=r,g=r,o=r' 'autom.c' echo ' -r--r--r-- 1 roland 1573 Feb 7 1985 autom.c (as sent)' echo -n ' ' /bin/ls -l autom.c echo 'Extracting automat.c' sed 's/^X//' > automat.c << '+ END-OF-FILE automat.c' X# define __ 00, X X/* This is a tabel which deflnes a finit automat for pattern recognition */ X Xunsigned char automat[][13] = { X/* Automat Number 1 2 3 */ X/* . O X of hot po of hot po of hot po */ X X/* 0 */ 1, 74,117, __ __ __ __ __ __ __ __ __ __ X/* 1 . */ 2, 32, 53, __ __ __ __ __ __ __ __ __ __ X/* 2 .. */ 3, 12, 22, __ __ __ __ __ __ __ __ __ __ X/* 3 ... */ 3, 4, 8, __ __ __ __ __ __ __ __ __ __ X/* 4 ...O */ 5, 6,117, __ __ __ __ __ __ __ __ __ __ X/* 5 ...O. */ 14, 15, 53, 2, 3, __ 1, 2, __ 2, __ __ __ X/* 6 ...OO */ 7, 20,117, 2, 3, __ 3, 2, __ 4, __ __ __ X/* 7 ...OO. */ 19, 47, 53, 3, 4, 1, 5, 3, 1, 10, __ __ 4, X/* 8 ...X */ 9, 74, 10, __ __ __ __ __ __ __ __ __ __ X/* 9 ...X. */ 24, 32, 25, 2, 3, __ 1, 2, __ 2, __ __ __ X/* 10 ...XX */ 11, 74, 30, 2, 3, __ 3, 2, __ 4, __ __ __ X/* 11 ...XX. */ 29, 32, 68, 3, 4, 1, 5, 3, 1, 10, __ __ 4, X/* 12 ..O */ 13, 17,117, __ __ __ __ __ __ __ __ __ __ X/* 13 ..O. */ 14, 15, 53, __ __ __ __ __ __ __ __ __ __ X/* 14 ..O.. */ 35, 36, 22, 2, 3, __ 2, 1, __ 2, __ __ __ X/* 15 ..O.O */ 16, 41,117, 2, 3, __ 3, 1, __ 4, __ __ __ X/* 16 ..O.O. */ 40, 85, 53, 3, 4, 1, 5, 2, 1, 10, __ __ 3, X/* 17 ..OO */ 18, 20,117, __ __ __ __ __ __ __ __ __ __ X/* 18 ..OO. */ 19, 47, 53, 3, 4, __ 3, 3, __ 4, __ __ 4, X/* 19 ..OO.. */ 46, 97, 22, 3, 4, 1, 10, 1, 1, 10, __ __ 3, X/* 20 ..OOO */ 21, 52,117, 2, 4, 2, 5, 3, 2, 10, __ __ __ X/* 21 ..OOO. */ 51,114, 53, 2, 4, 3, 20, __ 2, 10, __ __ __ X/* 22 ..X */ 23, 74, 27, __ __ __ __ __ __ __ __ __ __ X/* 23 ..X. */ 24, 32, 25, __ __ __ __ __ __ __ __ __ __ X/* 24 ..X.. */ 56, 12, 57, 2, 3, __ 2, 1, __ 2, __ __ __ X/* 25 ..X.X */ 26, 74, 62, 2, 3, __ 3, 1, __ 4, __ __ __ X/* 26 ..X.X. */ 61, 32,128, 3, 4, 1, 5, 2, 1, 10, __ __ 3, X/* 27 ..XX */ 28, 74, 30, __ __ __ __ __ __ __ __ __ __ X/* 28 ..XX. */ 29, 32, 68, 3, 4, __ 3, 3, __ 4, __ __ 4, X/* 29 ..XX.. */ 67, 12,140, 3, 4, 1, 10, 1, 1, 10, __ __ 3, X/* 30 ..XXX */ 31, 74, 73, 2, 4, 2, 5, 3, 2, 10, __ __ __ X/* 31 ..XXX. */ 72, 32,157, 2, 4, 3, 20, __ 2, 10, __ __ __ X/* 32 .O */ 33, 43,117, __ __ __ __ __ __ __ __ __ __ X/* 33 .O. */ 34, 38, 53, __ __ __ __ __ __ __ __ __ __ X/* 34 .O.. */ 35, 36, 22, __ __ __ __ __ __ __ __ __ __ X/* 35 .O... */ 3, 4, 8, 2, 2, __ 2, 1, __ 1, __ __ __ X/* 36 .O..O */ 37, 79,117, 2, 2, __ 3, 1, __ 3, __ __ __ X/* 37 .O..O. */ 14, 15, 53, 2, 3, 1, 5, 2, 1, 5, __ __ __ X/* 38 .O.O */ 39, 41,117, __ __ __ __ __ __ __ __ __ __ X/* 39 .O.O. */ 40, 85, 53, 3, 4, __ 3, 2, __ 4, __ __ 3, X/* 40 .O.O.. */ 35, 36, 22, 2, 3, 1, 10, 1, 1, 5, __ __ __ X/* 41 .O.OO */ 42, 92,117, 2, 4, 2, 5, 2, 2, 10, __ __ __ X/* 42 .O.OO. */ 90, 47, 53, 2, 3, 3, 20, __ 2, 5, __ __ __ X/* 43 .OO */ 44, 49,117, __ __ __ __ __ __ __ __ __ __ X/* 44 .OO. */ 45, 47, 53, __ __ __ __ __ __ __ __ __ __ X/* 45 .OO.. */ 46, 97, 22, 3, 4, __ 4, 1, __ 4, __ __ 3, X/* 46 .OO... */ 3, 4, 8, 2, 2, 1, 10, 1, 1, 5, __ __ __ X/* 47 .OO.O */ 48,106,117, 2, 4, 2, 5, 1, 2, 10, __ __ __ X/* 48 .OO.O. */103, 85, 53, 2, 2, 3, 20, __ 2, 5, __ __ __ X/* 49 .OOO */ 50, 52,117, __ __ __ __ __ __ __ __ __ __ X/* 50 .OOO. */ 51,114, 53, 2, 4, 2, 10, __ 2, 10, __ __ __ X/* 51 .OOO.. */110, 97, 22, 2, 1, 3, 20, __ 2, 5, __ __ __ X/* 52 .OOOO */116,115,117, 1, 4, 4, 30, __ __ __ __ __ __ X/* 53 .X */ 54, 74, 64, __ __ __ __ __ __ __ __ __ __ X/* 54 .X. */ 55, 32, 59, __ __ __ __ __ __ __ __ __ __ X/* 55 .X.. */ 56, 12, 57, __ __ __ __ __ __ __ __ __ __ X/* 56 .X... */ 3, 4, 8, 2, 2, __ 2, 1, __ 1, __ __ __ X/* 57 .X..X */ 58, 74,122, 2, 2, __ 3, 1, __ 3, __ __ __ X/* 58 .X..X. */ 24, 32, 25, 2, 3, 1, 5, 2, 1, 5, __ __ __ X/* 59 .X.X */ 60, 74, 62, __ __ __ __ __ __ __ __ __ __ X/* 60 .X.X. */ 61, 32,128, 3, 4, __ 3, 2, __ 4, __ __ 3, X/* 61 .X.X.. */ 56, 12, 57, 2, 3, 1, 10, 1, 1, 5, __ __ __ X/* 62 .X.XX */ 63, 74,135, 2, 4, 2, 5, 2, 2, 10, __ __ __ X/* 63 .X.XX. */133, 32, 68, 2, 3, 3, 20, __ 2, 5, __ __ __ X/* 64 .XX */ 65, 74, 70, __ __ __ __ __ __ __ __ __ __ X/* 65 .XX. */ 66, 32, 68, __ __ __ __ __ __ __ __ __ __ X/* 66 .XX.. */ 67, 12,140, 3, 4, __ 4, 1, __ 4, __ __ 3, X/* 67 .XX... */ 3, 4, 8, 2, 2, 1, 10, 1, 1, 5, __ __ __ X/* 68 .XX.X */ 69, 74,149, 2, 4, 2, 5, 1, 2, 10, __ __ __ X/* 69 .XX.X. */146, 32,128, 2, 2, 3, 20, __ 2, 5, __ __ __ X/* 70 .XXX */ 71, 74, 73, __ __ __ __ __ __ __ __ __ __ X/* 71 .XXX. */ 72, 32,157, 2, 4, 2, 10, __ 2, 10, __ __ __ X/* 72 .XXX.. */153, 12,140, 2, 1, 3, 20, __ 2, 5, __ __ __ X/* 73 .XXXX */159, 74,158, 1, 4, 4, 30, __ __ __ __ __ __ X/* 74 O */ 75, 93,117, __ __ __ __ __ __ __ __ __ __ X/* 75 O. */ 76, 82, 53, __ __ __ __ __ __ __ __ __ __ X/* 76 O.. */ 3, 77, 22, __ __ __ __ __ __ __ __ __ __ X/* 77 O..O */ 78, 79,117, __ __ __ __ __ __ __ __ __ __ X/* 78 O..O. */ 14, 15, 53, 2, 3, __ 3, 2, __ 3, __ __ __ X/* 79 O..OO */ 80, 20,117, __ __ __ __ __ __ __ __ __ __ X/* 80 O..OO. */ 19, 81, 53, 1, __ __ 4, __ __ __ __ __ __ X/* 81 O..OO.O */ 48,106,117, 2, 4, 3, 20, 1, 2, 10, __ __ __ X/* 82 O.O */ 83, 88,117, __ __ __ __ __ __ __ __ __ __ X/* 83 O.O. */ 84, 85, 53, __ __ __ __ __ __ __ __ __ __ X/* 84 O.O.. */ 35, 36, 22, 2, 3, __ 4, 1, __ 3, __ __ __ X/* 85 O.O.O */ 86, 41,117, __ __ __ __ __ __ __ __ __ __ X/* 86 O.O.O. */ 40, 87, 53, 1, __ __ 4, __ __ __ __ __ __ X/* 87 O.O.O.O */ 86, 41,117, 2, 3, 3, 20, 1, 2, 5, __ __ __ X/* 88 O.OO */ 89, 92,117, __ __ __ __ __ __ __ __ __ __ X/* 89 O.OO. */ 90, 47, 53, 2, 3, 2, 10, __ 2, 5, __ __ __ X/* 90 O.OO.. */ 46, 91, 22, 1, __ __ 4, __ __ __ __ __ __ X/* 91 O.OO..O */ 98, 79,117, 2, 2, 3, 20, 1, 2, 5, __ __ __ X/* 92 O.OOO */ 50, 52,117, 1, 3, 4, 30, __ __ __ __ __ __ X/* 93 OO */ 94,107,117, __ __ __ __ __ __ __ __ __ __ X/* 94 OO. */ 95,101, 53, __ __ __ __ __ __ __ __ __ __ X/* 95 OO.. */ 96, 97, 22, __ __ __ __ __ __ __ __ __ __ X/* 96 OO... */ 3, 4, 8, 2, 2, __ 4, 1, __ 3, __ __ __ X/* 97 OO..O */ 98, 79,117, __ __ __ __ __ __ __ __ __ __ X/* 98 OO..O. */ 14, 99, 53, __ __ __ __ __ __ __ __ __ __ X/* 99 OO..O.O */ 16,100,117, 2, 3, __ 3, 1, __ 4, __ __ __ X/*100 OO..O.OO */ 42, 92,117, 2, 4, 3, 20, 2, 2, 10, __ __ __ X/*101 OO.O */102,106,117, __ __ __ __ __ __ __ __ __ __ X/*102 OO.O. */103, 85, 53, 2, 2, 2, 10, __ 2, 5, __ __ __ X/*103 OO.O.. */ 35,104, 22, __ __ __ __ __ __ __ __ __ __ X/*104 OO.O..O */ 37,105,117, 2, 2, __ 3, 1, __ 3, __ __ __ X/*105 OO.O..OO */ 80, 20,117, 2, 3, 3, 20, 2, 2, 5, __ __ __ X/*106 OO.OO */ 89, 92,117, 1, 2, 4, 30, __ __ __ __ __ __ X/*107 OOO */108,115,117, __ __ __ __ __ __ __ __ __ __ X/*108 OOO. */109,114, 53, __ __ __ __ __ __ __ __ __ __ X/*109 OOO.. */110, 97, 22, 2, 1, 2, 10, __ 2, 5, __ __ __ X/*110 OOO... */ 3,111, 8, __ __ __ __ __ __ __ __ __ __ X/*111 OOO...O */ 5,112,117, __ __ __ __ __ __ __ __ __ __ X/*112 OOO...OO */ 7,113,117, 1, 2, __ 4, __ __ __ __ __ __ X/*113 OOO...OOO */ 21, 52,117, 2, 4, 3, 20, 3, 2, 10, __ __ __ X/*114 OOO.O */102,106,117, 1, 1, 4, 30, __ __ __ __ __ __ X/*115 OOOO */116,115,117, __ __ __ __ __ __ __ __ __ __ X/*116 OOOO. */109,114, 53, 1, __ 4, 30, __ __ __ __ __ __ X/*117 X */118, 74,136, __ __ __ __ __ __ __ __ __ __ X/*118 X. */119, 32,125, __ __ __ __ __ __ __ __ __ __ X/*119 X.. */ 3, 12,120, __ __ __ __ __ __ __ __ __ __ X/*120 X..X */121, 74,122, __ __ __ __ __ __ __ __ __ __ X/*121 X..X. */ 24, 32, 25, 2, 3, __ 3, 2, __ 3, __ __ __ X/*122 X..XX */123, 74, 30, __ __ __ __ __ __ __ __ __ __ X/*123 X..XX. */ 29, 32,124, 1, __ __ 4, __ __ __ __ __ __ X/*124 X..XX.X */ 69, 74,149, 2, 4, 3, 20, 1, 2, 10, __ __ __ X/*125 X.X */126, 74,131, __ __ __ __ __ __ __ __ __ __ X/*126 X.X. */127, 32,128, __ __ __ __ __ __ __ __ __ __ X/*127 X.X.. */ 56, 12, 57, 2, 3, __ 4, 1, __ 3, __ __ __ X/*128 X.X.X */129, 74, 62, __ __ __ __ __ __ __ __ __ __ X/*129 X.X.X. */ 61, 32,130, 1, __ __ 4, __ __ __ __ __ __ X/*130 X.X.X.X */129, 74, 62, 2, 3, 3, 20, 1, 2, 5, __ __ __ X/*131 X.XX */132, 74,135, __ __ __ __ __ __ __ __ __ __ X/*132 X.XX. */133, 32, 68, 2, 3, 2, 10, __ 2, 5, __ __ __ X/*133 X.XX.. */ 67, 12,134, 1, __ __ 4, __ __ __ __ __ __ X/*134 X.XX..X */141, 74,122, 2, 2, 3, 20, 1, 2, 5, __ __ __ X/*135 X.XXX */ 71, 74, 73, 1, 3, 4, 30, __ __ __ __ __ __ X/*136 XX */137, 74,150, __ __ __ __ __ __ __ __ __ __ X/*137 XX. */138, 32,144, __ __ __ __ __ __ __ __ __ __ X/*138 XX.. */139, 12,140, __ __ __ __ __ __ __ __ __ __ X/*139 XX... */ 3, 4, 8, 2, 2, __ 4, 1, __ 3, __ __ __ X/*140 XX..X */141, 74,122, __ __ __ __ __ __ __ __ __ __ X/*141 XX..X. */ 24, 32,142, __ __ __ __ __ __ __ __ __ __ X/*142 XX..X.X */ 26, 74,143, 2, 3, __ 3, 1, __ 4, __ __ __ X/*143 XX..X.XX */ 63, 74,135, 2, 4, 3, 20, 2, 2, 10, __ __ __ X/*144 XX.X */145, 74,149, __ __ __ __ __ __ __ __ __ __ X/*145 XX.X. */146, 32,128, 2, 2, 2, 10, __ 2, 5, __ __ __ X/*146 XX.X.. */ 56, 12,147, __ __ __ __ __ __ __ __ __ __ X/*147 XX.X..X */ 58, 74,148, 2, 2, __ 3, 1, __ 3, __ __ __ X/*148 XX.X..XX */123, 74, 30, 2, 3, 3, 20, 2, 2, 5, __ __ __ X/*149 XX.XX */132, 74,135, 1, 2, 4, 30, __ __ __ __ __ __ X/*150 XXX */151, 74,158, __ __ __ __ __ __ __ __ __ __ X/*151 XXX. */152, 32,157, __ __ __ __ __ __ __ __ __ __ X/*152 XXX.. */153, 12,140, 2, 1, 2, 10, __ 2, 5, __ __ __ X/*153 XXX... */ 3, 4,154, __ __ __ __ __ __ __ __ __ __ X/*154 XXX...X */ 9, 74,155, __ __ __ __ __ __ __ __ __ __ X/*155 XXX...XX */ 11, 74,156, 1, 2, __ 4, __ __ __ __ __ __ X/*156 XXX...XXX */ 31, 74, 73, 2, 4, 3, 20, 3, 2, 10, __ __ __ X/*157 XXX.X */145, 74,149, 1, 1, 4, 30, __ __ __ __ __ __ X/*158 XXXX */159, 74,158, __ __ __ __ __ __ __ __ __ __ X/*159 XXXX. */152, 32,157, 1, __ 4, 30, __ __ __ __ __ __ X}; + END-OF-FILE automat.c chmod 'u=r,g=r,o=r' 'automat.c' echo ' -r--r--r-- 1 roland 12448 Jan 29 1985 automat.c (as sent)' echo -n ' ' /bin/ls -l automat.c echo 'Extracting catch.c' sed 's/^X//' > catch.c << '+ END-OF-FILE catch.c' X# include "def.h" X X/* Fetches patterns in the board and puts them in temporary strings */ Xcatch(x, y) int x, y;{ X char *h, *v, *l, *r; X register int i; X X h = hvlr[0]; X v = hvlr[1]; X l = hvlr[2]; X r = hvlr[3]; X X for(i = -8; i <= 8; i++){ X if((x + i >= 0) && (x + i < XZIZE)) X *h++ = board[x + i][y]; X else X *h++ = 'z'; X if((y + i >= 0) && (y + i < YZIZE)) X *v++ = board[x][y + i]; X else X *v++ = 'z'; X if((x + i >= 0) && (x + i < XZIZE) && (y + i >= 0) && (y + i < YZIZE)) X *l++ = board[x + i][y + i]; X else X *l++ = 'z'; X if((x + i >= 0) && (x + i < XZIZE) && (y - i >= 0) && (y - i < YZIZE)) X *r++ = board[x + i][y - i]; X else X *r++ = 'z'; X } X} + END-OF-FILE catch.c chmod 'u=r,g=r,o=r' 'catch.c' echo ' -r--r--r-- 1 roland 668 Feb 7 1985 catch.c (as sent)' echo -n ' ' /bin/ls -l catch.c echo 'Extracting chose.c' sed 's/^X//' > chose.c << '+ END-OF-FILE chose.c' X# include "def.h" X X/* Chose what move shall be done depending on threats and points */ Xchose(who, dox, doy) char who; int *dox, *doy;{ X short int maxpts, movbuf[2][BZIZE], movp, i, good, whomax; X register int x, y, n; X X if(who == 'x') X who = 1; X else X who = 0; X X for(x = 0; x < 2; x++){ X thtmax[x] = 0; X for(y = 4; y > 0; y--){ X if(thtcnt[x][y]){ X thtmax[x] = y; X break; X } X } X } X X good = movp = 0; X maxpts = -1; X if(thtmax[who] >= thtmax[!who]) X whomax = who; X else{ X whomax = !who; X if(thtmax[!who] == 1) X whomax = who; X } X for(x = 0; x < XZIZE; x++) X for(y = 0; y < YZIZE; y++) X if((board[x][y] == ' ') && X (threat[whomax][x][y] == thtmax[whomax])){ X good++; X if((threat[whomax][x][y]) || (point[x][y] != 0)){ X movbuf[0][movp] = x; X movbuf[1][movp++] = y; X if(point[x][y] > maxpts) X maxpts = point[x][y]; X } X } X n = 1; X for(i = 0; i < movp; i++){ X if(!maxpts || (point[movbuf[0][i]][movbuf[1][i]] * 11) / (10 * maxpts)){ X if(!((rand()>>4) % n++)){ X *dox = movbuf[0][i]; X *doy = movbuf[1][i]; X } X } X } X if(!movp && good) X for(x = 0; x < XZIZE; x++) X for(y = 0; y < YZIZE; y++) X if( (board[x][y] == ' ') && X !((rand()>>4) % n++)){ X *dox = x; X *doy = y; X } X return(good); X} + END-OF-FILE chose.c chmod 'u=r,g=r,o=r' 'chose.c' echo ' -r--r--r-- 1 roland 1265 Feb 7 1985 chose.c (as sent)' echo -n ' ' /bin/ls -l chose.c echo 'Extracting def.h' sed 's/^X//' > def.h << '+ END-OF-FILE def.h' X# define TH_3 1 X# define TH_4 2 X# define FORCED 3 X# define READY 4 X X# define LOGIC char X# define TRUE 1 X# define FALSE 0 X X/* ZIZEs are different from unixluff */ X# define XZIZE 19 X# define YZIZE 19 X# define BZIZE 361 /* YZIZE * XZIZE */ X Xint width; Xint height; X Xchar board[XZIZE][YZIZE]; Xshort int play[XZIZE][YZIZE]; Xshort int playcnt; X Xchar point[XZIZE][YZIZE]; Xchar p_hvlr[4][XZIZE][YZIZE]; Xchar threat[2][XZIZE][YZIZE]; Xchar t_hvlr[4][2][XZIZE][YZIZE]; Xshort int thtcnt[2][5]; Xchar thtmax[2]; Xchar hvlr[4][18]; X Xunsigned char automat[][13]; Xchar tmppts[4][2][17]; Xchar tmptht[4][2][17]; X XLOGIC slf; X + END-OF-FILE def.h chmod 'u=r,g=r,o=r' 'def.h' echo ' -r--r--r-- 1 roland 604 Feb 7 1985 def.h (as sent)' echo -n ' ' /bin/ls -l def.h echo 'Extracting inmove.c' sed 's/^X//' > inmove.c << '+ END-OF-FILE inmove.c' X# include "def.h" X# include <stdio.h> X# include <signal.h> Xextern cheat(); X X/* makes the program play self */ Xnormal(){ X signal(SIGINT, cheat); X slf = 0; X} X X/* Routin for input of moves and commands */ Xinmove(x, y) int *x, *y;{ X char buff[11], who; X int i, j, xx, yy; X X while(TRUE){ X pos(1, YZIZE + 2); X printf("Your move: "); X scanf("%s", buff); emptyline(); X up(); up(); clear(); X if(!strcmp(buff, "board")){ X utboard(0); X continue; X } X if((playcnt == 0) && !strcmp(buff, "start")){ X xx = XZIZE/2; X yy = YZIZE/2; X board[xx][yy] = 'o'; X update(xx, yy); X play[xx][yy] = ++playcnt; X pos(xx, yy); X putchar('o'); X pos(1, YZIZE +1); X clear(); X continue; X } X if(!strcmp(buff,"remove")){ X while(TRUE){ X if(playcnt == 0) X break; X for(xx = 0; xx < XZIZE; xx++) X for(yy = 0; yy < YZIZE; yy++) X if(play[xx][yy] == playcnt){ X play[xx][yy] = 0; X who = board[xx][yy]; X board[xx][yy] = ' '; X update(xx, yy); X pos(xx, yy); X printf(".\b"); X } X playcnt--; X if(who == 'x') X break; X } X continue; X } X if(!strcmp(buff, "play")){ X for(xx = 0; xx < XZIZE; xx++) X for(yy = 0; yy < YZIZE; yy++) X if(play[xx][yy]){ X pos(xx, yy); X printf("%2d", play[xx][yy]); X } X continue; X } X if(!strcmp(buff, "help")){ X home(); clear(); X printf("b5, c12 :Examples on moveformats\n"); X printf("remove :Taking back moves\n"); X printf("slf :The program plays self\n"); X printf("point :Shows pointboard\n"); X printf("pts :Shows way pointboard\n"); X printf("threat :Shows threatboard\n"); X printf("tht :Shows way threatboard\n"); X printf("play :Shows the game\n"); X printf("board :Rewrite board\n"); X printf("save :Saves the game\n"); X printf("resave :Resave the game\n"); X printf("automat :Runs pattern recognition\n"); X printf("hint :gives you a hint\n"); X printf("\n\n\nPush <return> when you'r ready\n"); X emptyline(); X utboard(0); X continue; X } X if(!strcmp(buff, "save")){ X save(); X continue; X } X if(!strcmp(buff, "resave")){ X resave(); X continue; X } X if(!strcmp(buff, "slf")){ X signal(SIGINT, normal); X slf = TRUE; X return; X } X if(!strcmp(buff, "point")){ X utboard(point); X continue; X } X if(!strcmp(buff, "pts")){ X printf("Which way -|\\/(0123): "); X scanf("%d", &i); emptyline(); X utboard(p_hvlr[i]); X continue; X } X if(!strcmp(buff, "threat")){ X printf("Which player ox(01): "); X scanf("%d", &i); emptyline(); X utboard(threat[i]); X continue; X } X if(!strcmp(buff, "tht")){ X printf("Which way and player -|\\/(0123) ox(01): "); X scanf("%d%d", &i, &j); emptyline(); X utboard(t_hvlr[i][j]); X continue; X } X if(!strcmp(buff, "automat")){ X printf("What position: "); X scanf("%s", buff); emptyline(); X up(); X printf("Which way -|\\/(0123); "); X scanf("%d", &j); emptyline(); X if(inposition(x, y, buff)){ X catch(*x, *y); X autom(); X pos(XZIZE + 2, 0); X printf(" pto ptx tho thx"); X for(i = 0; i < 17; i++){ X pos(XZIZE + 2, i + 1); X printf("%3c", hvlr[j][i]); X printf("%4d", tmppts[j][0][i]); X printf("%4d", tmppts[j][1][i]); X printf("%4d", tmptht[j][0][i]); X printf("%4d", tmptht[j][1][i]); X } X } X continue; X } X if(!strcmp(buff, "hint")){ X if(chose('x', &xx, &yy)) X printf("My hint is: %c%d", 'a' + xx, yy); X continue; X } X if(inposition(x, y, buff)) X return; X printf("\n\nType help for help"); X } X} X X/* Converts a text string type g11 to a position */ X Xinposition(x, y, buff) int *x, *y; char buff[11];{ X *x = buff[0] - 'a'; X *y = atoi(&buff[1]); X if((*x >= 0) && (*x < XZIZE) && (*y >= 0) && (*y < YZIZE) X && (buff[1] >= '0') && (buff[1] <= '9') X && board[*x][*y] == ' ') X return(1); X return(0); X} X X/* Empty a line */ X Xemptyline(){ X while(getchar() != '\n'); X} + END-OF-FILE inmove.c chmod 'u=r,g=r,o=r' 'inmove.c' echo ' -r--r--r-- 1 roland 3857 Jan 29 1985 inmove.c (as sent)' echo -n ' ' /bin/ls -l inmove.c echo 'Extracting make_header' sed 's/^X//' > make_header << '+ END-OF-FILE make_header' X# define __ 00, X X/* Detta {r en tabell vilken defenierar en finit automat f|r m|nsters|kning */ X Xunsigned char automat[][13] = { X/* Automat Antal 1 2 3 */ X/* . O X of hot po of hot po of hot po */ X + END-OF-FILE make_header chmod 'u=r,g=r,o=r' 'make_header' echo ' -r--r--r-- 1 roland 288 Oct 18 10:03 make_header (as sent)' echo -n ' ' /bin/ls -l make_header echo 'Extracting makeautomat.c' sed 's/^X//' > makeautomat.c << '+ END-OF-FILE makeautomat.c' X# include "stdio.h" X# define FOUND 1 X# define NOT_FOUND 0 X# define DUMMY 'd' X Xempty(){ X while(getchar() != '\n'); X} X Xfempty(fd) FILE *fd;{ X while(getc(fd) != '\n'); X} X Xmain(){ X char text[128], uttext[128], c; X char textarray[512][16]; X int automat[512][3]; /* .=0 O=1 X=2 */ X char pattern[4]; X int offs, offset[3], point[3], threat[3]; X int p[10], t[10], count, length; X FILE *fd_in, *fd_out; X int i, j, k; X int flag; X X/* ********** Pass 1 ********************************************************* XL{ser in en fil fr}n standard input med formatet: X--------- X| X| X| Block vilket inneh}ller po{ngdefenitioner. X| X| X--------- X| X| X| Block vilket inneh}ller m|nster vilka ger po{ng. X| X| X--------- XUtdata skrivs p} filen make_first och inneh}ller m|nster plus po{ng. X*************************************************************************** */ X X printf("Pass 1\n"); X for(i = 0; i < 10; i++){ X scanf("%*c%d%d", &t[i], &p[i]); empty(); X } X X fd_out = fopen("make_first", "w"); X while(scanf("%s", text) != EOF){ X if(text[0] == 0) X continue; X j = 0; X for(i = 0; i < 3; i++){ X offset[i] = 0; X point[i] = 0; X threat[i] = 0; X } X for(count = 0; text[count] != 0; count++); X for(i = 0; text[i] !=0; i++){ X if((text[i] == '.') || (text[i] == 'X')) X uttext[i] = text[i]; X else{ X offset[j] = count - i - 1; X threat[j] = t[text[i] - 'a']; X point[j] = p[text[i] - 'a']; X uttext[i] = '.'; X j++; X } X } X uttext[i] = 0; X fprintf(fd_out, "%-10s%3d", uttext, j); X for(i = 0; i < 3; i++) X fprintf(fd_out,"%5d%3d%3d", offset[i], threat[i], point[i]); X fprintf(fd_out,"\n"); X } X fclose(fd_out); X X/* ********** Pass 2 ********************************************************* XL{ser filen make_first samt l{gger till motsvarande m|nster med XO i st}llet f|r X. X*************************************************************************** */ X X printf("Pass 2\n"); X fd_in = fopen("make_first", "r"); X fd_out = fopen("make_temp1", "w"); X while((fscanf(fd_in, "%c", &c)) != EOF) X if(c == 'X') X fprintf(fd_out, "O"); X else X fprintf(fd_out, "%c", c); X fclose(fd_in); X fclose(fd_out); X system("cat make_first make_temp1 > make_temp2"); X system("mv make_temp2 make_first"); X system("rm make_temp1"); X X/* ********** Pass 3 ********************************************************* XL{ser filen make_first samt l{gger till delm|nster vilka leder till m|nstren. XOm delm|nstret redan finns skall det ej l{ggas till. D.v.s inga kopior Xskall uppst}. Delm|nstren ges po{ng noll. Filen sorteras. X*************************************************************************** */ X X printf("Pass 3\n"); X fd_in = fopen("make_first", "r"); X length = 0; X while((fscanf(fd_in, "%s", textarray[length])) != EOF){ X length++; X fempty(fd_in); X } X count = length; X fclose(fd_in); X fd_out = fopen("make_first", "a"); X for(i = 0; i < count; i++){ X strcpy(text, textarray[i]); X for(; text[0] != 0; text[strlen(text) - 1] = 0){ X flag = NOT_FOUND; X for(j = 0; j < length; j++) X if(!strcmp(text, textarray[j])){ X flag = FOUND; X break; X } X if(flag == NOT_FOUND){ X strcpy(textarray[length++], text); X fprintf(fd_out, "%-10s%3d", text, 0); X for(k = 0; k < 3; k++) X fprintf(fd_out, "%5d%3d%3d", 0, 0, 0); X fprintf(fd_out, "\n"); X length++; X } X } X } X fclose(fd_out); X system("sort make_first -o make_sort"); X X/* ********** Pass 4 ********************************************************* XDet sista passet vilket konstruerar automaten samt g|r om filen till en Xc-fil med namnet automat.c. X*************************************************************************** */ X X printf("Pass 4\n"); X fd_in = fopen("make_sort", "r"); X strcpy(textarray[0], ""); X length = 1; X while((fscanf(fd_in, "%s", textarray[length])) != EOF){ X length++; X fempty(fd_in); X } X strcpy(pattern, ".OX"); X for(i = 0; i < length; i++){ X strcpy(text, textarray[i]); X for(j = strlen(text) + 1; j < 20; j++) X text[j] = 0; X text[strlen(text)] = DUMMY; X for(j = 0; j < 3; j++){ X text[strlen(text) - 1] = pattern[j]; X flag = NOT_FOUND; X for(offs = 0; offs < 11; offs++){ X for(k = 0; k < length; k++) X if(!strcmp(text + offs, textarray[k])){ X flag = FOUND; X automat[i][j] = k; X break; X } X if(flag == FOUND) X break; X } X if(flag == NOT_FOUND) X printf("Cant find %s\n", text); X } X } X fclose(fd_in); X fd_in = fopen("make_sort", "r"); X fd_out = fopen("make_automat", "w"); X for(i = 0; i < 3; i++){ X offset[i] = 0; X point[i] = 0; X threat[i] = 0; X } X count = 0; X for(i = 0; i < length; i++){ X fprintf(fd_out, "/*%3d %-10s*/", i, textarray[i]); X fprintf(fd_out, "%3d,%3d,%3d,", automat[i][0], automat[i][1], X automat[i][2]); X fprintf(fd_out, "%5d,", count); X for(j = 0; j < 3; j++) X fprintf(fd_out, "%4d,%3d,%3d,", offset[j], threat[j], X point[j]); X fprintf(fd_out, "\n"); X fscanf(fd_in, "%*s%d", &count); X for(j = 0; j < 3; j++) X fscanf(fd_in, "%d%d%d\n", &offset[j], &threat[j], X &point[j]); X } X fprintf(fd_out, "};\n"); X fclose(fd_in); X fclose(fd_out); X system("cat make_header make_automat | sed 's/ 0,/ __/g' > automat.c"); X system("rm make_first make_sort make_automat"); X} + END-OF-FILE makeautomat.c chmod 'u=r,g=r,o=r' 'makeautomat.c' echo ' -r--r--r-- 1 roland 5132 Oct 18 10:01 makeautomat.c (as sent)' echo -n ' ' /bin/ls -l makeautomat.c echo 'Extracting makefile' sed 's/^X//' > makefile << '+ END-OF-FILE makefile' X.SUFFIXES: .o .c XSOURCES=adm.c automat.c autom.c chose.c inmove.c\ X terminal.c upd.c catch.c updtht.c utboard.c save.c XOBJECTS=adm.o automat.o autom.o chose.o inmove.o\ X terminal.o upd.o catch.o updtht.o utboard.o save.o X X.c.o: ; cc -c $*.c X Xluff: ${OBJECTS} X cc -o luff ${OBJECTS} -ltermcap X Xadm.o autom.o chose.o inmove.o\ Xterminal.o upd.o catch.o updtht.o utboard.o save.o: def.h X Xcleanup: X rm -f *.o X Xprint: X print makefile def.h\ X adm.c automat.c autom.c chose.c inmove.c\ X terminal.c upd.c catch.c updtht.c utboard.c save.c + END-OF-FILE makefile chmod 'u=rw,g=r,o=r' 'makefile' echo ' -rw-r--r-- 1 roland 536 Jan 29 1985 makefile (as sent)' echo -n ' ' /bin/ls -l makefile echo 'Extracting save.c' sed 's/^X//' > save.c << '+ END-OF-FILE save.c' X# include "def.h" X# include "stdio.h" X X/* Saves and resaves a position. File for saving is luff.out */ X Xsave(){ X int x, y; X FILE *fd; X X fd = fopen("luff.out", "w"); X for(y = 0; y < YZIZE; y++){ X for(x = 0; x < XZIZE; x++) X fprintf(fd, "%3d%c", play[x][y], board[x][y]); X fprintf(fd, "\n"); X } X} X Xresave(){ X int x, y; X char temp; X FILE *fd; X X if((fd = fopen("luff.out", "r")) == 0){ X printf("Can't open the file luff.out\n"); X return; X } X playcnt = 0; X for(y = 0; y < YZIZE; y++){ X for(x = 0; x < XZIZE; x++){ X fscanf(fd, "%3d%c", &play[x][y], &temp); X if(play[x][y] > playcnt) X playcnt = play[x][y]; X if(temp != board[x][y]){ /* [ndring */ X board[x][y] = temp; X update(x, y); X pos(x, y); X if(board[x][y] == ' ') X putchar('.'); X else X putchar(board[x][y]); X } X } X fscanf(fd, "\n"); X } X} + END-OF-FILE save.c chmod 'u=r,g=r,o=r' 'save.c' echo ' -r--r--r-- 1 roland 829 Jan 29 1985 save.c (as sent)' echo -n ' ' /bin/ls -l save.c echo 'Extracting tabell' sed 's/^X//' > tabell << '+ END-OF-FILE tabell' Xa 0 1 /* Splittrad 2:a a=type 0=threat 1=points */ Xb 0 2 /* Solid 2:a */ Xc 0 3 /* Splittrad 3:a */ Xd 0 4 /* Solid 3:a */ Xe 1 5 /* Splittrad ostoppad 3:a */ Xf 1 10 /* Solid ostoppad 3:a */ Xg 2 5 /* Splittrad 4:a */ Xh 2 10 /* Solid 4:a */ Xi 3 20 /* Forcerad vinst */ Xj 4 30 /* 5:a */ X X.abX. X.bXb. X.Xba. X X.cdXX X.cXdX XcdXXd X.XccX XcXdXc XdXXdc XXccX. XXdXc. XXXdc. X X.efXXd X.eXfXc X.fXXfc X.XeeX. X.XfXe. X.XXfe. X XghXXX XgXhXX XgXXhX XhXXXh XXhXXg XXXhXg XXXXhg X X.iXXXh X.XiXXg X.XXiXg X.XXXig X XX..XXd XX.iXXhX XX.X.Xd XX.XiXgX XX.XX.d XX.XXigX X XXX.cXdX XXX.iXhXX XXX.XccX XXX.XigXX X XXXX..dXX XXXX.ihXXX X XjXXXX XXjXXX XXXjXX XXXXjX XXXXXj + END-OF-FILE tabell chmod 'u=r,g=r,o=r' 'tabell' echo ' -r--r--r-- 1 roland 620 Oct 18 09:51 tabell (as sent)' echo -n ' ' /bin/ls -l tabell echo 'Extracting terminal.c' sed 's/^X//' > terminal.c << '+ END-OF-FILE terminal.c' X# include "def.h" X X/* Routines using termcap for positioning */ X X# include <sgtty.h> Xstruct sgttyb argp; Xchar ospeed; X Xextern putchar(); X Xchar *BC; /* Backspace if not ^H */ Xchar *UP; /* Up one line */ Xchar *HO; /* Home */ Xchar *CD; /* Clear from cursor */ Xchar *CM; /* cursor motions */ Xchar tcbuf[1024]; /* Buffert for initialising capabilities */ Xchar cp[256]; /* Buffert for storing capabilities */ X X/* Initialising the string containing terminal depending functions */ X Xgetcap(term) Xchar *term; X{ X char *pc; X char *tgetstr(); X X gtty(0, &argp); X ospeed = argp.sg_ospeed; X X switch (tgetent(tcbuf, term)) { X case -1: X case 0: X return -1; X } X pc = cp; X BC = tgetstr("bc", &pc); X if (BC == 0) X BC = "\b"; X UP = tgetstr("up", &pc); X HO = tgetstr("ho", &pc); X CD = tgetstr("cd", &pc); X CM = tgetstr("cm", &pc); X X width = tgetnum("co"); X height = tgetnum("li"); X X return 0; X} X X X/* positions on the screen. Origin in the left upper corner. */ Xpos(x, y) int x, y;{ X if((x > -2) && (x < 39) && (y > -2) && (y < 22)){ X x = 3 + x + x; X y = 1 + y; X tputs( tgoto(CM, x, y), 1, putchar); X } X else X printf("Out of board %d %d", x, y); X} X X/* Cursor up one line */ Xup(){ X tputs(UP, 1, putchar); X} X X/* Clears screen from cursor */ Xclear(){ X tputs(CD, 1, putchar); X} X X/* Cursor home */ Xhome(){ X tputs(HO, 1, putchar); X} X + END-OF-FILE terminal.c chmod 'u=r,g=r,o=r' 'terminal.c' echo ' -r--r--r-- 1 roland 1370 Jan 29 1985 terminal.c (as sent)' echo -n ' ' /bin/ls -l terminal.c echo 'Extracting upd.c' sed 's/^X//' > upd.c << '+ END-OF-FILE upd.c' X# include "def.h" X X/* Administrate the updating of point and threat boards */ Xupdate(x, y) int x, y;{ X register int i, way; X short int xx, yy, step, j; X char who; X LOGIC xflag, oflag, blankflag, stopflag, win; X X win = FALSE; X who = board[x][y]; X catch(x, y); X autom(); X if(who != ' '){ X if((who == 'o') && (threat[0][x][y] == 4)) X win = TRUE; X if((who == 'x') && (threat[1][x][y] == 4)) X win = TRUE; X thtcnt[0][threat[0][x][y]] -= 1; X threat[0][x][y] = 0; X thtcnt[1][threat[1][x][y]] -= 1; X threat[1][x][y] = 0; X } X else{ X for(way = 0; way < 4; way++){ X p_hvlr[way][x][y] = tmppts[way][0][8] + tmppts[way][1][8]; X t_hvlr[way][0][x][y] = tmptht[way][0][8]; X t_hvlr[way][1][x][y] = tmptht[way][1][8]; X } X point[x][y] = p_hvlr[0][x][y] + p_hvlr[1][x][y] + X p_hvlr[2][x][y] + p_hvlr[3][x][y]; X if( t_hvlr[0][0][x][y] | t_hvlr[1][0][x][y] | X t_hvlr[2][0][x][y] | t_hvlr[3][0][x][y] ) X updtht('o', x, y); X else{ X thtcnt[0][threat[0][x][y]] -= 1; X threat[0][x][y] = 0; X } X if( t_hvlr[0][1][x][y] | t_hvlr[1][1][x][y] | X t_hvlr[2][1][x][y] | t_hvlr[3][1][x][y] ) X updtht('x', x, y); X else{ X thtcnt[1][threat[1][x][y]] -= 1; X threat[1][x][y] = 0; X } X } X for(way = 0; way < 4; way++){ X for(step = -1; step <= 1; step += 2){ X xflag = oflag = blankflag = stopflag = FALSE; X i = 8; X for(j = 0; j < 4; j++){ X i += step; X if(blankflag == 2) X break; X switch(hvlr[way][i]){ X case ' ': X blankflag++; X break; X case 'o': X oflag = TRUE; X blankflag = FALSE; X break; X case 'x': X xflag = TRUE; X blankflag = FALSE; X break; X case 'z': X stopflag = TRUE; X break; X } X if(stopflag) X break; X if(!blankflag) X continue; X switch(way){ X case 0: X xx = x + i - 8; X yy = y; X break; X case 1: X xx = x; X yy = y + i - 8; X break; X case 2: X xx = x + i - 8; X yy = y + i - 8; X break; X case 3: X xx = x + i - 8; X yy = y - i + 8; X break; X } X p_hvlr[way][xx][yy] = tmppts[way][0][i] + tmppts[way][1][i]; X point[xx][yy] = p_hvlr[0][xx][yy] + p_hvlr[1][xx][yy] + X p_hvlr[2][xx][yy] + p_hvlr[3][xx][yy]; X if(!xflag){ X t_hvlr[way][0][xx][yy] = tmptht[way][0][i]; X if( t_hvlr[0][0][xx][yy] | t_hvlr[1][0][xx][yy] | X t_hvlr[2][0][xx][yy] | t_hvlr[3][0][xx][yy] ) X updtht('o', xx, yy); X else{ X thtcnt[0][threat[0][xx][yy]] -= 1; X threat[0][xx][yy] = 0; X } X } X if(!oflag){ X t_hvlr[way][1][xx][yy] = tmptht[way][1][i]; X if( t_hvlr[0][1][xx][yy] | t_hvlr[1][1][xx][yy] | X t_hvlr[2][1][xx][yy] | t_hvlr[3][1][xx][yy] ) X updtht('x', xx, yy); X else{ X thtcnt[1][threat[1][xx][yy]] -= 1; X threat[1][xx][yy] = 0; X } X } X } X } X } X return(win); X} X + END-OF-FILE upd.c chmod 'u=r,g=r,o=r' 'upd.c' echo ' -r--r--r-- 1 roland 2771 Feb 7 1985 upd.c (as sent)' echo -n ' ' /bin/ls -l upd.c echo 'Extracting updtht.c' sed 's/^X//' > updtht.c << '+ END-OF-FILE updtht.c' X# include "def.h" X X/* Updates the threat board */ Xupdtht(who, x, y) char who; int x, y;{ X short int t[5]; X register int i; X X for(i = 0; i < 5; i++) X t[i] = 0; X X if(who == 'x') X who = 1; X else X who = 0; X X for(i = 0; i < 4; i++) /* Count threats in the four ways */ X t[t_hvlr[i][who][x][y]] += 1; X X thtcnt[who][threat[who][x][y]] -= 1; X threat[who][x][y] = 0; X X if(( t[1]) /* 3 */ X || (t[2])) /* stopped 4 */ X threat[who][x][y] = 1; X X if(t[1] > 1) /* 3-3-combination */ X threat[who][x][y] = 2; X X if(((t[2] > 0) && (t[1] > 0)) /* 4-3-combination */ X || (t[2] > 1) /* 4-4-combination */ X || (t[3] > 0)) /* Free 4 */ X threat[who][x][y] = 3; X X if(t[4] > 0) /* 5 = win */ X threat[who][x][y] = 4; X X thtcnt[who][threat[who][x][y]] += 1; X} + END-OF-FILE updtht.c chmod 'u=r,g=r,o=r' 'updtht.c' echo ' -r--r--r-- 1 roland 870 Feb 7 1985 updtht.c (as sent)' echo -n ' ' /bin/ls -l updtht.c echo 'Extracting utboard.c' sed 's/^X//' > utboard.c << '+ END-OF-FILE utboard.c' X# include "def.h" X X/* Prints out an image of th board with or without points */ Xutboard(p) char p[XZIZE][YZIZE];{ X register int x, y; X X home(); clear(); X printf(" "); X for(x = 0; x < XZIZE; x++) X printf(" %c", 'a' + x); X putchar('\n'); X for(y = 0; y < YZIZE; y++){ X printf("%2d", y); X for(x = 0; x < XZIZE; x++){ X if(board[x][y] == ' ') X if(p && p[x][y]) X if(p[x][y] > 077) X printf(" >"); X else X printf("%2o", p[x][y]); X else{ X putchar(' '); X putchar('.'); X } X else{ X putchar(' '); X putchar(board[x][y]); X } X } X printf(" %2d\n", y); X } X printf(" "); X for(x = 0; x < XZIZE; x++) X printf(" %c", 'a' + x); X pos(XZIZE + 2, 0); printf("Luff7.1"); X pos(XZIZE + 2, 1); printf("6/4 1982"); X} + END-OF-FILE utboard.c chmod 'u=r,g=r,o=r' 'utboard.c' echo ' -r--r--r-- 1 roland 739 Jan 29 1985 utboard.c (as sent)' echo -n ' ' /bin/ls -l utboard.c exit 0