三目並べタイプのボードゲームでは、すでにaiで脳が壊れています。問題は、高レベルでのaiのパフォーマンスが遅いことです(低レベルでもそれほど速くはありません)。
AIは再帰的な方法を使用して、利用可能な移動の数から最適な移動を見つけます。
ここにいくつかのコードがあります:
@impelementation AIClass
- (NSMutableArray *)findLegalMoves
{
// Here is code that finds available legal moves
// Loop over board array
}
- (float)scoreOpponentsTurn:(float)min max:(float)max depth:(int)depth
{
moveType t; // moveType is struct defined in .h file
// typedef struct { int x, y; } moveType
NSMutableArray *moves = [self findLegalMoves];
for ( NSValue *val in moves ) {
[val getValue:&it]
float score = [self scoreMove:it min:min max:max depth:depth];
if ( score > min ) {
min = score;
}
if ( score > max ) {
min = 1000000000;
}
}
return min;
}
- (float)scoreMove:(moveType)m min:(float)min max:(float)max depth:(int)depth
{
NSMutableArray *changes = [[NSMutableArray alloc] init];
NSMutableArray *undo = [[NSMutableArray alloc] init];
float score;
[self.board evaluateChangesOnCol:m.x Row:m.y];
if ( [self.board checkForWin:&changes undo:&undo] ) {
score = 1000000000 + [self calcH]; //calcH - evals heuristic like sum of params
} else if ( depth > 0 ) {
score = - [self scoreOpponentsTurn:-1000000000 max:-min depth:depth - 1];
} else {
score = [self calcH];
}
[self.board applyChanges:undo];
}
- (moveType)findBestMove
{
NSMutableArray *legalMoves = [self findLegalMoves];
NSMutableArray *bestMoves = [[NSMutableArray alloc] init];
int min = -1000000000;
int max = 1000000000;
moveType move;
for ( NSValue *moveIt in legalMoves ) {
[moveIt getValue:&move];
float score = [self scoreMove:move min:min max:max depth:depth];
// Here i have some conditions to decide current move is best or not
}
// and pick random move from best moves and assign it to move variable
return move;
}
@end
そして、3以上のような合法的な動きの数が多い場合(再帰的な検索では増加します)、このアルゴリズムの動作は非常に遅くなります。
これは私の最初のObjective-cの経験です。パフォーマンスを改善する方法についての私の推測は次のとおりです。
- 再帰を削除します(ただし、別の解決策はありません)
- マルチスレッドを使用する(どのように?)
- いくつかのAIライブラリを使用できますか?
英語でごめんなさい。