#include <ctype.h> #include <stdio.h> #include "graphics.h" #include "globals.h" #include "trie.h" int dx[10] = {0,-1,0,1,-1,0,1,-1,0,1}; int dy[10] = {0,1,1,1,0,0,0,-1,-1,-1}; int redrawflag = 1, computermoveflag = 0, gameover = 0; char state = 0; #define GO (computermoving=computermoveflag=1) #undef CTRL #define CTRL(n) ((n)&31) void command(void) { char c; int i, j; static int nextcom = '~'; static int nextmovech = '.'; redrawflag = 1; /* Get a command char and clear out lines with temporary messages */ /* c = getch ();*/ c = nextcom; if (nextcom == '~') { nextcom = nextmovech;} else { nextcom = '~';} clearline (ERRORLINE); clearline (MSGLINE); if (computermoveflag) { computermoveflag = 0; zapmove(); } if (state == '#') { state = 0; if (!isalpha (c)) beep (); else { c = chr (c) | BLANKBIT; afill[cursory][cursorx] = NEWBIT | c; dfill[cursorx][cursory] = NEWBIT | c; yourrack[BLANK]--; /* position (cursory, cursorx); standout (); placeletter (c); standend (); */ } } else switch (isupper(c)?tolower (c):c) { /* Deal with command char */ case '7': case '8': case '9': /* Cursor motion */ case '4': case '6': case '1': case '2': case '3': cursorx += dx[c - '0']; cursory += dy[c - '0']; redrawflag = 0; break; case CTRL('B'): cursorx--; break; case CTRL('F'): cursorx++; break; case CTRL('P'): cursory--; break; case CTRL('N'): cursory++; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': c = chr (c); if (!afill[cursory][cursorx]) if (yourrack[c]) { afill[cursory][cursorx] = NEWBIT | c; dfill[cursorx][cursory] = NEWBIT | c; yourrack[c]--; /* position (cursory, cursorx); standout (); placeletter (c); standend (); */ } else if (yourrack[BLANK]) { c = chr (c) | BLANKBIT; afill[cursory][cursorx] = NEWBIT | c; dfill[cursorx][cursory] = NEWBIT | c; yourrack[BLANK]--; /* tell("(Using your blank)"); position (cursory, cursorx); standout (); placeletter (c); standend (); */ } else beep(); else beep (); break; case '#': if (yourrack[BLANK] && !afill[cursory][cursorx]) { state = '#'; tell ("Now type the letter you want the blank to be."); } else beep (); break; case ' ': if (afill[cursory][cursorx] & NEWBIT) { c = afill[cursory][cursorx] ^ NEWBIT; if (c & BLANKBIT) c = BLANK; yourrack[c]++; afill[cursory][cursorx] = 0; dfill[cursorx][cursory] = 0; position (cursory, cursorx); removeletter (); } else beep (); break; case '?': /* Give new help */ givehelp(); break; case '.': /* Make a move */ if (humanmove (0)) GO; break; case '~': /* Suggest a Move */ for (i = 1; i < 16; i++) for (j = 1; j < 16; j++) if (afill[i][j] & NEWBIT) { c = afill[i][j] ^ NEWBIT; if (c & BLANKBIT) c = BLANK; yourrack[c]++; afill[i][j] = 0; dfill[j][i] = 0; position (i, j); removeletter (); } if (suggestmove()) { nextmovech = '.'; } else { nextmovech = '='; } break; case ':': if (humanmove (1)) { mvprintw (23, 61, "THIS GAME IS BOGUS"); GO; } break; case '-': /* exchange tiles */ consecutivepasses = 0; if (exchange ()) GO; break; case '=': /* pass */ for (i = 1; i < 16; i++) for (j = 1; j < 16; j++) if (afill[i][j] & NEWBIT) c = 0; if (c) { GO; consecutivepasses++; } else errortell ("Get your tiles off the board before you pass."); break; case CTRL('C'): case '\177': case '+': quit (); break; case CTRL('Z'): /*tstp ();*/ break; case CTRL('L'): /* wrefresh (curscr);*/ redrawflag = 0; break; default: break; } if (redrawflag) showstuff (); /* Remap cursor position into legal range and update the screen */ cursorx = (cursorx + LEN - 1) % LEN + 1; cursory = (cursory + LEN - 1) % LEN + 1; /* position (cursory, cursorx); refresh (); */ } void think(void); void initcommand(void) { cursorx = cursory = 8; position (cursory, cursorx); showstuff (); /* refresh (); */ think (); endgame (); quit (); } void think(void) { /* change this to execute only one move, printboard in .dat format, and exit */ computermove (); showstuff (); }