Okay, so I’ve been going on and on about making picoEngine think through multiple ply, and it really has been a challenge. I think this latest commit finally fixed it with the ability to think through up to 8 ply. That might seem like a lot, but the grandmaster level chess player is thinking through 16 ply.
A ply, for those who are wondering, is a move, so 8 ply is 4 complete turns of 8 moves. I’m certainly no grandmaster, but I’ve been beating this thing at 8 ply like it’s nobody’s business, so, despite thinking deep, it is not thinking well.
Either way, be sure to check out the commit, as I completely rewrote the ply thought process today. Here is some highlights with notes:
string makeMoves (string proposedMove, string boardPositions){ string boardReturned = boardPositions; try{ int first =((proposedMove.at(0) - 'a' + 1) + (((proposedMove.at(1) - '1') * 8) - 1)); int second =((proposedMove.at(2) - 'a' + 1) + (((proposedMove.at(3) - '1') * 8) - 1)); boardPositions[second] = boardPositions[first]; boardPositions[first] = '-'; boardReturned = boardPositions; } catch (...) { cout << " Exception " << endl; } // End try/catch block return boardReturned; }
The above code allows the engine to use the board and make a move with it.
playBoard = makeMoves(proposedMove, originalBoard); currentEval = evaluations.getEval(playBoard); cout << " current eval and ply " << currentEval << " " << plyMoves << endl; if (whoseTurn) { if (currentEval > 9000) {cout << " ply ends 10000." << endl; chosenMove = proposedMove; return chosenMove; }} else { if (currentEval < -9000) {cout << " ply ends -10000." << endl; chosenMove = proposedMove; return chosenMove; }} if (plyMoves-1 < 1){ cout << " ply ends 1." << endl; if (whoseTurn){ // White's turn, higher is better. if ( currentEval > bestEval ) { chosenMove = proposedMove; bestEval = currentEval; cout <<"info depth " << plyMoves << " score cp "<< currentEval << " pv " << chosenMove << endl; //<< " comment " << boardPositions } else if ( currentEval == bestEval && (int)time(0)%2 == 0) { chosenMove = proposedMove; bestEval = currentEval; cout <<"info depth " << plyMoves << " score cp "<< currentEval << " pv " << chosenMove << endl; //<< " comment " << boardPositions } }
Here we see the general concept. We look at each available move, we determine the evaluation of that board after the move, we check if that is better or worse than what we had previously. With the weighted system, the “best” move wins.
The shortcomings I’ve seen while playing against picoEngine is probably related to poor evaluation criteria. It can only gauge the moves based on two things right now: movement and material. Hopefully I can get it smarter.
I did test it out, and it will checkmate itself if you have it play against itself in Arena. So that is good, it knows *how* to win, even if it is not very good at it.
Linux – keep it simple.