Plan the Day 21 repository: business case, stakeholders, plan and milestones
Adds the Business Case, Stakeholder Analysis, Domain Dictionary, Project Plan and milestones MIL-001 to MIL-003, with the review records RC-001 to RC-006 (all Go). The repository starts from the finished main of 020-snake-game, as S01 decided on 2026-10-08. The milestones and their 22 issues were synced to the git host.
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
# MIL-001: Project foundation
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-001 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version, reviewed in RC-004 (Go) | pending |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This gate decides whether the repository is ready to hold the game: a fresh clone can be set up from the README, the tests and the documentation build run, every constant of the game lives in one module, and the repository page says what the project is. The files are adopted from the base ([020-snake-game], `main`) and given the identity of this repository. The work is delivered on the branch `mil-001-project-foundation` and one pull request.
|
||||
|
||||
## Deliverable
|
||||
|
||||
The repository files that carry no game logic yet: `pyproject.toml`, the Python `.gitignore`, the package `src/snake_game/` with `constants.py`, `tests/test_constants.py`, `README.md` following the Product Owner's template, `Doxyfile`, and the continuous integration workflow `.gitea/workflows/ci.yml`. The repository description and topics on the git host are set.
|
||||
|
||||
Each adopted file is copied from the base and changed only where the identity of this repository requires it (project name, description, repository links, day number). The pull request lists every difference from the base.
|
||||
|
||||
Proposed repository description and topics, for S01 to confirm before they are set:
|
||||
|
||||
- Description: "Snake game in Python with turtle graphics and object-oriented design: the snake eats food, grows, keeps a score and ends at the wall or at its own tail. Day 21 of Udemy's 100 Days of Code Python bootcamp, with pytest tests and Doxygen docs. No runtime dependencies."
|
||||
- Topics: `100-days-of-code`, `doxygen`, `education`, `game`, `oop`, `pytest`, `python`, `python-bootcamp`, `python3`, `snake-game`, `turtle-graphics`, `udemy`.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | In a fresh clone, `python -m venv .venv`, `python -m pip install --upgrade pip` and `python -m pip install -e ".[dev]"` succeed in Windows PowerShell | All three commands exit 0 | Any command fails |
|
||||
| 2 | `pytest` runs | Exit code 0, at least one test of `constants.py`, no window opened | Failing test, or no test of `constants.py` |
|
||||
| 3 | `pyproject.toml` states the Python version and the dependencies | `requires-python = ">=3.13"`, `dependencies = []`, a `dev` extra with pytest, and a repository URL that names this repository | Any of the four is missing or different |
|
||||
| 4 | The `.gitignore` protects local files | `git check-ignore .venv .env __pycache__` lists all three | One of them is not ignored |
|
||||
| 5 | `constants.py` holds the values of the lectures | Screen width, height, colour and title; segment shape and colour; the three starting positions; the move distance; the four directions; the refresh delay; the food shape, size, colour and speed; the wall; the eating distance; the scoreboard label, colour, position, alignment and font; the touch distance; the game-over text and place are constants with Doxygen comments | A value of the list is missing or has no Doxygen comment |
|
||||
| 6 | `doxygen Doxyfile` builds the source documentation | Ends with 0 warnings and writes HTML for `src/` | Any warning, or no output |
|
||||
| 7 | The README follows the Product Owner's template | Every section title of the template in the given order, with commands for Windows PowerShell, Linux Debian and macOS | A heading is missing, out of order, or a section has no commands |
|
||||
| 8 | The continuous integration (CI) workflow exists | `.gitea/workflows/ci.yml` installs `.[dev]` and runs `pytest`, `ruff` and `mypy` on Python 3.13, and nothing under `.github/workflows` exists | No workflow, or it does not run the tests, or a file exists under `.github/workflows` |
|
||||
| 9 | The repository page is complete | Description is non-empty and there are at least 5 topics on the git host | Description empty or fewer than 5 topics |
|
||||
| 10 | The adopted files are traceable to the base | The pull request lists every difference between each adopted file and the base, or says that there is none | A difference that the list does not name |
|
||||
| 11 | The code is reviewed | `RC-*` against `QC-PY-001` has the verdict `Go` | Verdict `No-Go` or `Go-with-conditions` |
|
||||
| 12 | No secret is in the change | `.env` is not tracked and no token appears in any changed file | A token is found in the diff |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| [PP-001] accepted | The plan schedules this gateway; the plan-first gate needs it before any code |
|
||||
| This milestone accepted with a `Go` review | The plan-first gate allows no file under `src/` or `tests/` before that |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objective 6: reproducible environment, no runtime dependencies | [BC-001], criteria 6 and 8 in Success Criteria |
|
||||
| Objective 7: tests without a display | [BC-001], criterion 5 in Success Criteria |
|
||||
| Objective 8: Doxygen and README | [BC-001], criteria 6 and 7 in Success Criteria |
|
||||
| Objective 10: repository page | [BC-001], criterion 11 in Success Criteria |
|
||||
| Objective 9: traceable steps; the base is adopted without hidden change | [BC-001], criteria 10 and 12 in Success Criteria |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-09 — first of three gateways, inside the one-week plan of [PP-001] that ends 2026-10-16.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Add pyproject.toml for the Day 21 repository | Adopt `pyproject.toml` from the base for the `snake-game` project: `requires-python = ">=3.13"`, an empty `dependencies` list, an optional `dev` extra with pytest, ruff and mypy, the `src` layout for the package `snake_game`, the pytest settings (`testpaths = ["tests"]`), and a description and repository URL that name this repository and day 21. Serves objective 6 of the Business Case: a reproducible environment without runtime dependencies. | No | |
|
||||
| 2 | Add the Python .gitignore for the Day 21 repository | Adopt the Python `.gitignore` from the base: bytecode, `.venv/`, build and packaging output, pytest, ruff, mypy and Doxygen output. It also ignores `.env`, so the personal tokens can never be committed or become part of the project. | No | |
|
||||
| 3 | Adopt constants.py and its test | Copy `src/snake_game/__init__.py`, `src/snake_game/constants.py` and `tests/test_constants.py` from the base. The constants hold every value of the lectures as `UPPER_SNAKE` constants with Doxygen comments, the day-21 values included (food, wall, eating distance, scoreboard, touch distance, game-over text). Values that the day-21 lecture summaries fix differently are corrected in MIL-003, not here. | No | |
|
||||
| 4 | Add the README for the Day 21 repository | Adopt `README.md` from the base and rewrite its identity for this repository (name, day 21, clone address). Keep the Product Owner's template (Requirements, Set up for Windows PowerShell, Linux Debian and macOS, Run, Run the tests, Continuous integration, Build the source documentation, Project layout, License). Document creating a local `.venv`, `python -m pip install --upgrade pip` and `python -m pip install -e ".[dev]"`; name `python3-tk` and Debian 13 for Linux. The Run section is finished in MIL-003. Serves S02 and S03. | No | |
|
||||
| 5 | Add the Doxyfile for the Day 21 repository | Adopt the `Doxyfile` from the base: it reads `src/`, writes to `build/doxygen`, extracts documentation for Python (Doxygen comment style, `OPTIMIZE_OUTPUT_JAVA`) and treats warnings as failures; the project brief names day 21. The README documents the command `doxygen Doxyfile`. | No | |
|
||||
| 6 | Add the continuous integration workflow | Adopt `.gitea/workflows/ci.yml` (run by Gitea Actions) from the base: check out, set up Python 3.13, `python -m pip install --upgrade pip`, `python -m pip install -e ".[dev]"`, run `pytest`, `ruff` and `mypy`. The tests need no display. The file stays in `.gitea/workflows`, not `.github/workflows`, because GitHub refuses a push that touches `.github/workflows` from a token without the workflow scope, which would block the push mirror to GitHub. | No | |
|
||||
| 7 | Set the repository description and topics | Set the description and at least 5 topics of this repository on the git host with the Gitea application programming interface (API), using `GITEA_TOKEN` from the personal `.env` file; the file is only read by the command, never imported, tested or tracked. Use the proposed text of the Deliverable section once S01 has confirmed it. Serves S03 and objective 10 of the Business Case. | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[PP-001]: ../project-plan.md
|
||||
[020-snake-game]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/020-snake-game
|
||||
@@ -0,0 +1,93 @@
|
||||
# MIL-002: Adopt the game
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-002 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version, reviewed in RC-005 (Go) | pending |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This gate decides whether the finished game of the base ([020-snake-game], `main`) runs in this repository: the snake, the food, the scoreboard, the main flow and all their tests are here, they pass, and the game can be played. It does not yet compare the game with the day-21 lectures; that is [MIL-003]. The work is delivered on the branch `mil-002-adopt-the-game` and one pull request.
|
||||
|
||||
## Deliverable
|
||||
|
||||
`src/snake_game/snake.py` (the class `Snake`), `src/snake_game/food.py` (the class `Food`), `src/snake_game/scoreboard.py` (the class `Scoreboard`), `src/snake_game/main.py` and `src/snake_game/__main__.py` (the main flow and `python -m snake_game`), and the tests `tests/fakes.py`, `tests/test_snake.py`, `tests/test_food.py`, `tests/test_scoreboard.py` and `tests/test_main.py`. Running `python -m snake_game` plays the whole game.
|
||||
|
||||
The files are copied from the base and changed only where the identity of this repository requires it. The module split of the base is kept: the lecture's single script is already divided into `Snake`, `Food`, `Scoreboard` and a main flow, and the main flow keeps the lecture's names (`screen`, `snake`, `food`, `scoreboard`, `game_is_on`). The pull request lists every difference from the base.
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The adopted files match the base | The pull request lists every difference between each adopted file and the base, or says that there is none | A difference that the list does not name |
|
||||
| 2 | All tests pass without a display | `pytest` exits 0; no test opens a window; every test of the base is present | A failing test, or a test of the base is missing |
|
||||
| 3 | Lint, format and types are clean | `python -m ruff check src tests`, `python -m ruff format --check src tests` and `python -m mypy` exit 0, as in continuous integration (CI) | Any of the three fails |
|
||||
| 4 | `doxygen Doxyfile` builds | 0 warnings | Any warning |
|
||||
| 5 | The game can be played | S01 runs `python -m snake_game` in Windows PowerShell: the window opens, the snake moves and turns, food is shown, the snake eats and grows, the score rises, and the game ends at the wall and at the tail | The game does not start, or one of those things does not happen |
|
||||
| 6 | Closing the window ends quietly | Closing the window during play, and after game over, ends the program with exit code 0 and no traceback | A traceback |
|
||||
| 7 | Importing the main flow needs no display | Importing `snake_game.main` loads neither `turtle` nor `tkinter` | Either module is loaded by the import |
|
||||
| 8 | The assignment's names exist | Every name of objective 5 of [BC-001] exists with that spelling | A name is missing or spelled differently |
|
||||
| 9 | Constants are in one place | No module other than `constants.py` defines a value of the lectures | A value is a literal in another module |
|
||||
| 10 | The code is reviewed | `RC-*` against `QC-PY-001` has the verdict `Go` | Verdict `No-Go` or `Go-with-conditions` |
|
||||
| 11 | The README matches the adopted game | The Run section and the Project layout of `README.md` describe the files and the command of this milestone, and no sentence says that the game is still to come | A sentence that is out of date, or a file or command that the README does not name |
|
||||
| 12 | No secret is in the change | `.env` is not tracked and no token appears in any changed file | A token is found in the diff |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| [MIL-001] accepted and merged | The package, `constants.py`, the test set-up, the Doxyfile and the CI workflow exist there |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objective 1: the day-20 behaviour is kept | [BC-001], criterion 1 in Success Criteria |
|
||||
| Objectives 2 and 3: food, eating, score and game over | [BC-001], criteria 2 and 3 in Success Criteria |
|
||||
| Objective 4: inheritance and slicing | [BC-001], criterion 4 in Success Criteria |
|
||||
| Objective 5: the assignment's names | [BC-001], criterion 9 in Success Criteria |
|
||||
| Objective 7: tests without a display | [BC-001], criterion 5 in Success Criteria |
|
||||
| Objective 8: Doxygen and README | [BC-001], criterion 7 in Success Criteria |
|
||||
| Objective 9: traceable steps; the base is adopted without hidden change | [BC-001], criteria 10 and 12 in Success Criteria |
|
||||
| Design of `Snake`, `Food`, `Scoreboard` and the main flow: no Design Class Diagram exists in this project and none is wanted for a learning project of this size. The classes trace to the day-21 lectures, to the base and to tasks 2 to 5 below. This is a recorded deviation from `QC-PY-001` criterion 10, as in the base | [PP-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-12 — second of three gateways, inside the one-week plan of [PP-001] that ends 2026-10-16.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Adopt the test fakes | Copy `tests/fakes.py` from the base: the fake segment, the fake screen and the fake `Turtle` base class that record their calls, so that every test runs without a display. The fake `turtle` module is installed before `food` and `scoreboard` are imported, because a class that inherits from `Turtle` needs the module at import time. List every difference from the base in the pull request. | No | |
|
||||
| 2 | Adopt the Snake class and its tests | Copy `src/snake_game/snake.py` and `tests/test_snake.py` from the base: `create_snake`, `add_segment`, `extend`, `move`, `hits_wall`, `hits_tail`, `up`, `down`, `left`, `right`, the `segments` list and the `head`. The tail check loops over the slice `segments[1:]`. `snake.py` does not import `turtle` until a real segment is made, so the tests pass fakes. | No | |
|
||||
| 3 | Adopt the Food class and its tests | Copy `src/snake_game/food.py` and `tests/test_food.py` from the base: `class Food(Turtle)`, whose `__init__` calls `super().__init__()` and `refresh`, and whose random place comes from one function that the tests replace. The values are checked against the lectures in MIL-003. | No | |
|
||||
| 4 | Adopt the Scoreboard class and its tests | Copy `src/snake_game/scoreboard.py` and `tests/test_scoreboard.py` from the base: `class Scoreboard(Turtle)` with `update_scoreboard`, `increase_score` and `game_over`. The values are checked against the lectures in MIL-003. | No | |
|
||||
| 5 | Adopt the main flow and the entry point | Copy `src/snake_game/main.py`, `src/snake_game/__main__.py` and `tests/test_main.py` from the base: the screen set-up, the key bindings, the animation loop with `game_is_on`, the eating check, the game-over check, the wait for a click and the quiet exit when the window is closed. `main` imports `food` and `scoreboard` only when it runs, so importing it needs neither `turtle` nor `tkinter`. | No | |
|
||||
| 6 | Describe the adopted game in the README | Update the Run section and the Project layout of `README.md` so that they match the files and the command of this milestone (`python -m snake_game`, the modules of `src/snake_game/`, the tests), and remove the sentence that says the game is still to come. MIL-003 finishes the README for the whole game. Serves S02 and S03. | No | |
|
||||
| 7 | Verify the adopted game end to end | Run `pytest`, `ruff check`, `ruff format --check`, `mypy` and `doxygen Doxyfile` in a fresh `.venv`, run `python -m snake_game` and play it until the game is over, close the window during play, and record the results and the list of differences from the base in the pull request. | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[PP-001]: ../project-plan.md
|
||||
[MIL-001]: ./mil-001-project-foundation.md
|
||||
[MIL-003]: ./mil-003-check-against-day-21.md
|
||||
[020-snake-game]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/020-snake-game
|
||||
@@ -0,0 +1,107 @@
|
||||
# MIL-003: Check against day 21
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-003 |
|
||||
| CrossReference | [BC-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version, reviewed in RC-006 (Go) | pending |
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This gate decides whether the adopted game does what the five day-21 lectures say, and whether the repository is finished. The base was written against assumed day-21 numbers; this milestone replaces the assumptions by the values of the lecture summaries, corrects the code where it differs, and finishes the README. It is the last gate of [PP-001]. The work is delivered on the branch `mil-003-check-against-day-21` and one pull request.
|
||||
|
||||
## Deliverable
|
||||
|
||||
A comparison table in the pull request with one row per lecture point below (value in the lecture summary, value in the code, same or different), the corrections of every difference with tests, a finished `README.md` that describes the whole game and this repository, and a check of the repository page. If nothing differs, the table says so and no source file changes.
|
||||
|
||||
The lecture points are the specification of this milestone:
|
||||
|
||||
| Lecture | Point of the lecture summary | Where it lives in the code |
|
||||
| --- | --- | --- |
|
||||
| 1. Inheritance and slicing | One class inherits the attributes and methods of another; lists are sliced | `class Food(Turtle)`, `class Scoreboard(Turtle)`, `segments[1:]` |
|
||||
| 2. Detect collisions with food | `Food` inherits from `Turtle`; a blue circle of 10 by 10 pixels | `FOOD_SHAPE`, `FOOD_COLOR`, `FOOD_SIZE` (0.5 of a default turtle) |
|
||||
| 2. Detect collisions with food | The random place comes from the `random` module and is never at the edge of the screen | `random_coordinate`, `WALL_LIMIT` (280) |
|
||||
| 2. Detect collisions with food | The snake eats the food when the distance between the head and the food is less than 15 pixels | `FOOD_COLLISION_DISTANCE`, `eat_food_if_close` |
|
||||
| 2. Detect collisions with food | `refresh` gives the food new random coordinates; it runs when the food is made and at every collision | `Food.refresh`, called from `Food.__init__` and `eat_food_if_close` |
|
||||
| 3. Scoreboard | `Scoreboard` inherits from `Turtle`; the score starts at 0; the text is written with alignment and font; the turtle is hidden; colour and place are set | `Scoreboard.__init__`, `SCOREBOARD_COLOR`, `SCOREBOARD_POSITION`, `SCOREBOARD_ALIGNMENT`, `SCOREBOARD_FONT` |
|
||||
| 3. Scoreboard | `increase_score` adds 1; the old text is cleared before the new text is written; `update_scoreboard` does both; alignment and font are constants | `Scoreboard.increase_score`, `Scoreboard.update_scoreboard` |
|
||||
| 4. Wall | The wall is at 280 and -280 on both axes; passing it stops the game (`game_is_on` becomes false); GAME OVER is shown in the middle with the score still visible | `Snake.hits_wall`, `WALL_LIMIT`, `Scoreboard.game_over`, `GAME_OVER_TEXT`, `GAME_OVER_POSITION` |
|
||||
| 5. Tail | Eating adds a segment: `extend` calls `add_segment` with the position of the last segment | `Snake.extend`, `Snake.add_segment` |
|
||||
| 5. Tail | The head touches the tail when it is closer than 10 pixels to a segment; the head is skipped, so it does not collide with itself | `Snake.hits_tail`, `TAIL_COLLISION_DISTANCE`, `segments[1:]` |
|
||||
|
||||
## Go / No-Go Criteria
|
||||
|
||||
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The comparison is complete | The pull request has one row for every lecture point above, with the value of the lecture summary, the value of the code and the result | A lecture point has no row |
|
||||
| 2 | Every difference is resolved | Each row marked different is corrected in the code with a test, or S01 accepts it with a reason written in the pull request | A difference stays open |
|
||||
| 3 | The lessons of day 21 are visible | `Food` and `Scoreboard` are subclasses of `turtle.Turtle` and call `super().__init__()`; `hits_tail` loops over `segments[1:]` | Either class does not inherit from `Turtle`, or the loop includes the head |
|
||||
| 4 | Food is shown | A manual run shows one small blue circle at a random place inside the wall; a second run shows another place; it is never at the very edge of the screen | No food, not a circle, or outside the wall |
|
||||
| 5 | The snake eats | When the head comes closer than `FOOD_COLLISION_DISTANCE` the food moves to a new random place, the snake grows by one segment and the score rises by 1; it works again for the next food | Any of the three does not happen, or the score rises without the food being eaten |
|
||||
| 6 | The scoreboard shows the score | White text `Score: 0` at the top centre; after eating it shows `Score: 1` and the old text is gone | Text overlaps, is missing or is not at the top centre |
|
||||
| 7 | The wall ends the game | A manual run shows the game ending when the head passes the wall on each of the four sides; GAME OVER is in the middle of the window and the score stays visible | The game goes on beyond the wall, ends inside it, or shows no text |
|
||||
| 8 | The tail ends the game | Turning the head into the body ends the game; normal movement, including the moves right after eating, does not | The game does not end, or ends without a touch |
|
||||
| 9 | A click closes the window | After game over a click closes the window and the program ends with exit code 0; closing the window during play also ends with exit code 0 and no traceback | The window stays, or a traceback appears |
|
||||
| 10 | Tests and checks are green | `pytest` exits 0 with no display; `ruff check`, `ruff format --check` and `mypy` exit 0; `doxygen Doxyfile` ends with 0 warnings | Any check fails |
|
||||
| 11 | The README is finished | It describes the whole game (moving, food, score, game over, closing) and this repository; it has no placeholder and no sentence that is out of date; a fresh clone reaches a green `pytest` by following it | A placeholder or an out-of-date sentence, or a command fails |
|
||||
| 12 | The repository page is complete | Description is non-empty and there are at least 5 topics on the git host | Description empty or fewer than 5 topics |
|
||||
| 13 | The game matches the lecture | S01 compares the finished game with the lecture video and notes any difference in the pull request | An undocumented difference |
|
||||
| 14 | The code is reviewed | If a source file changed, `RC-*` against `QC-PY-001` has the verdict `Go`; if none changed, the pull request says so | Verdict `No-Go` or `Go-with-conditions` |
|
||||
|
||||
## Dependencies
|
||||
|
||||
| Depends on | Reason |
|
||||
| --- | --- |
|
||||
| [MIL-002] accepted and merged | The game that is checked exists there |
|
||||
|
||||
## Traceability
|
||||
|
||||
| Business Case objective / KPI / user story | Reference |
|
||||
| --- | --- |
|
||||
| Objectives 2 and 3: food, eating, score, game over as the lectures give them | [BC-001], criteria 2 and 3 in Success Criteria |
|
||||
| Objective 4: inheritance and slicing | [BC-001], criterion 4 in Success Criteria |
|
||||
| Objective 1: the day-20 behaviour is kept | [BC-001], criterion 1 in Success Criteria |
|
||||
| Objective 7: tests without a display | [BC-001], criterion 5 in Success Criteria |
|
||||
| Objective 8: README and Doxygen | [BC-001], criteria 6 and 7 in Success Criteria |
|
||||
| Objective 9: traceable steps | [BC-001], criterion 10 in Success Criteria |
|
||||
| Objective 10: repository page | [BC-001], criterion 11 in Success Criteria |
|
||||
| Design of any corrected class or method: no Design Class Diagram exists; a correction traces to its lecture point in the table above, a recorded deviation from `QC-PY-001` criterion 10 as in [MIL-002] | [PP-001] |
|
||||
|
||||
## Ownership
|
||||
|
||||
| Role | Stakeholder ID (SA) |
|
||||
| --- | --- |
|
||||
| Owner | S01 |
|
||||
| Approving reviewer | S01 |
|
||||
|
||||
## Target Date
|
||||
|
||||
2026-10-14 — last of three gateways, inside the one-week plan of [PP-001] that ends 2026-10-16.
|
||||
|
||||
## Tasks
|
||||
|
||||
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | Check inheritance and slicing against lecture 1 | Compare the code with the lecture on class inheritance and slicing: `Food` and `Scoreboard` are subclasses of `Turtle` that call `super().__init__()`, and the tail check slices the segments so that the head is left out. Write the result as rows of the comparison table in the pull request. | No | |
|
||||
| 2 | Check the food against the collision lecture | Compare the food with the lecture on collisions with food: a blue circle of 10 by 10 pixels (`FOOD_SIZE` 0.5), a random place from the `random` module that is never at the edge of the screen, `refresh` at creation and at every collision, and the eating distance of less than 15 pixels. Write the result as rows of the comparison table. | No | |
|
||||
| 3 | Check the scoreboard against its lecture | Compare the scoreboard with the lecture: the score starts at 0, the text is written with alignment and font taken from constants, the turtle is hidden, `increase_score` adds 1, and `update_scoreboard` clears the old text before it writes the new one. Write the result as rows of the comparison table. | No | |
|
||||
| 4 | Check the wall and the game-over text against their lecture | Compare the wall and the end of the game with the lecture: the wall is at 280 and -280 on both axes, passing it sets `game_is_on` to false, and GAME OVER is shown in the middle with the score still visible. Write the result as rows of the comparison table. | No | |
|
||||
| 5 | Check growth and the tail against their lecture | Compare `extend`, `add_segment` and the tail check with the lecture: `extend` adds a segment at the position of the last segment, and the head touches the tail below 10 pixels with the head itself skipped. Write the result as rows of the comparison table. | No | |
|
||||
| 6 | Correct the code where it differs from the lectures | For every row of the comparison table marked different, change the constant or the code, add or change the test that proves it, and say so in the pull request. If no row differs, change no source file and state that in the pull request. | No | |
|
||||
| 7 | Finish the README for the Day 21 repository | Rewrite the Status and Run sections of `README.md` for the whole game (moving, food, score, game over, closing), remove every sentence that is out of date, update the Project layout, and confirm that `doxygen Doxyfile` ends with 0 warnings and that a fresh clone reaches a green `pytest` by following the README. | No | |
|
||||
| 8 | Check the repository page and compare with the video | Check on the git host that the description and at least 5 topics are still set, run the finished game next to the lecture video, and write every difference in the pull request. | No | |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[PP-001]: ../project-plan.md
|
||||
[MIL-002]: ./mil-002-adopt-the-game.md
|
||||
Reference in New Issue
Block a user