Geometric Modeling and Jump Validity in English Checkers

Geometric Modeling and Jump Validity in English Checkers
Loading the math board and drawing, please wait…
2021-01-16 00:04
This GeoGebra example translates English checkers into a geometric, rule-driven model that highlights which landing squares are jumpable and which pieces are movable. It demonstrates the phenomenon of computing feasible moves on a discrete board using set-based logic: candidate locations are formed, undefined results are removed, and valid moves are filtered. Key concepts include set operations (union and cleanup), conditional logic (If), and geometric construction via polygonal board/region definitions. Construction-wise, the example relies on Flatten to restructure objects, Union to combine candidate sets, RemoveUndefined to discard invalid outputs, If to apply the move/jump rules, Polygon to build relevant geometric regions, and Sequence to generate discrete indices/steps. Named objects such as checkerAk/checkerBs and jumpable* / movable* collections represent piece states and computed move options, along with board-structure components like SA and multiple s11–s68 sub-objects. Suitable for secondary education and classroom modeling tasks focused on discrete logic, formal rule representation, and geometry-based computation.

GeoGebra Commands & Parameters

  1. Flatten(Sequence[Sequence[(k + Mod[l + 1, 2], l), l, 1, 8], k, 1, 7, 2]) → all
  2. Union(checkerAs, checkerAk) → checkerAall
  3. Union(checkerBs, checkerBk) → checkerBall
  4. RemoveUndefined(Sequence[If[checkerBs(k) + (1, -1) ∈ checkerAall ∧ checkerBs(k) + (2, -2) ∈ spaces ∨ checkerBs(k) + (-1, -1) ∈ checkerAall ∧ checkerBs(k) + (-2, -2) ∈ spaces, checkerBs(k)], k, 1, Length[checkerBs]]) → jumpableBs
  5. RemoveUndefined(Sequence[If[checkerAs(k) + (1, 1) ∈ checkerBall ∧ checkerAs(k) + (2, 2) ∈ spaces ∨ checkerAs(k) + (-1, 1) ∈ checkerBall ∧ checkerAs(k) + (-2, 2) ∈ spaces, checkerAs(k)], k, 1, Length[checkerAs]]) → jumpableAs
  6. RemoveUndefined(Sequence[If[checkerBk(k) + (1, 1) ∈ checkerAall ∧ checkerBk(k) + (2, 2) ∈ spaces ∨ checkerBk(k) + (-1, 1) ∈ checkerAall ∧ checkerBk(k) + (-2, 2) ∈ spaces ∨ checkerBk(k) + (1, -1) ∈ checkerAall ∧ checkerBk(k) + (2, -2) ∈ spaces ∨ checkerBk(k) + (-1, -1) ∈ checkerAall ∧ checkerBk(k) + (-2, -2) ∈ spaces, checkerBk(k)], k, 1, Length[checkerBk]]) → jumpableBk
  7. RemoveUndefined(Sequence[If[checkerAk(k) + (1, 1) ∈ checkerBall ∧ checkerAk(k) + (2, 2) ∈ spaces ∨ checkerAk(k) + (-1, 1) ∈ checkerBall ∧ checkerAk(k) + (-2, 2) ∈ spaces ∨ checkerAk(k) + (1, -1) ∈ checkerBall ∧ checkerAk(k) + (2, -2) ∈ spaces ∨ checkerAk(k) + (-1, -1) ∈ checkerBall ∧ checkerAk(k) + (-2, -2) ∈ spaces, checkerAk(k)], k, 1, Length[checkerAk]]) → jumpableAk
  8. If(jumpableBs ≟ {}, RemoveUndefined[Sequence[If[checkerBs(k) + (1, -1) ∈ spaces ∨ checkerBs(k) + (-1, -1) ∈ spaces, checkerBs(k)], k, 1, Length[checkerBs]]], jumpableBs) → movableBs
  9. If(jumpableBk ≟ {}, RemoveUndefined[Sequence[If[checkerBk(k) + (1, 1) ∈ spaces ∨ checkerBk(k) + (-1, 1) ∈ spaces ∨ checkerBk(k) + (1, -1) ∈ spaces ∨ checkerBk(k) + (-1, -1) ∈ spaces, checkerBk(k)], k, 1, Length[checkerBk]]], jumpableBk) → movableBk
  10. If(jumpableAs ≟ {}, RemoveUndefined[Sequence[If[checkerAs(k) + (1, 1) ∈ spaces ∨ checkerAs(k) + (-1, 1) ∈ spaces, checkerAs(k)], k, 1, Length[checkerAs]]], jumpableAs) → movableAs
  11. If(jumpableAk ≟ {}, RemoveUndefined[Sequence[If[checkerAk(k) + (1, 1) ∈ spaces ∨ checkerAk(k) + (-1, 1) ∈ spaces ∨ checkerAk(k) + (1, -1) ∈ spaces ∨ checkerAk(k) + (-1, -1) ∈ spaces, checkerAk(k)], k, 1, Length[checkerAk]]], jumpableAk) → movableAk
  12. Polygon({(1 - 0.5, 3 - 0.5), (1 + 0.5, 3 - 0.5), (1 + 0.5, 3 + 0.5), (1 - 0.5, 3 + 0.5)}) → s13
  13. Polygon({(1 - 0.5, 5 - 0.5), (1 + 0.5, 5 - 0.5), (1 + 0.5, 5 + 0.5), (1 - 0.5, 5 + 0.5)}) → s15
  14. Polygon({(1 - 0.5, 7 - 0.5), (1 + 0.5, 7 - 0.5), (1 + 0.5, 7 + 0.5), (1 - 0.5, 7 + 0.5)}) → s17
  15. Polygon({(1 - 0.5, 1 - 0.5), (1 + 0.5, 1 - 0.5), (1 + 0.5, 1 + 0.5), (1 - 0.5, 1 + 0.5)}) → s11
  16. Polygon({(2 - 0.5, 2 - 0.5), (2 + 0.5, 2 - 0.5), (2 + 0.5, 2 + 0.5), (2 - 0.5, 2 + 0.5)}) → s22
  17. Polygon({(2 - 0.5, 4 - 0.5), (2 + 0.5, 4 - 0.5), (2 + 0.5, 4 + 0.5), (2 - 0.5, 4 + 0.5)}) → s24
  18. Polygon({(2 - 0.5, 6 - 0.5), (2 + 0.5, 6 - 0.5), (2 + 0.5, 6 + 0.5), (2 - 0.5, 6 + 0.5)}) → s26
  19. Polygon({(2 - 0.5, 8 - 0.5), (2 + 0.5, 8 - 0.5), (2 + 0.5, 8 + 0.5), (2 - 0.5, 8 + 0.5)}) → s28
  20. Polygon({(3 - 0.5, 3 - 0.5), (3 + 0.5, 3 - 0.5), (3 + 0.5, 3 + 0.5), (3 - 0.5, 3 + 0.5)}) → s33
  21. Polygon({(3 - 0.5, 5 - 0.5), (3 + 0.5, 5 - 0.5), (3 + 0.5, 5 + 0.5), (3 - 0.5, 5 + 0.5)}) → s35
  22. Polygon({(3 - 0.5, 7 - 0.5), (3 + 0.5, 7 - 0.5), (3 + 0.5, 7 + 0.5), (3 - 0.5, 7 + 0.5)}) → s37
  23. Polygon({(3 - 0.5, 1 - 0.5), (3 + 0.5, 1 - 0.5), (3 + 0.5, 1 + 0.5), (3 - 0.5, 1 + 0.5)}) → s31
  24. Polygon({(4 - 0.5, 4 - 0.5), (4 + 0.5, 4 - 0.5), (4 + 0.5, 4 + 0.5), (4 - 0.5, 4 + 0.5)}) → s44
  25. Polygon({(4 - 0.5, 6 - 0.5), (4 + 0.5, 6 - 0.5), (4 + 0.5, 6 + 0.5), (4 - 0.5, 6 + 0.5)}) → s46
  26. Polygon({(4 - 0.5, 8 - 0.5), (4 + 0.5, 8 - 0.5), (4 + 0.5, 8 + 0.5), (4 - 0.5, 8 + 0.5)}) → s48
  27. Polygon({(4 - 0.5, 2 - 0.5), (4 + 0.5, 2 - 0.5), (4 + 0.5, 2 + 0.5), (4 - 0.5, 2 + 0.5)}) → s42
  28. Polygon({(5 - 0.5, 3 - 0.5), (5 + 0.5, 3 - 0.5), (5 + 0.5, 3 + 0.5), (5 - 0.5, 3 + 0.5)}) → s53
  29. Polygon({(5 - 0.5, 5 - 0.5), (5 + 0.5, 5 - 0.5), (5 + 0.5, 5 + 0.5), (5 - 0.5, 5 + 0.5)}) → s55
  30. Polygon({(5 - 0.5, 7 - 0.5), (5 + 0.5, 7 - 0.5), (5 + 0.5, 7 + 0.5), (5 - 0.5, 7 + 0.5)}) → s57
  31. Polygon({(5 - 0.5, 1 - 0.5), (5 + 0.5, 1 - 0.5), (5 + 0.5, 1 + 0.5), (5 - 0.5, 1 + 0.5)}) → s51
  32. Polygon({(6 - 0.5, 4 - 0.5), (6 + 0.5, 4 - 0.5), (6 + 0.5, 4 + 0.5), (6 - 0.5, 4 + 0.5)}) → s64
  33. Polygon({(6 - 0.5, 6 - 0.5), (6 + 0.5, 6 - 0.5), (6 + 0.5, 6 + 0.5), (6 - 0.5, 6 + 0.5)}) → s66
  34. Polygon({(6 - 0.5, 8 - 0.5), (6 + 0.5, 8 - 0.5), (6 + 0.5, 8 + 0.5), (6 - 0.5, 8 + 0.5)}) → s68
  35. Polygon({(6 - 0.5, 2 - 0.5), (6 + 0.5, 2 - 0.5), (6 + 0.5, 2 + 0.5), (6 - 0.5, 2 + 0.5)}) → s62
  36. Polygon({(7 - 0.5, 3 - 0.5), (7 + 0.5, 3 - 0.5), (7 + 0.5, 3 + 0.5), (7 - 0.5, 3 + 0.5)}) → s73
  37. Polygon({(7 - 0.5, 5 - 0.5), (7 + 0.5, 5 - 0.5), (7 + 0.5, 5 + 0.5), (7 - 0.5, 5 + 0.5)}) → s75
  38. Polygon({(7 - 0.5, 7 - 0.5), (7 + 0.5, 7 - 0.5), (7 + 0.5, 7 + 0.5), (7 - 0.5, 7 + 0.5)}) → s77
  39. Polygon({(7 - 0.5, 1 - 0.5), (7 + 0.5, 1 - 0.5), (7 + 0.5, 1 + 0.5), (7 - 0.5, 1 + 0.5)}) → s71
  40. Polygon({(8 - 0.5, 4 - 0.5), (8 + 0.5, 4 - 0.5), (8 + 0.5, 4 + 0.5), (8 - 0.5, 4 + 0.5)}) → s84
  41. Polygon({(8 - 0.5, 6 - 0.5), (8 + 0.5, 6 - 0.5), (8 + 0.5, 6 + 0.5), (8 - 0.5, 6 + 0.5)}) → s86
  42. Polygon({(8 - 0.5, 8 - 0.5), (8 + 0.5, 8 - 0.5), (8 + 0.5, 8 + 0.5), (8 - 0.5, 8 + 0.5)}) → s88
  43. Polygon({(8 - 0.5, 2 - 0.5), (8 + 0.5, 2 - 0.5), (8 + 0.5, 2 + 0.5), (8 - 0.5, 2 + 0.5)}) → s82
  44. Polygon({(0.5, 0.5), (8.5, 0.5), (8.5, 8.5), (0.5, 8.5)}) → boardedge
  45. Sequence(Sequence[Polygon[{(l + Mod[k + 1, 2] - 0.5, k - 0.5), (l + Mod[k + 1, 2] - 0.5, k + 0.5), (l + Mod[k + 1, 2] + 0.5, k + 0.5), (l + Mod[k + 1, 2] + 0.5, k - 0.5)}], l, 1, 7, 2], k, 1, 8) → board
  46. RemoveUndefined({If[SA + (1, 1) ∈ checkerBall ∧ SA + (2, 2) ∈ spaces, SA + (2, 2)], If[SA + (-1, 1) ∈ checkerBall ∧ SA + (-2, 2) ∈ spaces, SA + (-2, 2)], If[SA ∈ checkerAk ∧ SA + (1, -1) ∈ checkerBall ∧ SA + (2, -2) ∈ spaces, SA + (2, -2)], If[SA ∈ checkerAk ∧ SA + (-1, -1) ∈ checkerBall ∧ SA + (-2, -2) ∈ spaces, SA + (-2, -2)]}) → jumpAto
  47. RemoveUndefined({If[SB + (1, -1) ∈ checkerAall ∧ SB + (2, -2) ∈ spaces, SB + (2, -2)], If[SB + (-1, -1) ∈ checkerAall ∧ SB + (-2, -2) ∈ spaces, SB + (-2, -2)], If[SB ∈ checkerBk ∧ SB + (1, 1) ∈ checkerAall ∧ SB + (2, 2) ∈ spaces, SB + (2, 2)], If[SB ∈ checkerBk ∧ SB + (-1, 1) ∈ checkerAall ∧ SB + (-2, 2) ∈ spaces, SB + (-2, 2)]}) → jumpBto
  48. If(jumpableAs ≟ {} ∧ jumpableAk ≟ {}, Union[movableAs, movableAk], jumpableAs ≠ {} ∧ jumpableAk ≠ {}, Union[jumpableAs, jumpableAk], jumpableAs ≠ {} ∧ jumpableAk ≟ {}, jumpableAs, jumpableAs ≟ {} ∧ jumpableAk ≠ {}, jumpableAk) → movableAall
  49. If(jumpableBs ≟ {} ∧ jumpableBk ≟ {}, Union[movableBs, movableBk], jumpableBs ≠ {} ∧ jumpableBk ≠ {}, Union[jumpableBs, jumpableBk], jumpableBs ≠ {} ∧ jumpableBk ≟ {}, jumpableBs, jumpableBs ≟ {} ∧ jumpableBk ≠ {}, jumpableBk) → movableBall
  50. RemoveUndefined({If[SA + (1, 1) ∈ spaces, SA + (1, 1)], If[SA + (-1, 1) ∈ spaces, SA + (-1, 1)], If[SA ∈ checkerAk ∧ SA + (1, -1) ∈ spaces, SA + (1, -1)], If[SA ∈ checkerAk ∧ SA + (-1, -1) ∈ spaces, SA + (-1, -1)]}) → moveAto
  51. RemoveUndefined({If[SB + (1, -1) ∈ spaces, SB + (1, -1)], If[SB + (-1, -1) ∈ spaces, SB + (-1, -1)], If[SB ∈ checkerBk ∧ SB + (1, 1) ∈ spaces, SB + (1, 1)], If[SB ∈ checkerBk ∧ SB + (-1, 1) ∈ spaces, SB + (-1, 1)]}) → moveBto
  52. If(movableBall ≟ {} ∨ checkerBall ≟ {}, true, false) → winnerA
  53. If(movableAall ≟ {} ∨ checkerAall ≟ {}, true, false) → winnerB
  54. Polygon(Corner[1], Corner[2], Corner[3], Corner[4]) → maskEndgame, f, g, h, i

AI Drawing Prompt Reference

Draw a geometry-based English checkers board: construct an 8×8 grid using individual square polygon cells for the playable squares and add a single outer board boundary polygon. Include two groups of checker positions representing two sides, and treat them as sets of occupied coordinates. Generate candidate landing coordinates by considering diagonal neighbor offsets and then filter them using a jump rule: a landing square is valid only if the adjacent diagonal square contains an opponent piece while the landing square is inside the playable empty spaces. Remove undefined candidates so only feasible landing squares remain, and if no jumps exist for a side, use the simpler one-step diagonal empty-square condition to determine movable squares. Display the resulting jumpable and movable target cells on top of the board with distinct highlights.
The prompt above was compiled from the original drawing commands and is for reference only.