/*************************************************************************** * _ _ * * /_\ Chess Board /_\ * * \_/ ------------------- \_/ * * /_\ Cboard /_\ * * |_| ------------------- |_| * * /___\ GNU GPL Version 2 /___\ * * * ***************************************************************************/ /* Header Files */ #include "board.h" /* Secure */ #define TIME /* Defintions */ Set setb; Game game; /* Constructor */ Cboard::Cboard() {} /* Window */ static WINDOW *winA; static WINDOW *winB; static WINDOW *winX; static WINDOW *winY; //----------------------------------------------------------------------------- /* Display Chess Board */ void Cboard::displayBoard(char *chess, Network network0, Network network2) { 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 */ setb.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); Cboard::cbnetwork(nmove,chess,player,network0,network2); 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 Cboard::cbnetwork(char *nmove,char *chess, char *player, Network network0, Network network2) { /* White vs Engine */ if(chess[1]) { Cboard::wengine(nmove,player); } /* Black vs Engine */ else if(chess[2]) { Cboard::bengine(nmove,player); } /* White and Black */ else if(chess[3]) { Cboard::normal(nmove,player); } /* Server */ else if(chess[4]) { Cboard::server(nmove,player,network2); } /* Client */ else if(chess[5]) { Cboard::client(nmove,player,network0); } } //--------------------------------------------------------------------------- /* White vs Engine */ void Cboard::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]) { game.sort(nmove, player); } } //--------------------------------------------------------------------------- /* Black vs Engine */ void Cboard::bengine(char *nmove,char *player) { if(player[1]) { game.sort(nmove, player); } else if(player[8]) { mvprintw(4,37,"Black:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); } } //--------------------------------------------------------------------------- /* White and Black */ void Cboard::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 Cboard::server(char *nmove, char *player, Network network2) { if(player[1]) { mvprintw(4,37,"White:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); network2.send(nmove, MOV); } else if(player[8]) { network2.recv(nmove, MOV); } } //--------------------------------------------------------------------------- /* Client */ void Cboard::client(char *nmove, char *player, Network network0) { if(player[1]) { network0.recv(nmove, MOV); } else if(player[8]) { mvprintw(4,37,"Black:"); mvprintw(5,37,"------"); mvprintw(6,37," "); getnstr(nmove, MOV); network0.send(nmove, MOV); } } //---------------------------------------------------------------------------