Files
048-the-coockie-factory-new/docs/wiki/Step-5-Improve-the-Strategy.md
Tirsvad afcb7d35a8 Add strategy options: check interval, buy all affordable
BuyStrategy with a pure buy-all plan, validated --interval, --buy-all,
a five attempt retry for reads that go stale (found in a real run), the
comparison of two batches of 300 s container runs and the screenshot of
lecture step 5. Code review RC-018.

Closes #26
Closes #27
Closes #28

Task: MIL-006#1
Task: MIL-006#2
Task: MIL-006#3
2026-10-28 18:03:55 +08:00

45 lines
2.9 KiB
Markdown

**English** · [Dansk](Step-5-Improve-the-Strategy-da) · [Bahasa Malaysia](Step-5-Improve-the-Strategy-ms)
# Lecture step 5: tweak the algorithm
![The game after the best run, checking every 10 seconds](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-the-coockie-factory-new/raw/branch/main/docs/images/step-5.png)
## What the assignment asks
Try another check interval (every second, every 10 seconds) or buy all affordable upgrades, and see whether the cookies per second go up.
## What we built
- `--interval SECONDS` sets the time between upgrade checks. It must be greater than 0; the default stays 5 seconds.
- `--buy-all` buys every upgrade that still fits in the cookies you have, the most expensive first (`choose_affordable_upgrades`). Without it the bot buys one upgrade, the most expensive affordable one (`choose_most_expensive_affordable`).
- Both rules are pure functions in the domain package, so they are unit tested without a browser. The strategy is a value (`BuyStrategy`), not a flag spread through the code.
```bash
cookie-clicker-bot --interval 10
cookie-clicker-bot --interval 1 --buy-all
```
## What we measured
Each row is a full 300 second run in a Docker container. Five containers ran at the same time on one computer, in two batches, so the numbers are good for comparing the rows with each other but a run alone is faster (our solo baseline of lecture step 4 was 18.9).
| Check every | Strategy | Batch 1 | Batch 2 |
| --- | --- | --- | --- |
| 1 second | buy one | 13.5 | 13.5 |
| 1 second | buy all | 13.5 | 13.5 |
| 5 seconds (assignment) | buy one | 15.5 | 15.5 |
| 5 seconds | buy all | crashed, see below | 14.5 |
| 10 seconds | buy one | **18.2** | **18.2** |
The best result is the 10 second interval with buy one. Why:
- Checking more often is not better. Every check reads the page and takes time away from clicking, and the most expensive affordable product is usually only a little better than the cheaper one you could have bought a moment before.
- Buy all makes no difference early in the game: only Cursor and Grandma are affordable, and the bot buys them anyway. It would matter later, when the cookie count holds several products at once.
## What we gained in this step
- **Small, pure rules are easy to compare.** Because the choice of upgrade does not touch Selenium, a new strategy is a new function plus a test.
- **Measure, do not guess.** The result we expected (more checks, more cookies) was the opposite of what the runs showed.
- **A second real bug.** The first batch crashed in one container: the game rewrites the counter every frame, and a computer under load made our single retry fail. The read now retries five times with a short pause. A test with a fake driver that goes stale four times shows it.
- **Fair comparisons need the same conditions.** We ran the rows at the same time and report two batches, because one run can be lucky.