При атаке или при захвате территорий - нужно стараться не перекрывать путь другим своим клеткам, а то они останутся взаперти. При расстановке - если есть узкий проход, то прокачивать только те клетки, которые там пройдут, а также не ставить лишних армий, когда захватываешь тупик. Вот наглядные ошибки расстановки армий у ботов с простым интеллектом:
Hidden text.
В HTML-версии, как я сказал, у меня 3 типа ботов. 2 первых - средние, третий - продвинутый. До этого я тестировал лёгких ботов, которые расставляют армии по всем территориям, в том числе и внутри. Но они не смогли даже обыграть друг друга! 
В придачу к этому они создавали столько частиц (анимированных эффектов), что всё дико тормозило. Поэтому я их переписал.
Теперь расскажу про то, как работает каждый бот.
1. Атакует рандомно выбранной клеткой рандомно выбранную соседнюю, и так делает до тех пор, пока на границах у него не будут везде единицы. После этого выбирает рандомно одну из пограничных клеток и накидывает ей 1 армию, и так до тех пор, пока все армии не будут раскиданы.
2. У второго тактика атаки точно такая же, а вот расставляет он немного иначе. Сначала, пока число пограничных клеток меньше числа нерасставленных армий, он накидывает каждой из пограничных клеток 1 армию. После этого остаток армий раскидывается рандомно. Неудевительно, что уровень его интеллекта примерно такой же, как и у первого.
3. Вот тут уже не так всё просто. Выбираются все пограничные клетки с самым маленьким числом клеток поблизости, на которые можно походить. Из них выбираются с самым малым числом армий. Из выбранных берётся рандомная клетка. Теперь выбираем, кого будем атаковать. Из всех клеток, которые можно атаковать, выбираются те, которые граничат с наибольшим числом наших клеток, а их них выбираем самые слабые. Из выбранных берётся рандомная клетка.
Далее такой момент: если мы можем захватить жертву одним ходом (это когда у жертвы армий меньше, чем у нашей выбранной клетки) и если у нас есть другая клетка с большим числом армий, атакующая выбранную жертву, и у которой только 1 вариант хода (т.е. она вот-вот может быть заблокирована), то берём и атакуем этой клеткой, иначе атакуем как обычно. Вот такой вот хитрый алгоритм, выполняем его до тех пор, пока не будут все границы с одной армией.
Но это не всё - надо ещё грамотно расставить армии. На это у нас две задачи: оборонка и наступленка (звучит смешно, но понятно

Сначала выделяем как максимум 75% всех новых армий на оборонку.
Эти армии расставим так: берём все пограничные клетки, у которых рядом сумма армий в клетках противника больше, чем число армий в этой нашей клетке. Выбираем рандомно одну из них и кидаем ей 1 армию. И так либо пока оборонка не закончится, либо пока все клетки не будут укреплены достаточно.
Оставшиеся клетки выделяем на наступленку. А вот тут вообще сложно рассказать словами. Но попробую.
Создаём 2-мерный массив с false в каждой ячейке, который соответствует игровому полю (на самом деле там не false, а undefined, но плевать). Он нужен для того, чтобы помечать "мысленно захваченные" клетки.
Берём все пограничные клетки. Каждой приписываем "мысленную координату", которая изначально равна реальной. А потом берём рандомную клетку из пограничных и мысленно ей захватываем рандомную клетку с врагом. Передвигаем мысленную координату и помечаем в массиве, что клетка типа захвачена, а клетке, которая захватила, мысленно кидаем 1 армию (или 2 армии + 1 очко, если съели врага, и не важно, сколько у него там было армий). Наши клетки, которые в результате этого оказались взаперти или в тупике, из конкурса выбывают.
Если все мысленные клетки упёрлись в тупик, а у нас остались нерасставленные армии, то делаем следующее. Если мы начисляли ранее очки, то раскидываем рандомно армии так, что чем больше у клетки очков, тем больше шанс, что армию мы накинем именно ей. А если очков мы не выдавали, то рандомно раскидываем по всем пограничным клеткам обычным способом. Такая расстановка обеспечивает избежание вышеописанных ошибок, которые показаны на скринах.
Ничего себе, сколько текста получилось..
