<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Play Pip</title>
    <description>The latest articles on DEV Community by Play Pip (@playpipio).</description>
    <link>https://dev.to/playpipio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4194469%2F58c61a3b-8390-4d76-a81e-24c707824377.png</url>
      <title>DEV Community: Play Pip</title>
      <link>https://dev.to/playpipio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/playpipio"/>
    <language>en</language>
    <item>
      <title>A poker rating that ignores whether you won the hand</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Thu, 05 Nov 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/a-poker-rating-that-ignores-whether-you-won-the-hand-3him</link>
      <guid>https://dev.to/playpipio/a-poker-rating-that-ignores-whether-you-won-the-hand-3him</guid>
      <description>&lt;h2&gt;
  
  
  The problem with counting wins
&lt;/h2&gt;

&lt;p&gt;Poker results are mostly the cards. You can play a hand perfectly and lose it, and play it badly and win, and over an evening the cards can hide which of those you did. A rating built on who won would mostly be a rating of luck.&lt;/p&gt;

&lt;p&gt;The Pip Rating ignores who won. It looks at each decision when you made it, with the cards you could see, and asks how much that decision gave away against the other choice. A right call that loses to a river card costs you nothing. A bad call that gets lucky still costs what it cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it grades
&lt;/h2&gt;

&lt;p&gt;Two kinds of decision. Every call or fold you make facing a bet, priced in big blinds from your equity and the price you were offered. And your first move when it folds round to you before the flop, graded against the two charts the app already teaches: the shove chart when you have 15 big blinds or fewer, the opening chart from 25.&lt;/p&gt;

&lt;p&gt;It does not grade bets and raises after the flop. What they are worth depends on how often the other player folds, and the only players we could measure that against are Pip’s own. A rating built on that would reward beating our AI, which is not the same thing as playing well. The hand review still grades those, with every card face up.&lt;/p&gt;

&lt;p&gt;It counts Hold’em hands at the ladder, the Rail, the Daily, the freeroll and the Hold’em side tables. Not the other variants, not drills, and not rooms with friends, for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scale
&lt;/h2&gt;

&lt;p&gt;Each decision has a stake (the pot plus the price) and a cost (what it gave up, at most 20 big blinds). Your rating comes from the share of the stake you gave away, over roughly your last 300 decisions, with recent ones counting more.&lt;/p&gt;

&lt;p&gt;Give away 2.5% and you rate 1,000. Every time you halve that, you gain 350 points: 1.25% is 1,350, 0.625% is 1,700. Double it and you lose 350: 5% is 650.&lt;/p&gt;

&lt;p&gt;Weighting by stake is what stops the obvious trick. Fold everything and you make hundreds of cheap, correct folds, but the few expensive ones you get wrong carry the weight.&lt;/p&gt;

&lt;p&gt;The bands are Learning (under 800), Steady (800), Solid (1,200), Strong (1,600), Expert (2,000), Master (2,400).&lt;/p&gt;

&lt;h2&gt;
  
  
  Where people land
&lt;/h2&gt;

&lt;p&gt;We seated scripted players at real tables against each table’s own AI and rated their hands exactly as the app does, a few hundred rated decisions each, so each figure is give or take about 100. Calling every bet rated about 400. So did folding to every bet, and so did calling or folding on a coin flip. Paying everything and paying nothing land in the same place.&lt;/p&gt;

&lt;p&gt;The best player we could script, which plays the shove chart exactly, rated 1,670 to 2,160. So 2,000 sits at about the edge of the best play Pip has, and most people will never see it. That is on purpose. Nobody reaches 2,000 in chess in a month either.&lt;/p&gt;

&lt;p&gt;Those scripted players decide with the same equity estimate that grades them, so they agree with the grader more than a person would. Real players will sit lower than their script. We would guess a careful beginner starts somewhere around 600 to 900, and we will know more once enough people have played.&lt;/p&gt;

&lt;h2&gt;
  
  
  New players
&lt;/h2&gt;

&lt;p&gt;Everyone starts at 1,000. The rating is provisional until 50 rated decisions. After that the number is held under 1,600 until 300 decisions, under 2,000 until 1,000, and under 2,400 until 2,500. A good week is not a career. Your play still counts in full underneath, so the number catches up when a cap lifts, and the app tells you when one is holding you back.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the server can and cannot check
&lt;/h2&gt;

&lt;p&gt;Hands against the AI are dealt and played on your device. The server never sees a hand, only the list of decisions and what each cost. Someone determined could send decisions that never happened, and no check can prove otherwise.&lt;/p&gt;

&lt;p&gt;What it can do is make that slow and visible. It works the rating out again itself rather than trusting the number your device sends. It refuses decisions that cost more than they could, hands less than two seconds apart, hands it has already counted, and more than900 decisions an hour. Once you are rated, one batch of hands moves you at most 60 points. And a record of 2,600 or better after 200 decisions comes off the leaderboard until a person has looked at it.&lt;/p&gt;

&lt;p&gt;Someone patient enough can still beat that. If it becomes a problem, the fix is to rate only hands our server deals, which is how rooms with friends already work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who sees what
&lt;/h2&gt;

&lt;p&gt;The number is free for everyone. Make an account and you are on the leaderboard, and you can take yourself off it at any time without your rating stopping. It is the one ranking on Pip anyone else can see. Your chips and your Roll title stay private.&lt;/p&gt;

&lt;p&gt;Nothing you can buy raises it, because it measures decisions, and more tables or more chips do not make a call any better. What &lt;a href="https://playpip.io/membership?for=rating&amp;amp;from=blog&amp;amp;post=pip-rating-grades-decisions" rel="noopener noreferrer"&gt;members&lt;/a&gt; get is the rating drawn day by day, and which kinds of decision are moving it. The number tells you where you are. The breakdown tells you which of your folds is doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The arithmetic is one file, &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/rating/maths.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/rating/maths.ts&lt;/code&gt;&lt;/a&gt;, and the server runs an exact copy of it. The opening and shove grades are &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/rating/preflop.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/rating/preflop.ts&lt;/code&gt;&lt;/a&gt;. The scripted players are &lt;a href="https://github.com/playpip/pip-web/blob/main/scripts/rating-calibrate.ts" rel="noopener noreferrer"&gt;&lt;code&gt;scripts/rating-calibrate.ts&lt;/code&gt;&lt;/a&gt;, run on 5 November 2026, and &lt;a href="https://github.com/playpip/pip-web/blob/main/docs/rating.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/rating.md&lt;/code&gt;&lt;/a&gt; has the full table and everything the server checks. Every figure on this page except the calibration comes from the code at build time, so if the scale changes, this page changes with it.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>learning</category>
    </item>
    <item>
      <title>Set mining needs a deep stack. How long each table gives you one</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/set-mining-needs-a-deep-stack-how-long-each-table-gives-you-one-28hn</link>
      <guid>https://dev.to/playpipio/set-mining-needs-a-deep-stack-how-long-each-table-gives-you-one-28hn</guid>
      <description>&lt;h2&gt;
  
  
  The call
&lt;/h2&gt;

&lt;p&gt;Set mining is calling a raise with a small pair for one reason: to flop three of a kind. If the flop misses, you fold. If it hits, you hope somebody has a hand they like.&lt;/p&gt;

&lt;p&gt;The flop brings your third card 2,304 times in 19,600 (&lt;a href="https://playpip.io/learn/how-often-do-you-flop-a-set" rel="noopener noreferrer"&gt;how often you flop a set&lt;/a&gt; has the full count). The other 17,296 times it does not. That is 7.5 misses for every hit, and every miss costs the call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the hit has to win
&lt;/h2&gt;

&lt;p&gt;Say the raise is to 3 big blinds. Each miss costs 3, so to break even each hit has to win back 7.5 of those, about 23 big blinds, on top of the 3 it cost. Call it 26 big blinds in front of you.&lt;/p&gt;

&lt;p&gt;The raiser needs them too. You can only win what they have, so the number that counts is the smaller of the two stacks.&lt;/p&gt;

&lt;p&gt;And 26 is the floor. It assumes every set wins and every raiser pays you all of it. Sets lose, and people fold. The real number is higher, but nobody can tell you by how much without knowing who you are playing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long a table keeps 26 big blinds
&lt;/h2&gt;

&lt;p&gt;In a tournament the blinds go up, so the same stack is worth fewer big blinds every level. Here is how many hands each of Pip’s tables deals before the stack you sat down with is under 26 big blinds, with the ladder table and Deep Stack at the same buy-in side by side.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;750 chips: The Pool Hall starts you at 75 big blinds and keeps 26 for 20 hands. Deep Stack starts you at 225 and keeps it for 72.&lt;/li&gt;
&lt;li&gt;2,000 chips: The Card Room starts you at 67 big blinds and keeps 26 for 18 hands. Deep Stack starts you at 200 and keeps it for 60.&lt;/li&gt;
&lt;li&gt;5,000 chips: Downtown Casino starts you at 100 big blinds and keeps 26 for 18 hands. Deep Stack starts you at 300 and keeps it for 84.&lt;/li&gt;
&lt;li&gt;15,000 chips: The Riverboat starts you at 100 big blinds and keeps 26 for 18 hands. Deep Stack starts you at 300 and keeps it for 84.&lt;/li&gt;
&lt;li&gt;40,000 chips: The Penthouse starts you at 100 big blinds and keeps 26 for 18 hands. Deep Stack starts you at 300 and keeps it for 84.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ladder gives you 18 to 20 hands of set mining. Deep Stack gives you 60 to 84, more than three times as many at every price. With three times the chips and the same opening blinds, the blinds have to climb three times as high before the stack runs short, and Deep Stack’s levels last twelve hands at every price.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not count
&lt;/h2&gt;

&lt;p&gt;It counts the stack you sat down with. Win a pot and you are deeper than this, lose one and you are shorter, and the raiser’s stack moves the same way. Nor does anyone at the table promise to raise to 3 big blinds. Treat the numbers as a clock, not a forecast: they say when the blinds alone stop the call paying, and nothing about your cards.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/playpip/pip-web/blob/main/src/config/setMining.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/config/setMining.ts&lt;/code&gt;&lt;/a&gt; takes the flop count from the same file the set guide prints it from, and walks each table’s blinds hand by hand through &lt;a href="https://github.com/playpip/pip-web/blob/main/src/config/blinds.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/config/blinds.ts&lt;/code&gt;&lt;/a&gt;, which is what the tables post their blinds with. &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/setMining.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/setMining.test.ts&lt;/code&gt;&lt;/a&gt; deals every flop again to recount the 2,304, and checks every figure on this page. Change a table’s blinds and this page changes with it, or the build fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;Deep Stack is a side table in the &lt;a href="https://playpip.io/membership?for=rooms&amp;amp;from=blog&amp;amp;post=deep-stack-set-mining" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, at five prices from 750 to 40,000. The ladder stays free, and so does folding your sevens.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Calling a river bet: when the answer depends on who is betting</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/calling-a-river-bet-when-the-answer-depends-on-who-is-betting-5cc7</link>
      <guid>https://dev.to/playpipio/calling-a-river-bet-when-the-answer-depends-on-who-is-betting-5cc7</guid>
      <description>&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;They bet the river. You have a pair. Calling costs a share of the pot you would win, and your hand has to win at least that often to be worth it. A bet of half the pot needs 25%. A bet of the pot needs 33.3%.&lt;/p&gt;

&lt;p&gt;That half is arithmetic. The other half is how often your pair wins against the hands that bet like this, and that depends on how many of those bets are bluffs. We dealt 40,000 hands through Pip’s river drill to see how often that changes the answer. In 39,746 of 157,878 river decisions, it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The price
&lt;/h2&gt;

&lt;p&gt;A call wins the pot plus their bet, and it costs your bet. So the share you pay is the bet over the pot plus both bets. The bigger the bet, the more often you need to win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bet of a fifth of the pot: you need to win 14.3%&lt;/li&gt;
&lt;li&gt;A bet of a third of the pot: you need to win 20%&lt;/li&gt;
&lt;li&gt;A bet of half the pot: you need to win 25%&lt;/li&gt;
&lt;li&gt;A bet of three-quarters of the pot: you need to win 30%&lt;/li&gt;
&lt;li&gt;A bet of the pot: you need to win 33.3%&lt;/li&gt;
&lt;li&gt;A bet of twice the pot: you need to win 40%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this depends on who is betting. Everything after it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is betting
&lt;/h2&gt;

&lt;p&gt;Pip’s river drill reads a bet as two kinds of hand. Value: the stronger half of the made hands they could have, or the strongest third when the bet is more than two-thirds of the pot. And bluffs: hands that missed, counted at a weight, because they bet some of those and not all of them.&lt;/p&gt;

&lt;p&gt;The weight is the one number nobody can know about a stranger. So the drill prices every spot twice, once at the rate Pip’s AI players at Friends’ Garage bluff, the bottom of the ladder, and once at The Main Event’s, the top, where they bluff a good deal more. Those rates were measured from the AI players’ own river bets, not chosen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;p&gt;Of 40,000 shuffles, 13,294 left you with a hand you would have played and a pair or better of your own on the river. Each was priced at twelve bet sizes, from a fifth of the pot to twice it: 157,878 different decisions. In 39,746 of them the call was right against one of those two players and wrong against the other.&lt;/p&gt;

&lt;p&gt;That share hardly moves with the size of the bet. Out of 13,294 hands, it is between 2,830 and 4,053 at every size. What moves is the rest. Facing a fifth of the pot, the call was right against both players 6,530 times and wrong against both 3,139 times. Facing twice the pot, it was right against both 3,041 times and wrong against both 7,241.&lt;/p&gt;

&lt;p&gt;Some of that is the price, and some is that the drill assumes a big bet is a stronger hand. Either way the lesson is a dull one. Against a small bet a pair is right to call about twice as often as it is right to fold, against a big one the other way round, and about one time in four the hand in front of you is not what decides it. The player is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the drill does about it
&lt;/h2&gt;

&lt;p&gt;It leaves those out. A spot is only asked when the answer is the same against both players, and clear of the line by four points at each end. 1,033 of the 40,000 shuffles became a question. So the drill never marks you wrong for a call that was right against the other player.&lt;/p&gt;

&lt;p&gt;A real table does not leave them out. There, knowing who bluffs is your job, and the price is the only part anybody can work out for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/drills/riverBluffCount.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/drills/riverBluffCount.ts&lt;/code&gt;&lt;/a&gt; deals the drill’s own spots, the same deal and prices the drill grades, and sorts each bet into right to call, right to fold, or depends. The model of what bets is &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/drills/riverRange.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/drills/riverRange.ts&lt;/code&gt;&lt;/a&gt;, where the measured bluffing rates are written down. The counts on this page are in &lt;a href="https://github.com/playpip/pip-web/blob/main/src/config/riverBluffs.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/config/riverBluffs.ts&lt;/code&gt;&lt;/a&gt;, and &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/riverBluffCount.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/riverBluffCount.test.ts&lt;/code&gt;&lt;/a&gt; counts them again on every build.&lt;/p&gt;

&lt;p&gt;Every win share is exact against the model: each hand they could hold is compared with yours once. They are counts over a model of what bets, not over hands people played. Boards that make two pair on their own are left out, as the drill leaves them out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;Calling the river is a drill in the &lt;a href="https://playpip.io/membership?for=river&amp;amp;from=blog&amp;amp;post=calling-a-river-bet" rel="noopener noreferrer"&gt;membership&lt;/a&gt;. The page that link opens deals one spot from it. &lt;em&gt;What have you got?&lt;/em&gt; and &lt;em&gt;Which hand wins?&lt;/em&gt; stay free, with the ladder, the Rail, the Daily and the freeroll.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>gamedev</category>
      <category>learning</category>
    </item>
    <item>
      <title>The most you can bet in Pot-Limit Omaha</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Tue, 27 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/the-most-you-can-bet-in-pot-limit-omaha-38j8</link>
      <guid>https://dev.to/playpipio/the-most-you-can-bet-in-pot-limit-omaha-38j8</guid>
      <description>&lt;h2&gt;
  
  
  Raise the pot, after you call
&lt;/h2&gt;

&lt;p&gt;In Pot-Limit Omaha the most you can bet is the pot. That part is easy. The part people stop and count on their fingers is raising: you may raise by the size of the pot &lt;em&gt;after&lt;/em&gt; you have called. Put the call in, look at the pot, and raise by that much.&lt;/p&gt;

&lt;p&gt;Every number below is from The Big Pot, Pip’s Omaha table: 6 seats, 10,000 chips each, blinds of 25 and 50 to start. None of them were worked out by hand. They are what the table itself lets you put in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first raise
&lt;/h2&gt;

&lt;p&gt;Before the flop the pot is the two blinds, 75. The first player to act calls 50, which makes it 125, and raises by that: 175 in all. Three and a half big blinds, which is the number to remember.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everybody re-raises
&lt;/h2&gt;

&lt;p&gt;Now let every player in turn raise as much as they are allowed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under the gun: to 175, the first raise&lt;/li&gt;
&lt;li&gt;Hijack: to 600&lt;/li&gt;
&lt;li&gt;Cutoff: to 2,050&lt;/li&gt;
&lt;li&gt;Button: to 7,000&lt;/li&gt;
&lt;li&gt;Small blind: all-in for 10,000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fifth raise is the whole stack. The pot would allow more, and there is no more. 200 big blinds sounds deep until four people have raised the pot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shortcut, and the blind it misses
&lt;/h2&gt;

&lt;p&gt;The sum players do in their heads is three times the bet you face, plus whatever was in before it. The hijack faces 175 with 75 of blinds behind it: three times 175 is 525, plus 75, is 600. Right.&lt;/p&gt;

&lt;p&gt;For a blind it is out by the blind. Fold round to the big blind instead and it faces the same 175, but 50 of the pot is already its own, and the call is only 125. The most it may make it is 550, not 600. So: three times the bet, plus what was in before it, less what you already put in on this street.&lt;/p&gt;

&lt;h2&gt;
  
  
  After the flop
&lt;/h2&gt;

&lt;p&gt;Say the first raise is called by the big blind and everyone else folds. The flop pot is 375, and the big blind, first to act, may bet 375: the pot, since there is nothing to call. Raising that is the shortcut again with nothing of yours in yet, three bets and the pot, which is 1,500.&lt;/p&gt;

&lt;p&gt;A pot that starts at 375 can be 2,250 before anyone has called anything on the flop. Pot limit is a limit. It does not feel like one for long.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;The rule lives in one function in &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/engine.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/engine.ts&lt;/code&gt;&lt;/a&gt;, the engine that deals every hand at The Big Pot and at The Split, Pip’s Omaha Hi-Lo table, which is pot-limit too. &lt;a href="https://github.com/playpip/pip-web/blob/main/src/config/potLimit.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/config/potLimit.ts&lt;/code&gt;&lt;/a&gt; plays the hands above through that engine and prints what it allows, and &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/potLimit.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/potLimit.test.ts&lt;/code&gt;&lt;/a&gt; checks the shortcut against every one of them. So this page cannot print a number the table would refuse, and the shortcut cannot drift from the table without the build failing.&lt;/p&gt;

&lt;p&gt;You do not have to do the sum at the table. The Max button on the bet slider is the pot limit, or your stack if that is smaller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;The Big Pot and The Split are side tables in the &lt;a href="https://playpip.io/membership?for=omaha&amp;amp;from=blog&amp;amp;post=pot-limit-omaha-max-bet" rel="noopener noreferrer"&gt;membership&lt;/a&gt;. The ladder, the Rail, the Daily and the freeroll stay free, and so does the arithmetic.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The house edge in Blackjack when you can only hit or stand</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/the-house-edge-in-blackjack-when-you-can-only-hit-or-stand-phh</link>
      <guid>https://dev.to/playpipio/the-house-edge-in-blackjack-when-you-can-only-hit-or-stand-phh</guid>
      <description>&lt;h2&gt;
  
  
  The numbers on the cards
&lt;/h2&gt;

&lt;p&gt;Pip’s Blackjack has two buttons, hit and stand. There is no doubling, no splitting and no surrender. Each of the three tables states its house edge on the card before you sit down, because a number you have to work out for yourself is a number somebody hoped you would not.&lt;/p&gt;

&lt;p&gt;So we played 40 million hands at each table, through the same code that deals them in the app, and counted what the house kept.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Friendly (single deck, 3:2 on a natural, dealer stands on soft 17): the card said 2%, the hands said 1.99%.&lt;/li&gt;
&lt;li&gt;Standard (six decks, 3:2 on a natural, dealer stands on soft 17): the card said 2.4%, the hands said 2.34%.&lt;/li&gt;
&lt;li&gt;Brutal (eight decks, 6:5 on a natural, dealer hits soft 17): the card said 4.1%, the hands said 3.94%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Friendly was right. The other two were wrong, both by saying the house took more than it does, which is the less embarrassing way to be wrong. It is still wrong on the one screen whose whole point is the number, so the cards now say 2.3% and 3.9%.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the rules are worth
&lt;/h2&gt;

&lt;p&gt;Friendly and Standard differ only in the shoe: one deck against six. That alone is worth 0.35 points to you. Part of it is naturals: they come a little more often from one deck, and a natural is the only hand that pays more than evens.&lt;/p&gt;

&lt;p&gt;Brutal changes three things at once. Eight decks, the dealer hits a soft seventeen, and a natural pays six for five instead of three for two. Together they cost 1.60 points more than Standard. Most of that is the six for five: a natural comes about once in twenty-one hands, and it now pays three tenths of a bet less each time.&lt;/p&gt;

&lt;p&gt;Every table here takes more than a casino table with the same shoe and payouts, because doubling and splitting are gone, and both were yours to use. We took them out to keep the game to one decision. The edge on the card is what that decision costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to play it
&lt;/h2&gt;

&lt;p&gt;With only hit and stand, the best play fits in a paragraph. Take a card on 11 or less. Stand on 17 or more. On 12, stand against a dealer 4, 5 or 6 and hit against anything else. On 13 to 16, stand against 2 to 6 and hit against 7 or higher. With an ace counted as eleven, hit 17 or less, hit 18 against a 9, a ten or an ace, and stand on 19 or more.&lt;/p&gt;

&lt;p&gt;If you know the usual chart, two things change. A hard 9, 10 or 11 you would double you now just hit, a soft 18 you would double against a 3 to 6 you stand on, and a pair is only its total. A pair of eights is a hard 16, and you hit it against a ten, grimly.&lt;/p&gt;

&lt;p&gt;That is the whole strategy the 40 million hands were played with. Play any other way and the house takes more than the card says.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/playpip/pip-web/blob/main/scripts/blackjack-edge.ts" rel="noopener noreferrer"&gt;&lt;code&gt;scripts/blackjack-edge.ts&lt;/code&gt;&lt;/a&gt; deals hands through Pip’s Blackjack engine, reshuffles where the app reshuffles, plays each one by the strategy above, and reports the share of each stake the house kept. It ran two separate seeds of 20 million hands a table. Each figure carries a standard error of about 0.016 points, so the first decimal is solid and the second is close.&lt;/p&gt;

&lt;p&gt;The strategy was worked out exactly for a shoe with no bottom, where every card is as likely as it was at the start. Over that endless shoe the same strategy loses 2.4% at Standard’s rules and 4.0% at Brutal’s. A real shoe does slightly better for you than an endless one, which is why every dealt figure sits below these.&lt;/p&gt;

&lt;p&gt;The count takes three minutes and is not re-run by the test suite. &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/blackjackEdge.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/blackjackEdge.test.ts&lt;/code&gt;&lt;/a&gt; holds the part it can: each card states the edge its table played at, to one decimal, read from &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/blackjack/rules.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/blackjack/rules.ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;Blackjack is in the &lt;a href="https://playpip.io/membership?for=blackjack&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, with the Friendly, Standard and Brutal tables and their edges on show before you pick one. The chips are play money and are never for sale. It is not poker, and it does not pretend to be.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>science</category>
    </item>
    <item>
      <title>Turn-based poker with friends who are never free at once</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/turn-based-poker-with-friends-who-are-never-free-at-once-2hia</link>
      <guid>https://dev.to/playpipio/turn-based-poker-with-friends-who-are-never-free-at-once-2hia</guid>
      <description>&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;A slow game is a private Texas Hold’em table where each move gets hours, not seconds. You check on the bus, your friend calls after lunch, the river comes the next morning. Nobody has to be free at the same time, which for most groups of friends is the whole problem.&lt;/p&gt;

&lt;p&gt;The host needs the membership. Everybody else needs a free account and the invite. The chips are play chips.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the host picks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2, 3 or 4 seats, heads-up unless you change it, and no AI players in the empty ones;&lt;/li&gt;
&lt;li&gt;time for each move: 1, 4, 12 or 24 hours;&lt;/li&gt;
&lt;li&gt;how it ends: last player standing, after 20, 50 or 100 hands, or on a date, when the hand in play finishes and the biggest stack wins;&lt;/li&gt;
&lt;li&gt;the stake, starting chips, how fast the blinds climb, and whether the chips come from the Roll or it is just for fun, the same as &lt;a href="https://playpip.io/blog/poker-night-with-friends-online" rel="noopener noreferrer"&gt;a live room&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The blinds climb by hands played, not by the hour, so a game that takes a fortnight is not all blinds by the end of it. You can be in 10 slow games at once, which is more than most people have friends who answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The clock stops while you sleep
&lt;/h2&gt;

&lt;p&gt;Each player sets their own quiet hours, 23:00 to 08:00 unless they change them, in their own timezone. Your move clock does not run during yours. A one-hour clock that starts at 22:30 has half an hour that night and half an hour after eight the next morning, and the clocks going back in October is handled too. The arithmetic is in &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/multiplayer/slow.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/multiplayer/slow.ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Run out of time and Pip checks for you if it can and folds if it can’t. Do that twice in a row and you are sat out, moved for straight away, until you next open the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moves set in advance
&lt;/h2&gt;

&lt;p&gt;While somebody else is thinking, you can set check/fold, check, or call. When the turn reaches you, it is made for you if it still makes sense. A call lapses if the bet changes, and everything lapses when the street ends. Nobody else at the table is told what you set. Live rooms have these now too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you missed
&lt;/h2&gt;

&lt;p&gt;Open a game after a day away and the hands you missed play out on the felt, move by move, before you get the table back. There is a Skip. A slow game keeps its last ten hands for this. Each one is dealt again from the moves that were made, and if the replay does not end where the real hand did, it isn’t shown. A wrong replay is worse than none. The rebuild is &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/multiplayer/catchUp.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/multiplayer/catchUp.ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Being told it is your move
&lt;/h2&gt;

&lt;p&gt;Pip asks once, at your first slow game’s table, whether it may send notifications. Say yes and you get one when it is your move. On an iPhone, a browser can only do that once Pip is on your Home Screen.&lt;/p&gt;

&lt;p&gt;Email is on unless you turn it off. It comes only if a move has waited a quarter of its clock, or five minutes when there is no device to notify. One email lists every game waiting on you, at most one every twelve hours, and each has a link that turns them off in one tap. Nothing arrives during your quiet hours, or while you have the table open. The rules are &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/multiplayer/notices.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/multiplayer/notices.ts&lt;/code&gt;&lt;/a&gt;, and the switches are under Settings, Slow games.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn’t do
&lt;/h2&gt;

&lt;p&gt;It is Hold’em only, there are no cameras at a slow table, and there is no real money and no way to add any. A game nobody starts is cleared after three days, and a finished one stays on Pip’s Home for a week, long enough to mention it to the loser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;Opening a slow game is part of the &lt;a href="https://playpip.io/membership?for=multiplayer&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, as is opening a live room. Joining a friend’s game is free, and so are the ladder, the Rail, the Daily and the freeroll.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How often is there a low in Omaha Hi-Lo?</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/how-often-is-there-a-low-in-omaha-hi-lo-2df3</link>
      <guid>https://dev.to/playpipio/how-often-is-there-a-low-in-omaha-hi-lo-2df3</guid>
      <description>&lt;h2&gt;
  
  
  Half the pot, if there is a half
&lt;/h2&gt;

&lt;p&gt;In Omaha Hi-Lo every pot is cut in two. The best hand takes one half. The best low takes the other: five cards of different ranks, all eight or lower, the ace counting as one, and still exactly two from your hand with three from the board. If nobody makes a low, the high hand takes the lot.&lt;/p&gt;

&lt;p&gt;The description of The Split, Pip’s Hi-Lo table, says nobody makes one about half the time. That is the kind of sentence that gets written once and never checked, so we checked it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The board decides first
&lt;/h2&gt;

&lt;p&gt;You have to use three board cards for a low, and they have to be three different ranks from ace to eight. A board without them has no low on it for anybody, whatever they hold.&lt;/p&gt;

&lt;p&gt;Of the 2,598,960 possible boards, 1,561,728 have three. That is six boards in ten. On the other four, the low half of the game does not happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  One hand
&lt;/h2&gt;

&lt;p&gt;Then you need two cards of your own, eight or lower, that are not the same ranks as the three you use from the board. Deal one four-card hand and a board every way it can be dealt, 463,563,500,400 ways, and the hand makes a low in 161,374,983,168 of them. A little over one in three.&lt;/p&gt;

&lt;p&gt;Even on a board that allows a low, one hand gets there in 161,374,983,168 of 278,557,614,720. Not quite six in ten.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ace-deuce, and the deuce on the board
&lt;/h2&gt;

&lt;p&gt;Ace-deuce is the low every Hi-Lo player wants to be dealt. Hands holding an ace and a deuce make a low in 13,947,611,904 of 29,650,256,064 deals. A little under half.&lt;/p&gt;

&lt;p&gt;The board does most of that. It still needs three different low cards, and they have to be ranks you are not already using. You hold A♠ 2♠ K♦ K♣ and the board comes 2♥ 5♦ 7♣ J♥ Q♠. Three low ranks, so a low is possible. Not for you: your low cards are an ace and a deuce, the board’s are a deuce, a five and a seven, and five different ranks cannot be made from those. Players call that being counterfeited.&lt;/p&gt;

&lt;p&gt;Make the 2♥ a 3♥ and the same four cards make 7-5-3-2-A.&lt;/p&gt;

&lt;h2&gt;
  
  
  More hands, more lows
&lt;/h2&gt;

&lt;p&gt;The question the table cares about is whether &lt;em&gt;anybody&lt;/em&gt; makes one, and that depends on how many hands get to the end. We dealt 1,000,000 deals of six hands and a board, everybody staying to the river, and counted the deals where at least one of the first one, two, three hands and so on had a low:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One hand: 348,021&lt;/li&gt;
&lt;li&gt;Two: 495,914&lt;/li&gt;
&lt;li&gt;Three: 559,220&lt;/li&gt;
&lt;li&gt;Four: 585,243&lt;/li&gt;
&lt;li&gt;Five: 595,470&lt;/li&gt;
&lt;li&gt;Six: 599,126&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first row is a sample of the exact one-in-three above, and lands close to it. Two hands make a low half the time, so “about half” is right heads-up. With six, somebody has one in six deals of ten, and the number cannot climb much further: it is already pressed against the boards that allow one at all. A real table sits somewhere in between, because people fold.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;A low only cares about which ranks from ace to eight are where, so the exact counts are worked out by rank rather than card by card, which takes under a second. &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/hiLoCounts.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/hiLoCounts.test.ts&lt;/code&gt;&lt;/a&gt; does it on every run and checks that shortcut against &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/hiLo.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/hiLo.ts&lt;/code&gt;&lt;/a&gt;, the evaluator that settles the low half at The Split, on twenty thousand dealt hands.&lt;/p&gt;

&lt;p&gt;The six-hand rows are a sample, run through that same evaluator with seed 20261020. A million deals take two minutes, too long for the test suite, so they are typed into &lt;a href="https://github.com/playpip/pip-web/blob/main/src/config/hiLoCounts.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/config/hiLoCounts.ts&lt;/code&gt;&lt;/a&gt; and not re-run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;The Split is one of the side tables in the &lt;a href="https://playpip.io/membership?for=hilo&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, at two stakes. A tap on it there deals a showdown where three kings take the high half, an ace and a three take the low, and a pair of queens wins nothing. The ladder, the Rail, the Daily and the freeroll stay free. So did the counting.&lt;/p&gt;

</description>
      <category>gamedev</category>
    </item>
    <item>
      <title>A poker night with friends, online, with nothing to settle up</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/a-poker-night-with-friends-online-with-nothing-to-settle-up-24hd</link>
      <guid>https://dev.to/playpipio/a-poker-night-with-friends-online-with-nothing-to-settle-up-24hd</guid>
      <description>&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;One person opens a private room on Pip and sends the others a link. Up to eight of you sit at one Texas Hold’em table, with your cameras and mics on if you want them. The host needs the membership. Everybody else needs a free account and the link.&lt;/p&gt;

&lt;p&gt;The chips are play chips. Nobody owes anybody anything at the end, which used to be the hardest part of the evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who deals
&lt;/h2&gt;

&lt;p&gt;Our server does. It shuffles, deals, and sends each player their own two cards and nobody else’s, until a showdown turns them over. Nobody has to hold a deck up to a webcam and read out the flop. How that works, and the test that checks it, is in &lt;a href="https://playpip.io/blog/your-cards-stay-on-the-server" rel="noopener noreferrer"&gt;Your cards stay on the server&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the host sets
&lt;/h2&gt;

&lt;p&gt;Before the first hand, the host picks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the seats, from two to eight;&lt;/li&gt;
&lt;li&gt;the stake, one of the ladder’s, which sets the chips and the blinds;&lt;/li&gt;
&lt;li&gt;starting chips: standard, deep or very deep;&lt;/li&gt;
&lt;li&gt;blinds: slow, normal, turbo, or fixed so they never rise;&lt;/li&gt;
&lt;li&gt;time to act: 15, 30 or 60 seconds;&lt;/li&gt;
&lt;li&gt;what happens when somebody leaves;&lt;/li&gt;
&lt;li&gt;whose chips: from the Roll, or just for fun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everybody at the table can read the rules. Only the host can change them, and only before the deal. The game is a sit-and-go: the same stack each, the blinds climb unless you fixed them, and the last player with chips wins. The rules live in &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/multiplayer/room.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/multiplayer/room.ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Whose chips
&lt;/h2&gt;

&lt;p&gt;The Roll is the bankroll you carry up Pip’s ladder. &lt;em&gt;From the Roll&lt;/em&gt; takes the buy-in from each player’s Roll and pays the winner the buy-in times the seats. &lt;em&gt;Just for fun&lt;/em&gt; takes nothing and pays nothing.&lt;/p&gt;

&lt;p&gt;Either way the chips are never for sale, and nobody at the table sees anybody else’s Roll or rank. The membership changes nothing once the cards are dealt. A host who pays plays the same cards as a friend who didn’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faces and voices
&lt;/h2&gt;

&lt;p&gt;Both are off until you tap them. Turn the camera on and your face takes your seat where the avatar was. Turn the mic on and the room hears you. The picture is 320 by 240 at 15 frames a second, which is enough to see somebody trying not to smile.&lt;/p&gt;

&lt;p&gt;Video and voice go between players’ browsers; the room server passes on the messages that connect them. Tap anybody’s seat to mute them or hide their camera, for you only. Report and block are on the same sheet. A blocked player’s camera and voice stop reaching you, and they are not told.&lt;/p&gt;

&lt;h2&gt;
  
  
  When somebody gets up
&lt;/h2&gt;

&lt;p&gt;Stand up mid-game and the host’s rule decides. With &lt;em&gt;Keep their seat&lt;/em&gt;, your chips stay and your hands fold until you sit back down. With &lt;em&gt;They’re out&lt;/em&gt;, you are out after the hand in progress, which is how some poker nights have always ended.&lt;/p&gt;

&lt;p&gt;Short of people? Before the deal the host can fill empty chairs with Pip’s regulars, the same characters you meet on the ladder.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn’t do
&lt;/h2&gt;

&lt;p&gt;It is Hold’em only. There is no real money and no way to add any. A room is cleared half an hour after its game ends, so there is no record of who won last week. You will have to remember that yourselves, and you will.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;Opening a room is part of the &lt;a href="https://playpip.io/membership?for=multiplayer&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, and that page says what else is in it. Joining a friend’s room is free, and so are the ladder, the Rail, the Daily and the freeroll.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>web</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How often both your cards play in Hold’em</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/how-often-both-your-cards-play-in-holdem-39p5</link>
      <guid>https://dev.to/playpipio/how-often-both-your-cards-play-in-holdem-39p5</guid>
      <description>&lt;h2&gt;
  
  
  The count
&lt;/h2&gt;

&lt;p&gt;In Hold’em you hold two cards, the board shows five, and your hand is the best five of the seven. Nobody makes you say which five. So we counted how often your own two make it in.&lt;/p&gt;

&lt;p&gt;Every way to deal two hole cards and a five-card board from one deck is 2,809,475,760 deals. For each one we took the best hand you can make and asked which of your cards it needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both of them: 1,324,680,512.&lt;/li&gt;
&lt;li&gt;One of them, either will do or only one helps: 1,347,370,964.&lt;/li&gt;
&lt;li&gt;Neither, because the board alone is as good: 137,424,284.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So both your cards play in a little under half of all deals, and one card does the work slightly more often than two. In about one deal in twenty, your cards play no part at all.&lt;/p&gt;

&lt;p&gt;These are deals to the river with nobody folding. Real hands fold, and the ones that get to a showdown are not a random sample. It is a count of what the cards can do, not of what players do with them.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the board plays
&lt;/h2&gt;

&lt;p&gt;You 8♥ 2♣ · Board 9♠ 10♥ J♦ Q♣ K♠&lt;/p&gt;

&lt;p&gt;You have a straight. So does everybody else still in the hand. Your eight makes a straight too, just a worse one, so it sits out. When the board is your best hand, every other player has at least the board as well, and the most you can win is a share.&lt;/p&gt;

&lt;p&gt;You 3♣ 3♦ · Board A♠ A♥ K♦ K♣ Q♠&lt;/p&gt;

&lt;p&gt;A pocket pair that does nothing. Aces and kings on the board, the queen as the kicker, and your threes are the third pair, which a hand of five has no room for. &lt;a href="https://playpip.io/learn/three-pair-in-texas-holdem" rel="noopener noreferrer"&gt;Three pair&lt;/a&gt; has a page of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  When one card does it
&lt;/h2&gt;

&lt;p&gt;You A♥ 7♣ · Board K♥ 9♥ 5♥ 2♥ J♠&lt;/p&gt;

&lt;p&gt;Four hearts on the board and the ace of hearts in your hand: an ace-high flush. The seven of clubs does not come into it. Swap it for any card but a heart and the hand is the same.&lt;/p&gt;

&lt;p&gt;You 6♠ 7♠ · Board 8♠ 9♦ 10♣ K♥ 2♦&lt;/p&gt;

&lt;p&gt;Here it takes both. Eight, nine and ten on the board, the six and seven in your hand, and neither card makes the straight without the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  More than one right answer
&lt;/h2&gt;

&lt;p&gt;You K♥ 9♦ · Board 9♠ 10♥ J♦ Q♣ 3♠&lt;/p&gt;

&lt;p&gt;The king makes a nine-to-king straight, and there are two nines to start it with, yours and the board’s. Both fives are the same hand. Neither is more right than the other.&lt;/p&gt;

&lt;p&gt;Seven cards can be cut down to five in twenty-one ways, and usually one way is best. Of the 133,784,560 possible sets of seven, 3,079,988 have two or more that tie, about one in 43. Most of them, 2,386,100, are straights with a pair inside them like this one. Another 617,760 are three pair where the third pair is also the best kicker, so either card of it will do. The last 76,128 are full houses and fours of a kind with a spare card to choose between.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we counted
&lt;/h2&gt;

&lt;p&gt;A short program dealt all 133,784,560 sets of seven and split each one every way it can be split into two hole cards and a board, which takes about a minute. It ranks hands with an evaluator of its own, written for speed, so it is not the code that settles Pip’s pots. Two checks tie it to that code. Its count of each hand type over seven cards matches the standard table exactly. And 400,000 random deals through Pip’s evaluator came out at 19,568 board, 191,959 one card and 188,473 both, against 19,566, 191,832 and 188,602 expected from the full count.&lt;/p&gt;

&lt;p&gt;The full count is too slow for the test suite and is not pinned by it. &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/whichFivePlay.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/whichFivePlay.test.ts&lt;/code&gt;&lt;/a&gt; holds the rest: the three rows add up to every deal, and each hand in this post plays the cards it says it does, by Pip’s evaluator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Which five play?&lt;/em&gt; is a drill: seven cards, tap the five that count. It is graded by ranking all twenty-one fives, so when two tie, either one is right. It is in the &lt;a href="https://playpip.io/membership?for=drills&amp;amp;drill=which-five-play&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;. &lt;em&gt;What have you got?&lt;/em&gt;, which asks you to name the hand rather than point at it, stays free for everyone, as does &lt;em&gt;Which hand wins?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>programming</category>
    </item>
    <item>
      <title>Five-Card Draw: what the number of cards gives away</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/five-card-draw-what-the-number-of-cards-gives-away-38gm</link>
      <guid>https://dev.to/playpipio/five-card-draw-what-the-number-of-cards-gives-away-38gm</guid>
      <description>&lt;h2&gt;
  
  
  The only tell
&lt;/h2&gt;

&lt;p&gt;In Five-Card Draw nobody shows a card until the end. There is no board. The one thing you learn about anybody’s hand is how many cards they asked for.&lt;/p&gt;

&lt;p&gt;At Pip’s Draw tables, The Parlour, the regulars all decide what to throw by the same short rule, &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/ai/draw.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/ai/draw.ts&lt;/code&gt;&lt;/a&gt;. A fixed rule turns that number into a read. So we dealt every one of the 2,598,960 five-card hands through it and counted what each number means.&lt;/p&gt;

&lt;h2&gt;
  
  
  None: they have it
&lt;/h2&gt;

&lt;p&gt;A regular stands pat on a straight or better and on nothing else. That is 19,716 deals, about one in 132. No regular stands pat on a bluff, so when one does, believe it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One: two pair, or a draw
&lt;/h2&gt;

&lt;p&gt;One card covers three different hands. Two pair throws its odd card: 123,552 deals. Four to a flush throws the fifth: 110,940, and 34,320 of those broke up a pair to do it. Four in a row throws the fifth too: 60,480.&lt;/p&gt;

&lt;p&gt;So we dealt the card too: every one of the 47 left, for each of those deals. A little over one in seven ends with a straight or better, the full houses included. About one in three ends with nothing at all, not even a pair. Two pair is still the likeliest thing to come over at the end. One card deserves some respect. Not a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two: three of a kind, every time
&lt;/h2&gt;

&lt;p&gt;Only trips draw two. 54,912 deals, and nothing else in the rule asks for two. Of all the numbers it is the one that tells you exactly what you are up against.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three: a pair
&lt;/h2&gt;

&lt;p&gt;The common one, 1,057,224 deals, about four in ten. The rule keeps any pair, deuces included, and throws the rest. Even a pair of twos beats drawing four to an ace, which is what the next number is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four and five: nothing
&lt;/h2&gt;

&lt;p&gt;Four cards means an ace and nothing to go with it: 466,560 deals. Five means not even that: 698,880, more than one deal in four. A regular holding K-Q-8-6-3 throws the lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one coin flip
&lt;/h2&gt;

&lt;p&gt;A pair at the end of four in a row, say 5-6-7-8-8, could go either way. The rule keeps the run and draws one 35 times in 100, and keeps the pair and draws three otherwise. It comes up in 6,696 deals, and it is the only spot where the number can mislead you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not chase
&lt;/h2&gt;

&lt;p&gt;An ace closes a straight at one end. J-Q-K-A fills only with a ten and A-2-3-4 only with a five, four cards rather than the eight that fill 8-9-T-J. The rule chases neither. It keeps the ace and asks for four.&lt;/p&gt;

&lt;p&gt;It also misses a pair in the middle of the run. Holding 5-6-6-7-8, it does not see the four in a row, keeps the sixes and draws three.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/playpip/pip-web/blob/main/tests/draw.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/draw.test.ts&lt;/code&gt;&lt;/a&gt; holds the rule itself, a hand for each number from standing pat to throwing all five. The counts come from one run over every deal, which takes too long for the test suite, so they are not pinned the way the rule is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is
&lt;/h2&gt;

&lt;p&gt;The Parlour is one of the side tables in the &lt;a href="https://playpip.io/membership?for=draw&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;, at two stakes. The page that link opens deals one hand through the draw first, each side throwing by the same rule. The ladder, the Rail, the Daily and the freeroll stay free.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Your cards stay on the server</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/your-cards-stay-on-the-server-1fbe</link>
      <guid>https://dev.to/playpipio/your-cards-stay-on-the-server-1fbe</guid>
      <description>&lt;h2&gt;
  
  
  Two kinds of table
&lt;/h2&gt;

&lt;p&gt;A single-player game of Pip runs in your browser. The deck is in the tab with you, and so are the bots’ cards. Anybody who opens the developer tools can read them. That has never mattered, because the only person you can cheat there is you.&lt;/p&gt;

&lt;p&gt;On 11 October Pip got multiplayer: private rooms you open for your friends, and quick match at the ladder’s stakes. Once there is another person at the table, a card in your browser is a card somebody can read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Face down is only a picture
&lt;/h2&gt;

&lt;p&gt;A card drawn face down is a drawing. If the browser was sent the card, the drawing is all that hides it. So a room is not dealt in anybody’s browser. Our server deals it, and keeps the deck and every hole card.&lt;/p&gt;

&lt;p&gt;Each player is sent their own copy of the table, made by &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/multiplayer/view.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/multiplayer/view.ts&lt;/code&gt;&lt;/a&gt;. The deck is emptied. Everybody else’s cards are taken out, and only how many each player holds is left, so the backs can still be drawn. Cards come back only for the players a showdown turns over. A pot won when everybody else folds shows nothing to anyone.&lt;/p&gt;

&lt;p&gt;Account ids stay on the server too. Nobody at a table needs one, and a list of them is the first thing anyone collecting accounts would want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every step, not one hand
&lt;/h2&gt;

&lt;p&gt;A test that checks one hand picked to pass tells you about that hand. &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/multiplayerView.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/multiplayerView.test.ts&lt;/code&gt;&lt;/a&gt; plays twelve seeded games instead, and at every step checks the copy each person at the table would be sent, and the copy someone watching would get. None may carry the deck, and none may carry a card its reader is not entitled to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI players
&lt;/h2&gt;

&lt;p&gt;The server does hand its bots the whole table, every card included, which is a fair thing to be suspicious of. The bots’ decisions read their own cards, the board and how everybody has bet. They guess at your hand from your betting, the same way a person would.&lt;/p&gt;

&lt;p&gt;We wanted that pinned rather than promised, so &lt;a href="https://github.com/playpip/pip-web/blob/main/tests/multiplayerBotsSeeOwnCards.test.ts" rel="noopener noreferrer"&gt;&lt;code&gt;tests/multiplayerBotsSeeOwnCards.test.ts&lt;/code&gt;&lt;/a&gt; makes every bot decision twice in a seeded game: once from the whole table, once from the copy a person in that seat would be sent, with the same dice. The two must match. To check the test could fail, we made a bot look at one opponent’s cards. It failed.&lt;/p&gt;

&lt;p&gt;In quick match, AI players take any seat that has not filled after about thirty seconds. Each one has an AI tag on its name plate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;You cannot check a room’s shuffle. The server shuffles, and nothing yet lets you verify it afterwards. The Daily Deal is still the only thing on Pip you can deal again yourself.&lt;/p&gt;

&lt;p&gt;The members’ view of the rest of a game after you bust, every hand face up, stays at the single-player tables. At a room the server has nothing to send it.&lt;/p&gt;

&lt;p&gt;And none of this makes a room tamper-proof. It means one thing: your cards are not in anybody else’s browser until you show them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dealing your friends in
&lt;/h2&gt;

&lt;p&gt;A member opens a room and sends the code. Friends join free with a Pip account, camera and voice if they want them. Multiplayer is part of the &lt;a href="https://playpip.io/membership?for=multiplayer&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;. The ladder, the Rail, the Daily and the freeroll stay free.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A beginner beat our hardest table by betting</title>
      <dc:creator>Play Pip</dc:creator>
      <pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/playpipio/a-beginner-beat-our-hardest-table-by-betting-1kc6</link>
      <guid>https://dev.to/playpipio/a-beginner-beat-our-hardest-table-by-betting-1kc6</guid>
      <description>&lt;h2&gt;
  
  
  The hardest table
&lt;/h2&gt;

&lt;p&gt;The Main Event is the top of Pip’s ladder. Its tagline says near-optimal and merciless. The person who built Pip has played poker for two months, and was beating it, mostly by betting.&lt;/p&gt;

&lt;p&gt;That is either good news about the player or bad news about the table. We went to find out which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bots against scripts
&lt;/h2&gt;

&lt;p&gt;Pip already had simulations that play the bots against each other. Those can never find a hole every bot shares, because the bot on the other side of the table has the same hole. So we wrote &lt;a href="https://github.com/playpip/pip-web/blob/main/scripts/exploit-sim.ts" rel="noopener noreferrer"&gt;&lt;code&gt;scripts/exploit-sim.ts&lt;/code&gt;&lt;/a&gt;, which sits a scripted player at a real table against the real bots.&lt;/p&gt;

&lt;p&gt;The scripts play the way beginners play. One bets the pot every time it can. One calls everything. One only bets a strong hand. One shoves all-in or folds. One raises every hand it plays and bets every street it is checked to. And one plays the line most people find first: raise a decent hand, bet the flop whatever it brings, bet the turn again if checked to, and give up if anybody fights back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven folds in ten
&lt;/h2&gt;

&lt;p&gt;When that last script raised before the flop and the flop was checked to it, the Main Event folded to a bet of two-thirds of the pot 71% of the time.&lt;/p&gt;

&lt;p&gt;A two-thirds pot bet risks two chips to win three. It breaks even if it takes the pot two times in five, which is 40%, and that holds whatever cards you have. At 71% you can make that bet with any two cards and come out ahead before anybody shows a hand.&lt;/p&gt;

&lt;p&gt;In 600 tournaments at the Main Event the script won 117. A fair share at six seats is 100.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the best bots folded
&lt;/h2&gt;

&lt;p&gt;Every bot read your hand off the chips you had put in. A raise before the flop and a bet after it added up to one of the strongest hands you could hold, whoever made them. That is the right read of somebody who only bets when they have it. It is exactly the wrong read of somebody who bets every time, and the bots could not tell the two apart. They had no memory of who they were playing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The bots remember you.&lt;/strong&gt; &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/ai/memory.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/ai/memory.ts&lt;/code&gt;&lt;/a&gt; counts, for every player at the table, how often they raise before the flop, how often they bet after it, and how often they fold when bet into. Everybody starts out as a typical player, and a few orbits move the count where one hand cannot. A bet from somebody who bets everything says less, so the bots call it down and raise it back. Against somebody who folds a lot, they bluff more.&lt;/p&gt;

&lt;p&gt;The same flop bet now gets folded to 62% of the time from a stranger, and 27% of the time from a player the table has watched bet the pot at every chance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A bet is read by its size against this street’s pot&lt;/strong&gt; , with a smaller weight for earlier streets, instead of counting every chip in the hand as proof. That is &lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/ai/policy.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/ai/policy.ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short stacks play the chart.&lt;/strong&gt; At fifteen big blinds or fewer, first in or facing one shove, the strong bots go all-in or fold from the same solved chart Pip’s shove-or-fold drill teaches (&lt;a href="https://github.com/playpip/pip-web/blob/main/src/lib/poker/ai/pushFold.ts" rel="noopener noreferrer"&gt;&lt;code&gt;src/lib/poker/ai/pushFold.ts&lt;/code&gt;&lt;/a&gt;). The blinds here climb every few hands, so a lot of a tournament is played that short. The Main Event plays off the chart every time. Lower tables do it less often.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bet sizes stop giving the hand away&lt;/strong&gt; from the middle of the ladder up. A bluff there is sized more like a bet for value, and at the top they look the same. The lower tables keep the tell on purpose. A table you can read is where you learn to read.&lt;/p&gt;

&lt;p&gt;With all of that in, the same script won 83 of 600 at the Main Event, down from 117.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then they learned the story
&lt;/h2&gt;

&lt;p&gt;A second change went in the same afternoon. The bots now read the hand as a sequence, not a pile of chips: who raised before the flop, who check-raised, who has led every street. The raiser bets the flop more often. A big hand sometimes checks to the raiser so it can raise later. A seat that has bet every street can finish the bluff on the river. And the table’s count of how often you fold now changes how often it bluffs you.&lt;/p&gt;

&lt;p&gt;In 300 tournaments against that table, where a fair share is 50, the c-bet script won 44. The one that bets every street it is checked to won 24.&lt;/p&gt;

&lt;h2&gt;
  
  
  How sure we are
&lt;/h2&gt;

&lt;p&gt;Six hundred tournaments is not many. A player no better than the table wins 117 or more about one time in 27 by luck alone, so 117 on its own would not have convinced us. The fold rate did. Seven folds in ten against a break-even of four in ten is arithmetic, and a strategy that profits on most flops was always going to show up in the results.&lt;/p&gt;

&lt;p&gt;The 44 in 300 says less. A player exactly as good as the table lands there or lower about one time in five, so it says the c-bet stopped winning big, and nothing finer than that. The 24 is a different matter: luck gets that low about once in a hundred thousand tries.&lt;/p&gt;

&lt;p&gt;To make 600 tournaments finish, those runs held each bot to 300 simulated hands per decision. The real Main Event thinks through 1,800. And these are scripts, not people. A script does not get bored, change gear or notice that the table has started calling. The real test is a person sitting back down at the Main Event, and that one is open to anybody who gets there.&lt;/p&gt;

&lt;h2&gt;
  
  
  For the human at the table
&lt;/h2&gt;

&lt;p&gt;Betting all the time works against opponents who do not adjust. Against a table that is watching, a bet that never means anything stops buying folds and starts getting called. The Main Event watches now.&lt;/p&gt;

&lt;p&gt;The ladder, the Rail, the Daily and the freeroll stay free. The shove-or-fold drill the bots learned from is in the &lt;a href="https://playpip.io/membership?for=drills&amp;amp;drill=shove-or-fold&amp;amp;from=blog" rel="noopener noreferrer"&gt;membership&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>software</category>
    </item>
  </channel>
</rss>
