Bridge Training

Player

Seat navigation, table roles, rotation and partnerships.

Two ways in:

AccessWhat you get
import { … } from "@workspace/bridge/player"Every function below.
engine.player.*A subset: getNextPlayer, getCurrentPlayer, getPlayersFromDealer, getPlayersInTrickOrder, rotatePlayerNTimes, getRotationCountToTarget, getPartnership, partnershipFromSide.

engine.player takes no configuration; it is a convenience grouping. isPlayer, getPartner, getPlayerAtOffset, getLeadPlayer, getRoles and getOpposingPartnership are only in @workspace/bridge/player.

Player is "N" | "E" | "S" | "W", Partnership is "NS" | "EW", PlayerSide is "attack" | "defense". Clockwise order is N → E → S → W.

FunctionSignatureDescription
isPlayer(value: string) => value is PlayerCase-insensitive guard.
getNextPlayer(player: Player) => PlayerLeft-hand opponent.
getPartner(player: Player) => PlayerOpposite seat.
getCurrentPlayer(dealer: Player, sequenceLength: number) => PlayerWhose turn after n calls from the dealer.
getPlayerAtOffset(start: Player, offset?: number) => Playern seats clockwise from start.
getPlayersFromDealer(dealer: Player) => [Player, Player, Player, Player]Clockwise from the dealer.
getPlayersInTrickOrder(lead: Player) => Player[]Clockwise from the leader.
player.ts
isPlayer("n"); // => true (case-insensitive)
getNextPlayer("N"); // => "E"
getPartner("N"); // => "S"
getCurrentPlayer("N", 3); // => "W" (the seat that bids 4th after a North dealer)
getPlayerAtOffset("W", 2); // => "E"
getPlayersFromDealer("S"); // => ["S", "W", "N", "E"]
getPlayersInTrickOrder("E"); // => ["E", "S", "W", "N"]

Table roles

FunctionSignatureDescription
getLeadPlayer(declarer?: Player) => PlayerOpening leader: left of declarer. Declarer defaults to South.
getRoles(declarer?: Player) => { lead: Player; dummy: Player }Lead and dummy relative to the declarer.
player.ts
getLeadPlayer("S"); // => "W" (left of declarer)
getRoles("S"); // => { lead: "W", dummy: "N" }
getRoles(); // defaults to a South declarer

Rotation

FunctionSignatureDescription
rotatePlayerNTimes(player: Player, count: number) => Playercount seats clockwise.
getRotationCountToTarget(from: Player, to: Player) => numberClockwise steps from from to to (0–3).
player.ts
rotatePlayerNTimes("N", 2); // => "S"
getRotationCountToTarget("N", "W"); // => 3

Partnerships and sides

N/S are the attacking (declaring) side by convention; E/W defend.

FunctionSignatureDescription
getPartnership(player: Player) => Partnership
getOpposingPartnership(partnership: Partnership) => Partnership
partnershipFromSide(side: PlayerSide) => Partnershipattack → NS, defense → EW.
player.ts
getPartnership("N"); // => "NS"
getOpposingPartnership("NS"); // => "EW"
partnershipFromSide("attack"); // => "NS"

Engine module

player.ts
const engine = createBridgeEngine(createBridgeContext());

engine.player.getNextPlayer("W"); // => "N"
engine.player.getPartnership("S"); // => "NS"