/*************************************************************************** * _ _ * * /_\ Chess Board /_\ * * \_/ ------------------- \_/ * * /_\ Cboard /_\ * * |_| ------------------- |_| * * /___\ GNU GPL Version 2 /___\ * * * ***************************************************************************/ /* Header Files */ #include "board.h" /* Secure */ #define TIME /* Window */ static WINDOW *winA; static WINDOW *winB; static WINDOW *winX; static WINDOW *winY; /*---------------------------------------------------------------------------*/ /* Class Move */ struct uciMove { char fxdec, fydec, txdec, tydec; int fxm, txm, fym, tym, tzm; }mov1, mov8; /* Class Engine */ struct uciEngine { /* Clock */ double diff; int time, horas, minutes, seconds; time_t start, stop; }etime, wtime, btime; /*---------------------------------------------------------------------------*/ /* Dispaly Chess Board */ void displayBoard(char *chess, socket_t tcpsock0, socket_t tcpsock2) { int count; float DUMP; char nmove[MOV]; char player[H]; /* Chess Board Array */ char cb[H][A][2] = { {{' ',7},{'1',7},{'2',7},{'3',7},{'4',7},{'5',7},{'6',7},{'7',7},{'8',7},{' ',7},{0,0}}, {{'h',7},{'R',4},{'P',5},{' ',4},{' ',5},{' ',1},{' ',2},{'P',1},{'R',2},{'h',7},{0,0}}, {{'g',7},{'N',5},{'P',4},{' ',5},{' ',4},{' ',2},{' ',1},{'P',2},{'N',1},{'g',7},{0,0}}, {{'f',7},{'B',4},{'P',5},{' ',4},{' ',5},{' ',1},{' ',2},{'P',1},{'B',2},{'f',7},{0,0}}, {{'e',7},{'K',5},{'P',4},{' ',5},{' ',4},{' ',2},{' ',1},{'P',2},{'K',1},{'e',7},{0,0}}, {{'d',7},{'Q',4},{'P',5},{' ',4},{' ',5},{' ',1},{' ',2},{'P',1},{'Q',2},{'d',7},{0,0}}, {{'c',7},{'B',5},{'P',4},{' ',5},{' ',4},{' ',2},{' ',1},{'P',2},{'B',1},{'c',7},{0,0}}, {{'b',7},{'N',4},{'P',5},{' ',4},{' ',5},{' ',1},{' ',2},{'P',1},{'N',2},{'b',7},{0,0}}, {{'a',7},{'R',5},{'P',4},{' ',5},{' ',4},{' ',2},{' ',1},{'P',2},{'R',1},{'a',7},{0,0}}, {{' ',7},{'1',7},{'2',7},{'3',7},{'4',7},{'5',7},{'6',7},{'7',7},{'8',7},{' ',7},{0,0}}}; /*-------------------------------------------------------------------*/ /* Chess Board Array */ char eb[H][A][2] = { {{' ',7},{'8',7},{'7',7},{'6',7},{'5',7},{'4',7},{'3',7},{'2',7},{'1',7},{' ',7},{0,0}}, {{'a',7},{' ',1},{' ',2},{' ',1},{' ',2},{' ',4},{' ',5},{' ',4},{' ',5},{'a',7},{0,0}}, {{'b',7},{' ',2},{' ',1},{' ',2},{' ',1},{' ',5},{' ',4},{' ',5},{' ',4},{'b',7},{0,0}}, {{'c',7},{' ',1},{' ',2},{' ',1},{' ',2},{' ',4},{' ',5},{' ',4},{' ',5},{'c',7},{0,0}}, {{'d',7},{' ',2},{' ',1},{' ',2},{' ',1},{' ',5},{' ',4},{' ',5},{' ',4},{'d',7},{0,0}}, {{'e',7},{' ',1},{' ',2},{' ',1},{' ',2},{' ',4},{' ',5},{' ',4},{' ',5},{'e',7},{0,0}}, {{'f',7},{' ',2},{' ',1},{' ',2},{' ',1},{' ',5},{' ',4},{' ',5},{' ',4},{'f',7},{0,0}}, {{'g',7},{' ',1},{' ',2},{' ',1},{' ',2},{' ',4},{' ',5},{' ',4},{' ',5},{'g',7},{0,0}}, {{'h',7},{' ',2},{' ',1},{' ',2},{' ',1},{' ',5},{' ',4},{' ',5},{' ',4},{'h',7},{0,0}}, {{' ',7},{'8',7},{'7',7},{'6',7},{'5',7},{'4',7},{'3',7},{'2',7},{'1',7},{' ',7},{0,0}}}; /*-------------------------------------------------------------------*/ /* Black */ eb[8][1][0] = 'R'; eb[7][1][0] = 'N'; eb[6][1][0] = 'B'; eb[5][1][0] = 'K'; eb[4][1][0] = 'Q'; eb[3][1][0] = 'B'; eb[2][1][0] = 'N'; eb[1][1][0] = 'R'; eb[8][2][0] = 'P'; eb[7][2][0] = 'P'; eb[6][2][0] = 'P'; eb[5][2][0] = 'P'; eb[4][2][0] = 'P'; eb[3][2][0] = 'P'; eb[2][2][0] = 'P'; eb[1][2][0] = 'P'; /* White */ eb[8][7][0] = 'P'; eb[7][7][0] = 'P'; eb[6][7][0] = 'P'; eb[5][7][0] = 'P'; eb[4][7][0] = 'P'; eb[3][7][0] = 'P'; eb[2][7][0] = 'P'; eb[1][7][0] = 'P'; eb[8][8][0] = 'R'; eb[7][8][0] = 'N'; eb[6][8][0] = 'B'; eb[5][8][0] = 'K'; eb[4][8][0] = 'Q'; eb[3][8][0] = 'B'; eb[2][8][0] = 'N'; eb[1][8][0] = 'R'; /*-------------------------------------------------------------------*/ /* Time */ wtime.time = 7200; btime.time = 7200; /* Count */ count = 32; DUMP = 2.50; clear(); /* Window */ winA = newwin(15,80,0,0); winX = newwin(12,33,2,3); winY = newwin(12,33,2,45); winB = newwin(10,80,15,0); /*-------------------------------------------------------------------*/ /* While Loop */ while(chess) { /* Chess Core */ int x = 0; int y = 0; int Z1 = 0; int Z2 = 0; /* Colors */ colorBoard(chess); box(winA,ACS_VLINE,ACS_HLINE); /*box(winX,ACS_VLINE,ACS_HLINE);*/ /*box(winY,ACS_VLINE,ACS_HLINE);*/ box(winB,ACS_VLINE,ACS_HLINE); wbkgd(winA,COLOR_PAIR(8)); wbkgd(winB,COLOR_PAIR(9)); /* Chess Board */ wmove(winX,0,1); for(y = 0; y <= HIGH; ++y) { wmove(winX,++Z1,1); for(x = 0; x <= LOW; ++x) { wattrset(winX,A_BOLD|COLOR_PAIR(eb[x][y][1])); wprintw(winX," %c ", eb[x][y][0]); } wprintw(winX,"\n"); } /* Bughouse */ wmove(winY,0,1); for(y = 0; y <= HIGH; ++y) { wmove(winY,++Z2,1); for(x = 0; x <= LOW; ++x) { wattrset(winY,A_BOLD|COLOR_PAIR(cb[x][y][1])); wprintw(winY," %c ", cb[x][y][0]); } wprintw(winY,"\n"); } /*-----------------------------------------------------------*/ /* Player */ count++; if(count % 2) { player[1] = TRUE; player[8] = FALSE; } else { player[1] = FALSE; player[8] = TRUE; } /*-----------------------------------------------------------*/ /* Refresh */ refresh(); wrefresh(winA); wrefresh(winX); wrefresh(winY); wrefresh(winB); /* Time Control */ /*attrset(use_default_colors());*/ attrset(A_NORMAL | COLOR_PAIR(8)); etime.start=time(NULL); cbnetwork(nmove,chess,player,tcpsock0,tcpsock2); etime.diff = difftime(etime.stop=time(NULL),etime.start); /*-----------------------------------------------------------*/ /* a - h | 1 - 8 */ if((nmove[0] && nmove[2] >= 97) && (nmove[0] && nmove[2] <= 104) && (nmove[1] && nmove[3] >= 49) && (nmove[1] && nmove[3] <= 56)) { mov1.fxdec = mov8.fxdec = nmove[0]; mov1.fydec = mov8.fydec = nmove[1]; mov1.txdec = mov8.txdec = nmove[2]; mov1.tydec = mov8.tydec = nmove[3]; } else { /* Back to Menu */ chess = 0; } /*-----------------------------------------------------------*/ /* Board Color */ if((DUMP < 2.50) && (mov1.tzm % 2)) { /* White Cyan */ if(player[1]) { eb[mov1.txm][mov1.tym][1] = 2; cb[mov8.txm][mov8.tym][1] = 2; } /* Red Cyan */ else if(player[8]) { eb[mov1.txm][mov1.tym][1] = 5; cb[mov8.txm][mov8.tym][1] = 5; } } else if(DUMP < 2.50) { /* White Blue */ if(player[1]) { eb[mov1.txm][mov1.tym][1] = 1; cb[mov8.txm][mov8.tym][1] = 1; } /* Red Blue */ else if(player[8]) { eb[mov1.txm][mov1.tym][1] = 4; cb[mov8.txm][mov8.tym][1] = 4; } } DUMP -= 0.01; /*-----------------------------------------------------------*/ /* Decimal White Board */ mov1.fxm = mov1.fxdec - 96; mov1.txm = mov1.txdec - 96; mov1.fym = 9 - (mov1.fydec - 48); mov1.tym = 9 - (mov1.tydec - 48); eb[mov1.txm][mov1.tym][0] = eb[mov1.fxm][mov1.fym][0]; eb[mov1.fxm][mov1.fym][0] = ' '; eb[mov1.txm][mov1.tym][1] = eb[mov1.fxm][mov1.fym][1]; /* Board Color */ mov1.tzm = mov1.txm + mov1.tym; /* Decimal Black Board */ mov8.fxm = 9 - (mov8.fxdec - 96); mov8.txm = 9 - (mov8.txdec - 96); mov8.fym = mov8.fydec - 48; mov8.tym = mov8.tydec - 48; cb[mov8.txm][mov8.tym][0] = cb[mov8.fxm][mov8.fym][0]; cb[mov8.fxm][mov8.fym][0] = ' '; cb[mov8.txm][mov8.tym][1] = cb[mov8.fxm][mov8.fym][1]; /*-----------------------------------------------------------*/ /* White Green */ if(player[1]) { eb[mov1.txm][mov1.tym][1] = 6; cb[mov8.txm][mov8.tym][1] = 6; /* Chess Clock */ wtime.time -= etime.diff; } /* Red Green */ else if(player[8]) { eb[mov1.txm][mov1.tym][1] = 3; cb[mov8.txm][mov8.tym][1] = 3; /* Chess Clock */ btime.time -= etime.diff; } /*-----------------------------------------------------------*/ #ifdef TIME /* Time Claculation */ wtime.horas = ((wtime.time / 60) / 60); wtime.minutes = ((wtime.time / 60) % 60); wtime.seconds = (wtime.time % 60); btime.horas = ((btime.time / 60) / 60); btime.minutes = ((btime.time / 60) % 60); btime.seconds = (btime.time % 60); /* Time Message */ wmove(winA,1,2); wprintw(winA," %02d:%02d:%02d",wtime.horas,wtime.minutes,wtime.seconds); wprintw(winA,"\t\t %02d:%02d:%02d",btime.horas,btime.minutes,btime.seconds); /* Move Message */ wmove(winA,1,46); wprintw(winA,"%c%c",mov1.fxdec,mov1.fydec); wprintw(winA,"/%c%c",mov1.txdec,mov1.tydec); #endif } clear(); } /*---------------------------------------------------------------------------*/ /* Network / send() / recv() */ void cbnetwork(char *nmove,char *chess, char *player, socket_t tcpsock0, socket_t tcpsock2) { /* White vs Engine */ if(chess[1]) { wengine(nmove,player); } /* Black vs Engine */ else if(chess[2]) { bengine(nmove,player); } /* White and Black */ else if(chess[3]) { normal(nmove,player); } /* Server */ else if(chess[4]) { server(nmove,player,tcpsock2); } /* Client */ else if(chess[5]) { client(nmove,player,tcpsock0); } } /*---------------------------------------------------------------------------*/ /* White vs Engine */ void wengine(char *nmove,char *player) { if(player[1]) { mvprintw(4,37,"White:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); } else if(player[8]) { sort(nmove, player); } } /*---------------------------------------------------------------------------*/ /* Black vs Engine */ void bengine(char *nmove,char *player) { if(player[1]) { sort(nmove, player); } else if(player[8]) { mvprintw(4,37,"Black:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); } } /*---------------------------------------------------------------------------*/ /* White and Black */ void normal(char *nmove,char *player) { if(player[1]) { mvprintw(4,37,"White:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); } else if(player[8]) { mvprintw(4,37,"Black:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); } } /*---------------------------------------------------------------------------*/ /* Server */ void server(char *nmove, char *player, socket_t tcpsock2) { if(player[1]) { mvprintw(4,37,"White:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); net_send(&tcpsock2 ,nmove, MOV); } else if(player[8]) { net_recv(&tcpsock2 ,nmove, MOV); } } /*---------------------------------------------------------------------------*/ /* Client */ void client(char *nmove, char *player, socket_t tcpsock0) { if(player[1]) { net_recv(&tcpsock0, nmove, MOV); } else if(player[8]) { mvprintw(4,37,"Black:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); net_send(&tcpsock0, nmove, MOV); } } /*---------------------------------------------------------------------------*/