bool cancastleshort() { if (wturn == 1 && kwmov == 1) return 0; else if (wturn == 0 && kbmov == 1) return 0; else if (wturn == 1 && isbetween(map[7][7], map[7][4]) == 0 && board[7][7] == "Rw" && wkrookmov == 0){ int x; for (x = 4; x < 7; x++) { if (checkcheck(7, x) == 1) return 0; } return 1; } else if (wturn == 0 && isbetween(map[0][7], map[0][4]) == 0 && board[0][7] == "Rb" && bkrookmov == 0){ int x; for (x = 4; x < 7; x++) { if (checkcheck(0, x) == 1) return 0; } return 1; } }
int kingmoves() { int i, j; int kingx = kingfinder(0); int kingy = kingfinder(1); int count = 0; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { char* square = board[i][j]; char status = square[1]; if (wturn == 1 && arraydistance(map[kingx][kingy], map[i][j]) == 1 && status != 'w' && checkcheck(i, j) == 0) { movearray[count] = map[i][j]; count++; } else if (wturn == 0 && arraydistance(map[kingx][kingy], map[i][j]) == 1 && status != 'b' && checkcheck(i, j) == 0) { movearray[count] = map[i][j]; count++; } } } return count; }
bool testallmoves() { char testlist[13] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'K', 'Q', 'R', 'N', 'B'}; int i, j, x; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { for (x = 0; x < 13; x++) { char* sqr = map[i][j]; if (x > 7) { char tst[4]; tst[0] = testlist[x]; tst[1] = sqr[0]; tst[2] = sqr[1]; tst[3] = '\0'; char* boardchk[8][8]; memcpy(boardchk, board, sizeof(board)); turn(tst); if (checkcheck(-1, -1) == 0) { memcpy(board, boardchk, sizeof(board)); return 1; } memcpy(board, boardchk, sizeof(board)); } else { char tst[3]; tst[0] = sqr[0]; tst[1] = sqr[1]; tst[2] = '\0'; char* boardchk[8][8]; memcpy(boardchk, board, sizeof(board)); turn(tst); if (checkcheck(-1, -1) == 0) { memcpy(board, boardchk, sizeof(board)); return 1; } memcpy(board, boardchk, sizeof(board)); } } } } return 0; }
bool caneat() { char testlist[13] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'K', 'Q', 'R', 'N', 'B'}; char* sqr = prevsquare; int i; for (i = 0; i < 13; i++) { char tst[5]; tst[0] = testlist[i]; tst[1] = 'x'; tst[2] = prevsquare[0]; tst[3] = prevsquare[1]; tst[4] = '\0'; char *boardchk[8][8]; memcpy(boardchk, board, sizeof(board)); turn(tst); if (memcmp(board, boardchk, sizeof(board)) != 0 && checkcheck(-1, -1) == 0) { memcpy(board, boardchk, sizeof(board)); return 1; } memcpy(board, boardchk, sizeof(board)); } return 0; }
void FstopComms::respondWrite() { if(!checkcheck()) return; unsigned int addr=getAddr(); char len=cmd[PKT_LEN]; if(len < 1 || len > PKT_MAXREQ || addr < EEPROM_MIN_WRITE || addr+len > EEPROM_MAX_WRITE){ nak(BAD_WRITE); return; } // copy from buffer to EEPROM char bp=PKT_SHORTHDR; for(char i=0;i<len;++i){ EEPROM.write(addr++, cmd[bp++]); } cmd[PKT_CMD]=COM_WRITEACK; buflen=PKT_SHORTHDR; // recompute checksum, send without data txCmd(); }
bool checkmate() { if (checkcheck(-1,-1) == 1 && caneat() == 0 && testallmoves() == 0) return 1; else return 0; }
bool cancastlelong() { if (wturn == 1 && kwmov == 1) return 0; else if (wturn == 0 && kbmov == 1) return 0; else if (wturn == 1 && isbetween(map[7][0], map[7][4]) == 0 && board[7][0] == "Rw" && wqrookmov == 0){ int j; for (j = 1; j < 4; j++) { if (checkcheck(7, j) == 1) return 0; } return 1; } else if (wturn == 0 && isbetween(map[0][0], map[0][4]) == 0 && board[0][0] == "Rb" && bqrookmov == 0){ int j; for (j = 1; j < 4; j++) { if (checkcheck(0, j) == 1) return 0; } return 1; } else return 0; }
void pturn() { while (true) { if (checkmate() == 1) { printf("Checkmate!"); break; } if (checkcheck(-1, -1)) printf("Check!\n"); char *boardchk[8][8]; memcpy(boardchk, board, sizeof(board)); boardprint(); char move[10]; printf("Please type a move in standard chess notation: "); scanf("%s", move); turn(move); if (checkcheck(-1, -1)) { memcpy(board, boardchk, sizeof(board)); printf("Can not move into check!\n"); } if (memcmp(board, boardchk, sizeof(board)) != 0) (wturn == 1) ? (wturn = 0) : (wturn = 1); } }
void FstopComms::respondRead() { if(!checkcheck()) return; unsigned int addr=getAddr(); char len=cmd[PKT_LEN]; if(len < 1 || len > PKT_MAXREQ || addr < EEPROM_MIN_READ || addr+len > EEPROM_MAX_READ){ nak(BAD_READ); return; } // read from EEPROM into buffer cmd[PKT_CMD]=COM_READACK; for(char i=0;i<len;++i){ cmd[i+PKT_SHORTHDR]=EEPROM.read(addr++); } buflen=len+PKT_SHORTHDR; // append checksum and send. txCmd(); }