back to the games

The Archive · Play as Record

What is playing against you

8 games with an opponent · 16 with none at all

Sit down to Oware here and something answers your move within a second. It is worth asking what. The honest answer is different for every board in this archive, and in most of them the answer is nothing at all.

Three things are worth carrying into these descriptions. First, an opponent that searches is not thinking in any sense you would recognise — it is playing out moves and scoring the results. Second, the scoring function is where a human being states what they believe the game is about, in numbers. Third, several of these opponents do not search, do not score, and in seventeen cases do not exist.

Easy means random

In every game here, the easy setting is not a weaker player. It is no player: one of the legal moves, chosen uniformly at random. The difficulty selector is partly a designed illusion, and you can watch it happen with the search panel on.

The weights are an argument

Oware's opponent values a captured seed at ten and a seed still on the board at two. Nothing made those numbers true. Someone chose them, and in choosing them made a claim about what winning at Oware consists of.

It does not cheat

Whot's opponent reads how many cards you hold — which you could see at a real table — and never which ones. None of these opponents reads hidden information. Their advantage, where they have one, is patience.

Side by side

Game Method Looks ahead In one sentence
Oware Searches the game tree 4 Looks four moves ahead and picks the line that ends best for it.
Seega Searches the game tree 3 Scores placements for safety, then searches three moves ahead once pieces start moving.
Draughts Searches the game tree 2 Two moves ahead on hard; on medium it just compares material before and after.
Morabaraba Searches the game tree 2 Completes a mill if it can, blocks yours if it must, otherwise searches two moves ahead.
Bao Scores each move once, no lookahead 1 Never searches. It scores each sowing once, and on hard peeks at five of your replies.
Fanorona Searches the game tree 1 Looks one move ahead. It is the weakest of the searching opponents.
Whot Scores each move once, no lookahead Scores the cards in its own hand by hand-written preferences. It cannot see your cards.
Ludo Follows a fixed list of rules Four rules in order. It never scores anything, and takes the first token that fits.
Forest Runner No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Kora Player No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Kukulu No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Maasai Mara Ecosystem No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Namaqua Colour No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Photo Safari No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Puzzle Scout No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Rhythm Drummer No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Safari Memory No opponent — a timer or a spawner Nothing plays against you. You are racing a timer.
Safari Night No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Sahara Trading No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Savanna After Dark No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
Savanna Word Search No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
The Baobab No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
The Great Migration No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.
The Hyena's Laugh No opponent — a timer or a spawner Nothing plays against you — obstacles arrive on a timer.

Searches the game tree

Oware 4 moves ahead mancala-engine.ts — evaluate(), minimax()
On its hardest setting this is a minimax search with alpha-beta pruning, four plies deep. It plays out every legal move, then your best replies to each, and so on, and scores the positions at the bottom. That scoring function is where the opinions live. It reads: 10 x (its captured seeds - yours) 2 x (its seeds on the board - yours) 1 for each of your pits holding one or two seeds Someone decided a captured seed is worth five times a seed still in play, and that your thin pits are worth steering towards because they are the ones that become capturable. Those weights are an argument about how Oware works, written as numbers. Change them and you change the machine's idea of good play. Alpha-beta pruning means it stops examining a line once it knows that line cannot beat one it has already found. Turn on 'show the search' and watch the position count: it examines far fewer than the full tree. On medium it does not search at all — it takes the largest immediate capture. On easy it picks a legal move uniformly at random.
Seega 3 moves ahead seega-engine.ts — minimaxS()
Two different opponents, one per phase. While placing, it scores each empty point: +20 per capture the placement would make, -15 if you could capture it in reply. It also runs a short search here, but during placing there is nothing to move, so that search explores an empty tree and contributes almost nothing. Once the board is full and pieces move, the search becomes real: three plies with alpha-beta. Watch the position count jump between the two phases.
Draughts 2 moves ahead draughts-engine.ts — evaluateD(), minimaxD()
On hard, ten points per captured piece plus a two-ply alpha-beta search. On medium there is no search at all — it scores a move as the change in material it produces, which makes it greedy and easy to bait. Worth noting against the tournament rules: international draughts requires you to take the longest available capture. This engine does not enforce that, so both you and it can play captures a referee would disallow.
Morabaraba 2 moves ahead morabaraba-engine.ts — evaluate(), minimax()
Three rules run before any search: if a placement completes its own mill it plays it; if one blocks a mill of yours it plays that; only then does it search. The search is minimax with alpha-beta at two plies. Its scoring counts mills (10 each), two-in-a-rows (2 each), and material (3 per cow), from its side minus yours. Because the board now carries the four corner diagonals, each corner sits on three mills instead of two. Nothing in the AI was changed to account for that — it simply counts mills, so corners became more valuable to it automatically. That is a case where fixing the board improved the opponent without touching the opponent.
Fanorona 1 move ahead fanorona-engine.ts — minimaxF()
The prototype's documentation claims a two-ply search. The code passes a depth of one, so it sees your immediate reply and no further. It adds five points per piece captured to whatever the search returns. On medium it does not search: it counts the capture and subtracts half a point for every reply you would have, a crude way of preferring moves that leave you with fewer options. Fanorona's compulsory-capture and chaining rules mean the branching factor swings wildly from turn to turn. Watch the candidate count: some turns it has one legal move, others a dozen.

Scores each move once, no lookahead

Bao 1 move ahead bao-engine.ts — aiTurn()
This is not a search. It sows from each of its pits in turn, scores the result at five points per seed captured, and takes the best. On hard it adds one look at your reply — but only at the first five of your legal moves. The code says so plainly: `// limit for performance`. If your best answer happens to be the sixth in the list, it never sees it. That truncation is worth dwelling on. It is not an approximation with a principle behind it, like alpha-beta pruning, which only discards lines it has proved cannot matter. It is an arbitrary cut made to keep the frame rate up, and it means the opponent has a blind spot with no theory behind where the blind spot falls.
Whot whot-engine.ts — aiChooseCard()
No search and no lookahead. It scores each playable card in its hand against a list someone wrote by hand: +40 for a draw-3, +30 for a draw-2, +25 for a skip, +20 for a go-again, +5 for matching the current shape. Does it cheat? No. It reads how many cards you are holding — which you can see too at a real table — and if you are down to three or fewer it adds 30 to any card that would skip you or make you draw. It never reads which cards you hold. On medium it takes its best-scoring card only 60% of the time and otherwise plays at random, which is how this game manufactures a middle difficulty: not by thinking less well, but by sometimes not thinking at all.

Follows a fixed list of rules

Ludo ludo-engine.ts — aiPlay()
The simplest opponent here, and worth comparing with Oware's search. 1. Can any token capture? Play it. 2. Can any token enter the board? Play it. 3. Can any token reach home? Play it. 4. Otherwise, move one at random. There is no evaluation function and no lookahead. Note also that within each rule it takes the FIRST matching token in the list, not the best one — if two tokens could capture, it does not consider which capture is worth more. Ludo is mostly dice anyway, which is the real lesson: the amount of intelligence worth building into an opponent depends on how much the game rewards it.

No opponent — a timer or a spawner

Forest Runner
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Kora Player
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Kukulu
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Maasai Mara Ecosystem
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Namaqua Colour
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Photo Safari
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Puzzle Scout
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Rhythm Drummer
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Safari Memory safari-memory-engine.ts
Nothing is playing against you: your opponent is the clock. The cards are shuffled once at the start and nothing is decided after that.
Safari Night
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Sahara Trading
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Savanna After Dark
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
Savanna Word Search
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
The Baobab
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
The Great Migration
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
The Hyena's Laugh
Nothing is playing against you. There is no opponent in this game at all — no model of you, no plan, no choices being weighed. What feels like an adversary is a spawn timer and a random number generator: obstacles appear on a schedule that tightens as your score rises. This is worth noticing precisely because it can feel otherwise. Difficulty that rises with time reads as an opponent responding to you, and it is not.
The Archive · Play as Record Opponents Africanpedia