Geometric Modeling and Jump Validity in English Checkers
Loading the math board and drawing, please wait…
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
Flatten(Sequence[Sequence[(k + Mod[l + 1, 2], l), l, 1, 8], k, 1, 7, 2]) → allUnion(checkerAs, checkerAk) → checkerAallUnion(checkerBs, checkerBk) → checkerBallRemoveUndefined(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]]) → jumpableBsRemoveUndefined(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]]) → jumpableAsRemoveUndefined(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]]) → jumpableBkRemoveUndefined(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]]) → jumpableAkIf(jumpableBs ≟ {}, RemoveUndefined[Sequence[If[checkerBs(k) + (1, -1) ∈ spaces ∨ checkerBs(k) + (-1, -1) ∈ spaces, checkerBs(k)], k, 1, Length[checkerBs]]], jumpableBs) → movableBsIf(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) → movableBkIf(jumpableAs ≟ {}, RemoveUndefined[Sequence[If[checkerAs(k) + (1, 1) ∈ spaces ∨ checkerAs(k) + (-1, 1) ∈ spaces, checkerAs(k)], k, 1, Length[checkerAs]]], jumpableAs) → movableAsIf(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) → movableAkPolygon({(1 - 0.5, 3 - 0.5), (1 + 0.5, 3 - 0.5), (1 + 0.5, 3 + 0.5), (1 - 0.5, 3 + 0.5)}) → s13Polygon({(1 - 0.5, 5 - 0.5), (1 + 0.5, 5 - 0.5), (1 + 0.5, 5 + 0.5), (1 - 0.5, 5 + 0.5)}) → s15Polygon({(1 - 0.5, 7 - 0.5), (1 + 0.5, 7 - 0.5), (1 + 0.5, 7 + 0.5), (1 - 0.5, 7 + 0.5)}) → s17Polygon({(1 - 0.5, 1 - 0.5), (1 + 0.5, 1 - 0.5), (1 + 0.5, 1 + 0.5), (1 - 0.5, 1 + 0.5)}) → s11Polygon({(2 - 0.5, 2 - 0.5), (2 + 0.5, 2 - 0.5), (2 + 0.5, 2 + 0.5), (2 - 0.5, 2 + 0.5)}) → s22Polygon({(2 - 0.5, 4 - 0.5), (2 + 0.5, 4 - 0.5), (2 + 0.5, 4 + 0.5), (2 - 0.5, 4 + 0.5)}) → s24Polygon({(2 - 0.5, 6 - 0.5), (2 + 0.5, 6 - 0.5), (2 + 0.5, 6 + 0.5), (2 - 0.5, 6 + 0.5)}) → s26Polygon({(2 - 0.5, 8 - 0.5), (2 + 0.5, 8 - 0.5), (2 + 0.5, 8 + 0.5), (2 - 0.5, 8 + 0.5)}) → s28Polygon({(3 - 0.5, 3 - 0.5), (3 + 0.5, 3 - 0.5), (3 + 0.5, 3 + 0.5), (3 - 0.5, 3 + 0.5)}) → s33Polygon({(3 - 0.5, 5 - 0.5), (3 + 0.5, 5 - 0.5), (3 + 0.5, 5 + 0.5), (3 - 0.5, 5 + 0.5)}) → s35Polygon({(3 - 0.5, 7 - 0.5), (3 + 0.5, 7 - 0.5), (3 + 0.5, 7 + 0.5), (3 - 0.5, 7 + 0.5)}) → s37Polygon({(3 - 0.5, 1 - 0.5), (3 + 0.5, 1 - 0.5), (3 + 0.5, 1 + 0.5), (3 - 0.5, 1 + 0.5)}) → s31Polygon({(4 - 0.5, 4 - 0.5), (4 + 0.5, 4 - 0.5), (4 + 0.5, 4 + 0.5), (4 - 0.5, 4 + 0.5)}) → s44Polygon({(4 - 0.5, 6 - 0.5), (4 + 0.5, 6 - 0.5), (4 + 0.5, 6 + 0.5), (4 - 0.5, 6 + 0.5)}) → s46Polygon({(4 - 0.5, 8 - 0.5), (4 + 0.5, 8 - 0.5), (4 + 0.5, 8 + 0.5), (4 - 0.5, 8 + 0.5)}) → s48Polygon({(4 - 0.5, 2 - 0.5), (4 + 0.5, 2 - 0.5), (4 + 0.5, 2 + 0.5), (4 - 0.5, 2 + 0.5)}) → s42Polygon({(5 - 0.5, 3 - 0.5), (5 + 0.5, 3 - 0.5), (5 + 0.5, 3 + 0.5), (5 - 0.5, 3 + 0.5)}) → s53Polygon({(5 - 0.5, 5 - 0.5), (5 + 0.5, 5 - 0.5), (5 + 0.5, 5 + 0.5), (5 - 0.5, 5 + 0.5)}) → s55Polygon({(5 - 0.5, 7 - 0.5), (5 + 0.5, 7 - 0.5), (5 + 0.5, 7 + 0.5), (5 - 0.5, 7 + 0.5)}) → s57Polygon({(5 - 0.5, 1 - 0.5), (5 + 0.5, 1 - 0.5), (5 + 0.5, 1 + 0.5), (5 - 0.5, 1 + 0.5)}) → s51Polygon({(6 - 0.5, 4 - 0.5), (6 + 0.5, 4 - 0.5), (6 + 0.5, 4 + 0.5), (6 - 0.5, 4 + 0.5)}) → s64Polygon({(6 - 0.5, 6 - 0.5), (6 + 0.5, 6 - 0.5), (6 + 0.5, 6 + 0.5), (6 - 0.5, 6 + 0.5)}) → s66Polygon({(6 - 0.5, 8 - 0.5), (6 + 0.5, 8 - 0.5), (6 + 0.5, 8 + 0.5), (6 - 0.5, 8 + 0.5)}) → s68Polygon({(6 - 0.5, 2 - 0.5), (6 + 0.5, 2 - 0.5), (6 + 0.5, 2 + 0.5), (6 - 0.5, 2 + 0.5)}) → s62Polygon({(7 - 0.5, 3 - 0.5), (7 + 0.5, 3 - 0.5), (7 + 0.5, 3 + 0.5), (7 - 0.5, 3 + 0.5)}) → s73Polygon({(7 - 0.5, 5 - 0.5), (7 + 0.5, 5 - 0.5), (7 + 0.5, 5 + 0.5), (7 - 0.5, 5 + 0.5)}) → s75Polygon({(7 - 0.5, 7 - 0.5), (7 + 0.5, 7 - 0.5), (7 + 0.5, 7 + 0.5), (7 - 0.5, 7 + 0.5)}) → s77Polygon({(7 - 0.5, 1 - 0.5), (7 + 0.5, 1 - 0.5), (7 + 0.5, 1 + 0.5), (7 - 0.5, 1 + 0.5)}) → s71Polygon({(8 - 0.5, 4 - 0.5), (8 + 0.5, 4 - 0.5), (8 + 0.5, 4 + 0.5), (8 - 0.5, 4 + 0.5)}) → s84Polygon({(8 - 0.5, 6 - 0.5), (8 + 0.5, 6 - 0.5), (8 + 0.5, 6 + 0.5), (8 - 0.5, 6 + 0.5)}) → s86Polygon({(8 - 0.5, 8 - 0.5), (8 + 0.5, 8 - 0.5), (8 + 0.5, 8 + 0.5), (8 - 0.5, 8 + 0.5)}) → s88Polygon({(8 - 0.5, 2 - 0.5), (8 + 0.5, 2 - 0.5), (8 + 0.5, 2 + 0.5), (8 - 0.5, 2 + 0.5)}) → s82Polygon({(0.5, 0.5), (8.5, 0.5), (8.5, 8.5), (0.5, 8.5)}) → boardedgeSequence(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) → boardRemoveUndefined({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)]}) → jumpAtoRemoveUndefined({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)]}) → jumpBtoIf(jumpableAs ≟ {} ∧ jumpableAk ≟ {}, Union[movableAs, movableAk], jumpableAs ≠ {} ∧ jumpableAk ≠ {}, Union[jumpableAs, jumpableAk], jumpableAs ≠ {} ∧ jumpableAk ≟ {}, jumpableAs, jumpableAs ≟ {} ∧ jumpableAk ≠ {}, jumpableAk) → movableAallIf(jumpableBs ≟ {} ∧ jumpableBk ≟ {}, Union[movableBs, movableBk], jumpableBs ≠ {} ∧ jumpableBk ≠ {}, Union[jumpableBs, jumpableBk], jumpableBs ≠ {} ∧ jumpableBk ≟ {}, jumpableBs, jumpableBs ≟ {} ∧ jumpableBk ≠ {}, jumpableBk) → movableBallRemoveUndefined({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)]}) → moveAtoRemoveUndefined({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)]}) → moveBtoIf(movableBall ≟ {} ∨ checkerBall ≟ {}, true, false) → winnerAIf(movableAall ≟ {} ∨ checkerAall ≟ {}, true, false) → winnerBPolygon(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.