-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bids and situations for a Stayman-like cue bid for lebensohl #105
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,31 +17,37 @@ module Bids.Lebensohl( | |
, b1No2D2S | ||
, b1No2D2N | ||
, b1No2D2N3CP | ||
, b1No2D2N3C3D | ||
, b1No2D2N3C3H | ||
, b1No2D2N3C3S | ||
, b1No2D2N3C3N | ||
, b1No2D3C | ||
, b1No2D3D | ||
, b1No2D3H | ||
, b1No2D3S | ||
, b1No2D3N | ||
, b1No2H2S | ||
, b1No2H2N | ||
, b1No2H2N3CP | ||
, b1No2H2N3C3D | ||
, b1No2H2N3C3H | ||
, b1No2H2N3C3S | ||
, b1No2H2N3C3N | ||
, b1No2H3C | ||
, b1No2H3D | ||
, b1No2H3H | ||
, b1No2H3S | ||
, b1No2H3N | ||
, b1No2S2N | ||
, b1No2S2N3CP | ||
, b1No2S2N3C3D | ||
, b1No2S2N3C3H | ||
, b1No2S2N3C3S | ||
, b1No2S2N3C3N | ||
, b1No2S3C | ||
, b1No2S3D | ||
, b1No2S3H | ||
, b1No2S3S | ||
, b1No2S3N | ||
-- For when the opponents show both majors | ||
, b1NoBM2N | ||
|
@@ -56,7 +62,7 @@ import Action(Action, withholdBid) | |
import qualified Bids.OneNotrump as NT | ||
import EDSL(minSuitLength, makeCall, makeAlertableCall, pointRange, forEach, | ||
forbid, balancedHand, hasStopper, alternatives, soundHolding, | ||
longerThan, atLeastAsLong) | ||
longerThan, atLeastAsLong, suitLength) | ||
import Output((.+)) | ||
import qualified Terminology as T | ||
|
||
|
@@ -278,6 +284,38 @@ b1NoBM2N3C3N :: Action | |
b1NoBM2N3C3N = bid3N_ [T.Hearts, T.Spades] True | ||
|
||
|
||
-- Stayman-like cue bids | ||
cueBid_ :: T.Suit -> Bool -> Action | ||
cueBid_ oppsSuit shouldHaveStopper = do | ||
NT.gameForcing | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider also requiring that you're balanced (or at least semibalanced?) to bid this: ending up in notrump with a void can be awkward. Also consider requiring that you have at most 4 cards in the opponent's suit. That's not important when the opponents make a two-suited bid, but I had an example where RHO overcalled a single-suited spade, and we were 5404. Stayman would probably be the right choice if RHO was two-suited (surely LHO will run to the second suit, which will be in our void), but RHO was single-suited, and I think a double is the right call. |
||
-- TODO: if the opponents overcall a natural 2D, do you need exactly 4-4 in | ||
-- the majors? What if you're 4-3? What if you're 5-4? | ||
forEach (filter (/= oppsSuit) T.majorSuits) (`suitLength` 4) | ||
when shouldHaveStopper (hasStopper oppsSuit) | ||
makeAlertableCall (T.Bid 3 oppsSuit) | ||
("Stayman with" ++ | ||
(if shouldHaveStopper then "" else "out") ++ | ||
" a stopper") | ||
|
||
b1No2D3D :: Action | ||
b1No2D3D = cueBid_ T.Diamonds False | ||
|
||
b1No2D2N3C3D :: Action | ||
b1No2D2N3C3D = cueBid_ T.Diamonds True | ||
|
||
b1No2H3H :: Action | ||
b1No2H3H = cueBid_ T.Hearts False | ||
|
||
b1No2H2N3C3H :: Action | ||
b1No2H2N3C3H = cueBid_ T.Hearts True | ||
|
||
b1No2S3S :: Action | ||
b1No2S3S = cueBid_ T.Spades False | ||
|
||
b1No2S2N3C3S :: Action | ||
b1No2S2N3C3S = cueBid_ T.Spades True | ||
|
||
|
||
-- Time for the actual lebensohl relays! | ||
b1N2N3C :: Action | ||
b1N2N3C = makeAlertableCall (T.Bid 3 T.Clubs) "relay completed" | ||
|
@@ -286,6 +324,7 @@ b1N2N3C = makeAlertableCall (T.Bid 3 T.Clubs) "relay completed" | |
b1No2D2N :: Action | ||
b1No2D2N = do | ||
alternatives [ b1No2D2N3CP | ||
, b1No2D2N3C3D | ||
, b1No2D2N3C3H | ||
, b1No2D2N3C3S | ||
, b1No2D2N3C3N | ||
|
@@ -297,6 +336,7 @@ b1No2H2N :: Action | |
b1No2H2N = do | ||
alternatives [ b1No2H2N3CP | ||
, b1No2H2N3C3D | ||
, b1No2H2N3C3H | ||
, b1No2D2N3C3S | ||
, b1No2D2N3C3N | ||
] | ||
|
@@ -308,6 +348,7 @@ b1No2S2N = do | |
alternatives [ b1No2S2N3CP | ||
, b1No2S2N3C3D | ||
, b1No2S2N3C3H | ||
, b1No2S2N3C3S | ||
, b1No2S2N3C3N | ||
] | ||
makeAlertableCall (T.Bid 2 T.Notrump) ("relay to " .+ T.Bid 3 T.Clubs) | ||
|
@@ -319,5 +360,6 @@ b1NoBM2N = do | |
alternatives [ b1No2S2N3CP | ||
, b1No2S2N3C3D | ||
, b1NoBM2N3C3N | ||
-- Don't bother with a Stayman-like bid: RHO has both majors | ||
] | ||
makeAlertableCall (T.Bid 2 T.Notrump) ("relay to " .+ T.Bid 3 T.Clubs) |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -371,12 +371,83 @@ bid3NWithoutStopper = let | |
<~ T.allVulnerabilities | ||
|
||
|
||
cueBidWithStopper :: Situations | ||
cueBidWithStopper = let | ||
sit (overcall, relay, bid) = let | ||
action = do | ||
setOpener T.North | ||
Leb.b1N | ||
_ <- overcall | ||
withholdBid bid | ||
explanation = | ||
"Partner opened a strong " .+ Leb.b1N .+ ", and RHO " .+ | ||
"interfered with the auction. We'd prefer to play in a " .+ | ||
"major-suit fit if we have one, but can tolerate " .+ | ||
T.Bid 3 T.Notrump .+ " without one because we have a stopper " .+ | ||
"in the opponent's suit. Relay through " .+ | ||
relay .+ ", then bid " .+ bid .+ " as Stayman. Partner can " .+ | ||
"bid the correct game, based on whether we've got a major-suit fit." | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mention how this bid is forcing, so we have the ability to investigate slam if we've got extra strength. Same comment below. |
||
in situation "rel3N" action relay explanation | ||
in | ||
wrap $ return sit <~ [ (Nat.b1No2D, Leb.b1No2D2N, Leb.b1No2D2N3C3D) | ||
, (Nat.b1No2H, Leb.b1No2H2N, Leb.b1No2H2N3C3H) | ||
, (Nat.b1No2S, Leb.b1No2S2N, Leb.b1No2S2N3C3S) | ||
, (DONT.b1No2D, Leb.b1No2D2N, Leb.b1No2D2N3C3D) | ||
-- DONT.b1No2H: skip Stayman when RHO has both majors | ||
, (DONT.b1No2S, Leb.b1No2S2N, Leb.b1No2S2N3C3S) | ||
, (MW.b1No2D, Leb.b1No2D2N, Leb.b1No2D2N3C3D) | ||
, (MW.b1No2H, Leb.b1No2H2N, Leb.b1No2H2N3C3H) | ||
, (MW.b1No2S, Leb.b1No2S2N, Leb.b1No2S2N3C3S) | ||
-- Capp.b1No2D: skip Stayman when RHO has both majors | ||
, (Capp.b1No2H, Leb.b1No2H2N, Leb.b1No2H2N3C3H) | ||
, (Capp.b1No2S, Leb.b1No2S2N, Leb.b1No2S2N3C3S) | ||
] | ||
-- East should be an unpassed hand to interfere. | ||
<~ [T.North, T.South, T.West] | ||
<~ T.allVulnerabilities | ||
|
||
|
||
cueBidWithoutStopper :: Situations | ||
cueBidWithoutStopper = let | ||
sit (overcall, bid) = let | ||
action = do | ||
setOpener T.North | ||
Leb.b1N | ||
overcall | ||
explanation = | ||
"Partner opened a strong " .+ Leb.b1N .+ ", and RHO " .+ | ||
"interfered with the auction. We'd prefer to play in a " .+ | ||
"major-suit fit if we have one, but if we don't, playing in " .+ | ||
T.Bid 3 T.Notrump .+ " might be risky, because we don't have a " .+ | ||
"stopper in the opponents' suit in our hand. Make a cue bid as " .+ | ||
"Stayman: partner can bid a major-suit game if we've got a fit, " .+ | ||
"can bid " .+ T.Bid 3 T.Notrump .+ " if we don't have a fit " .+ | ||
"but they have a stopper, and if we don't have a fit and " .+ | ||
"neither of us can stop the opponent's suit, we'll scramble " .+ | ||
"into a minor-suit contract or perhaps a 7-card fit." | ||
in situation "3N" action bid explanation | ||
in | ||
wrap $ return sit <~ [ (Nat.b1No2D, Leb.b1No2D3D) | ||
, (Nat.b1No2H, Leb.b1No2H3H) | ||
, (Nat.b1No2S, Leb.b1No2S3S) | ||
, (DONT.b1No2D, Leb.b1No2D3D) | ||
-- DONT.b1No2H: skip Stayman when RHO has both majors | ||
, (DONT.b1No2S, Leb.b1No2S3S) | ||
, (MW.b1No2D, Leb.b1No2D3D) | ||
, (MW.b1No2H, Leb.b1No2H3H) | ||
, (MW.b1No2S, Leb.b1No2S3S) | ||
-- Capp.b1No2D: skip Stayman when RHO has both majors | ||
, (Capp.b1No2H, Leb.b1No2H3H) | ||
, (Capp.b1No2S, Leb.b1No2S3S) | ||
] | ||
-- East should be an unpassed hand to interfere. | ||
<~ [T.North, T.South, T.West] | ||
<~ T.allVulnerabilities | ||
|
||
|
||
-- TODO: | ||
-- cue bid for Stayman | ||
-- relay to cue bid (answer should be 2N planning to rebid the cue) | ||
-- opener responds to Stayman | ||
-- pass or bid game after relay and invite (maybe not: should be obvious) | ||
-- opener uses normal systems after X or 2C | ||
|
||
|
||
topic :: Topic | ||
|
@@ -392,4 +463,5 @@ topic = makeTopic | |
, passSignoff | ||
, invite | ||
, wrap [bid3NWithStopper, bid3NWithoutStopper] | ||
, wrap [cueBidWithStopper, cueBidWithoutStopper] | ||
] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
line 254: remember to update the TODO.