2 using System.Collections;
\r
7 /// Summary description for CountMethod.
\r
9 public abstract class CountMethod
\r
11 protected CountMethod( int numberOfDecks )
\r
13 Decks = numberOfDecks;
\r
16 protected string name = "";
\r
17 protected int level = 0;
\r
19 protected int Decks;
\r
20 protected double runningTotal;
\r
21 protected int cardCount;
\r
22 protected int acesCount;
\r
23 protected int twosCount;
\r
24 protected int threesCount;
\r
25 protected int foursCount;
\r
26 protected int fivesCount;
\r
27 protected int sixesCount;
\r
28 protected int sevensCount;
\r
29 protected int eightsCount;
\r
30 protected int ninesCount;
\r
31 protected int tensCount;
\r
33 protected virtual double[] GetCounts() { return null; }
\r
34 protected int SideCount( Card.CardType cardType )
\r
40 case Card.CardType.Ace:
\r
43 case Card.CardType.Two:
\r
46 case Card.CardType.Three:
\r
47 count = threesCount;
\r
49 case Card.CardType.Four:
\r
52 case Card.CardType.Five:
\r
55 case Card.CardType.Six:
\r
58 case Card.CardType.Seven:
\r
59 count = sevensCount;
\r
61 case Card.CardType.Eight:
\r
62 count = eightsCount;
\r
64 case Card.CardType.Nine:
\r
67 case Card.CardType.Ten:
\r
74 public virtual double GetWager( double normalBet )
\r
77 double trueCount = Count;
\r
80 wager = normalBet * trueCount;
\r
81 else if( trueCount == 0 )
\r
83 else if( trueCount < 0 )
\r
84 wager = normalBet * trueCount;
\r
86 // $10 table minimum :) Also, round to nearest integer
\r
87 wager = (int)Math.Max( 10, wager );
\r
92 public virtual string MethodName{ get{ return "";}}
\r
93 public virtual int MethodLevel{ get{ return 0; }}
\r
94 public virtual void CountCard( Card card )
\r
96 runningTotal += GetCounts()[ (int)card.TrueValue ];
\r
99 // Now keep side counts for all cards
\r
100 switch( card.FaceValue )
\r
102 case Card.CardType.Ace:
\r
105 case Card.CardType.Two:
\r
108 case Card.CardType.Three:
\r
111 case Card.CardType.Four:
\r
114 case Card.CardType.Five:
\r
117 case Card.CardType.Six:
\r
120 case Card.CardType.Seven:
\r
123 case Card.CardType.Eight:
\r
126 case Card.CardType.Nine:
\r
129 case Card.CardType.Ten:
\r
132 case Card.CardType.Jack:
\r
135 case Card.CardType.Queen:
\r
138 case Card.CardType.King:
\r
144 public virtual void Reset( int decks )
\r
161 public virtual double Count
\r
163 get{ return runningTotal / (( Decks*52 - cardCount ) / 52 ); }
\r
166 public static ArrayList GetMethods()
\r
168 ArrayList methods = new ArrayList();
\r
170 methods.Add( "Hi-Lo" );
\r
171 methods.Add( "High-Low" );
\r
172 methods.Add( "Hi Opt I" );
\r
173 methods.Add( "Hi Opt II" );
\r
174 methods.Add( "Silver Fox" );
\r
175 methods.Add( "Brh I" );
\r
176 methods.Add( "Brh II" );
\r
177 methods.Add( "Canfield Expert" );
\r
178 methods.Add( "Canfield Master" );
\r
179 methods.Add( "KO" );
\r
180 methods.Add( "Omega II" );
\r
181 methods.Add( "Red Seven" );
\r
182 methods.Add( "Revere Adv. Plus Minus" );
\r
183 methods.Add( "Revere Point Count" );
\r
184 methods.Add( "Unb. Zen 11" );
\r
185 methods.Add( "Uston Adv. Plus Minus" );
\r
186 methods.Add( "Uston APC" );
\r
187 methods.Add( "Uston SS" );
\r
188 methods.Add( "Wong Halves" );
\r
189 methods.Add( "Zen Count" );
\r
190 methods.Add( "Hi-Lo Ace Side Count" );
\r
191 methods.Add( "HiOptI Ace-Seven Side Count" );
\r
195 public static CountMethod NewMethod( string methodName, int n )
\r
197 CountMethod returnValue = null;
\r
199 switch( methodName )
\r
202 returnValue = new HiLo( n );
\r
204 case( "High-Low" ):
\r
205 returnValue = new HighLow( n );
\r
207 case( "Hi Opt I" ):
\r
208 returnValue = new HiOptI( n );
\r
210 case( "Hi Opt II" ):
\r
211 returnValue = new HiOptII( n );
\r
213 case( "Silver Fox" ):
\r
214 returnValue = new SilverFox( n );
\r
217 returnValue = new BrhI( n );
\r
220 returnValue = new BrhII( n );
\r
222 case( "Canfield Expert" ):
\r
223 returnValue = new CanfieldExpert( n );
\r
225 case( "Canfield Master" ):
\r
226 returnValue = new CanfieldMaster( n );
\r
229 returnValue = new KO( n );
\r
231 case( "Omega II" ):
\r
232 returnValue = new OmegaII( n );
\r
234 case( "Red Seven" ):
\r
235 returnValue = new RedSeven( n );
\r
237 case( "Revere Adv. Plus Minus" ):
\r
238 returnValue = new RevereAdvPlusMinus( n );
\r
240 case( "Revere Point Count" ):
\r
241 returnValue = new ReverePointCount( n );
\r
243 case( "Unb. Zen 11" ):
\r
244 returnValue = new UnbZen11( n );
\r
246 case( "Uston Adv. Plus Minus" ):
\r
247 returnValue = new UstonAdvPlusMinus( n );
\r
249 case( "Uston APC" ):
\r
250 returnValue = new UstonApc( n );
\r
252 case( "Uston SS" ):
\r
253 returnValue = new UstonSS( n );
\r
255 case( "Wong Halves" ):
\r
256 returnValue = new WongHalves( n );
\r
258 case( "Zen Count" ):
\r
259 returnValue = new ZenCount( n );
\r
261 case( "Hi-Lo Ace Side Count" ):
\r
262 returnValue = new HiLoA( n );
\r
264 case( "HiOptI Ace-Seven Side Count" ):
\r
265 returnValue = new HiOptIA7( n );
\r
268 returnValue = null;
\r
272 return returnValue;
\r
276 public class HiLo : CountMethod
\r
278 public HiLo( int n ) : base( n )
\r
282 protected override double[] GetCounts() { return counts; }
\r
283 // Card counts A 2 3 4 5 6 7 8 9 T
\r
284 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 0, 0, 0,-1 };
\r
285 new private string name = "Hi-Lo";
\r
286 new private int level = 1;
\r
287 public override string MethodName{ get{ return name; }}
\r
288 public override int MethodLevel{ get{ return level; }}
\r
291 public class HighLow : CountMethod
\r
293 public HighLow( int n ) : base( n )
\r
297 protected override double[] GetCounts() { return counts; }
\r
298 // Card counts A 2 3 4 5 6 7 8 9 T
\r
299 protected double[] counts = new double[] {-1, 1, 1, 1, 1, 1, 0, 0, 0,-1 };
\r
300 new private string name = "High-Low";
\r
301 new private int level = 1;
\r
302 public override string MethodName{ get{ return name; }}
\r
303 public override int MethodLevel{ get{ return level; }}
\r
306 public class HiOptI : CountMethod
\r
308 public HiOptI( int n ) : base( n )
\r
312 protected override double[] GetCounts() { return counts; }
\r
313 // Card counts A 2 3 4 5 6 7 8 9 T
\r
314 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 0, 0, 0,-1 };
\r
315 new private string name = "HiOptI";
\r
316 new private int level = 1;
\r
317 public override string MethodName{ get{ return name; }}
\r
318 public override int MethodLevel{ get{ return level; }}
\r
321 public class HiOptII : CountMethod
\r
323 public HiOptII( int n ) : base( n )
\r
327 protected override double[] GetCounts() { return counts; }
\r
328 // Card counts A 2 3 4 5 6 7 8 9 T
\r
329 protected double[] counts = new double[] { 0, 1, 1, 2, 2, 1, 1, 0, 0,-2 };
\r
330 new private string name = "HiOptII";
\r
331 new private int level = 2;
\r
332 public override string MethodName{ get{ return name; }}
\r
333 public override int MethodLevel{ get{ return level; }}
\r
336 public class SilverFox : CountMethod
\r
338 public SilverFox( int n ) : base( n )
\r
342 protected override double[] GetCounts() { return counts; }
\r
343 // Card counts A 2 3 4 5 6 7 8 9 T
\r
344 protected double[] counts = new double[] {-1, 1, 1, 1, 1, 1, 1, 0,-1,-1 };
\r
345 new private string name = "Silver Fox";
\r
346 new private int level = 1;
\r
347 public override string MethodName{ get{ return name; }}
\r
348 public override int MethodLevel{ get{ return level; }}
\r
351 public class BrhI : CountMethod
\r
353 public BrhI( int n ) : base( n )
\r
357 protected override double[] GetCounts() { return counts; }
\r
358 // Card counts A 2 3 4 5 6 7 8 9 T
\r
359 protected double[] counts = new double[] {-2, 1, 2, 2, 3, 2, 1, 0, 0,-2 };
\r
360 new private string name = "BrhI";
\r
361 new private int level = 3;
\r
362 public override string MethodName{ get{ return name; }}
\r
363 public override int MethodLevel{ get{ return level; }}
\r
366 public class BrhII : CountMethod
\r
368 public BrhII( int n ) : base( n )
\r
372 protected override double[] GetCounts() { return counts; }
\r
373 // Card counts A 2 3 4 5 6 7 8 9 T
\r
374 protected double[] counts = new double[] {-2, 1, 1, 2, 2, 2, 1, 0, 0,-2 };
\r
375 new private string name = "BrhII";
\r
376 new private int level = 2;
\r
377 public override string MethodName{ get{ return name; }}
\r
378 public override int MethodLevel{ get{ return level; }}
\r
381 public class CanfieldExpert : CountMethod
\r
383 public CanfieldExpert( int n ) : base( n )
\r
387 protected override double[] GetCounts() { return counts; }
\r
388 // Card counts A 2 3 4 5 6 7 8 9 T
\r
389 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 1, 0,-1,-1 };
\r
390 new private string name = "Canfield Expert";
\r
391 new private int level = 1;
\r
392 public override string MethodName{ get{ return name; }}
\r
393 public override int MethodLevel{ get{ return level; }}
\r
396 public class CanfieldMaster : CountMethod
\r
398 public CanfieldMaster( int n ) : base( n )
\r
402 protected override double[] GetCounts() { return counts; }
\r
403 // Card counts A 2 3 4 5 6 7 8 9 T
\r
404 protected double[] counts = new double[] { 0, 1, 1, 2, 2, 2, 1, 0,-1,-2 };
\r
405 new private string name = "Canfield Master";
\r
406 new private int level = 2;
\r
407 public override string MethodName{ get{ return name; }}
\r
408 public override int MethodLevel{ get{ return level; }}
\r
411 public class KO : CountMethod
\r
413 public KO( int n ) : base( n )
\r
417 protected override double[] GetCounts() { return counts; }
\r
418 // Card counts A 2 3 4 5 6 7 8 9 T
\r
419 protected double[] counts = new double[] {-1, 1, 1, 1, 1, 1, 1, 0, 0,-1 };
\r
420 new private string name = "KO";
\r
421 new private int level = 1;
\r
422 public override string MethodName{ get{ return name; }}
\r
423 public override int MethodLevel{ get{ return level; }}
\r
426 public class OmegaII : CountMethod
\r
428 public OmegaII( int n ) : base( n )
\r
432 protected override double[] GetCounts() { return counts; }
\r
433 // Card counts A 2 3 4 5 6 7 8 9 T
\r
434 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 1, 0,-1,-1 };
\r
435 new private string name = "Omega II";
\r
436 new private int level = 1;
\r
437 public override string MethodName{ get{ return name; }}
\r
438 public override int MethodLevel{ get{ return level; }}
\r
441 public class RedSeven : CountMethod
\r
443 public RedSeven( int n ) : base( n )
\r
447 protected override double[] GetCounts() { return counts; }
\r
448 // Card counts A 2 3 4 5 6 7 8 9 T
\r
449 protected double[] counts = new double[] {-1, 1, 1, 1, 1, 1,.5, 0, 0,-1 };
\r
450 new private string name = "Red Seven";
\r
451 new private int level = 1;
\r
452 public override string MethodName{ get{ return name; }}
\r
453 public override int MethodLevel{ get{ return level; }}
\r
456 public class RevereAdvPlusMinus : CountMethod
\r
458 public RevereAdvPlusMinus( int n ) : base( n )
\r
462 protected override double[] GetCounts() { return counts; }
\r
463 // Card counts A 2 3 4 5 6 7 8 9 T
\r
464 protected double[] counts = new double[] { 0, 1, 1, 1, 1, 1, 0, 0,-1,-1 };
\r
465 new private string name = "Revere Adv. Plus Minus";
\r
466 new private int level = 1;
\r
467 public override string MethodName{ get{ return name; }}
\r
468 public override int MethodLevel{ get{ return level; }}
\r
471 public class ReverePointCount : CountMethod
\r
473 public ReverePointCount( int n ) : base( n )
\r
477 protected override double[] GetCounts() { return counts; }
\r
478 // Card counts A 2 3 4 5 6 7 8 9 T
\r
479 protected double[] counts = new double[] {-2, 1, 2, 2, 2, 2, 1, 0, 0,-2 };
\r
480 new private string name = "Revere Point Count";
\r
481 new private int level = 2;
\r
482 public override string MethodName{ get{ return name; }}
\r
483 public override int MethodLevel{ get{ return level; }}
\r
486 public class UnbZen11 : CountMethod
\r
488 public UnbZen11( int n ) : base( n )
\r
492 protected override double[] GetCounts() { return counts; }
\r
493 // Card counts A 2 3 4 5 6 7 8 9 T
\r
494 protected double[] counts = new double[] {-1, 1, 2, 2, 2, 2, 1, 0, 0,-2 };
\r
495 new private string name = "Unb. Zen 11";
\r
496 new private int level = 2;
\r
497 public override string MethodName{ get{ return name; }}
\r
498 public override int MethodLevel{ get{ return level; }}
\r
501 public class UstonAdvPlusMinus : CountMethod
\r
503 public UstonAdvPlusMinus( int n ) : base( n )
\r
507 protected override double[] GetCounts() { return counts; }
\r
508 // Card counts A 2 3 4 5 6 7 8 9 T
\r
509 protected double[] counts = new double[] {-1, 0, 1, 1, 1, 1, 1, 0, 0,-1 };
\r
510 new private string name = "Uston Adv. Plus Minus";
\r
511 new private int level = 1;
\r
512 public override string MethodName{ get{ return name; }}
\r
513 public override int MethodLevel{ get{ return level; }}
\r
516 public class UstonApc : CountMethod
\r
518 public UstonApc( int n ) : base( n )
\r
522 protected override double[] GetCounts() { return counts; }
\r
523 // Card counts A 2 3 4 5 6 7 8 9 T
\r
524 protected double[] counts = new double[] { 0, 1, 2, 2, 3, 2, 2, 1,-1,-3 };
\r
525 new private string name = "Uston APC";
\r
526 new private int level = 3;
\r
527 public override string MethodName{ get{ return name; }}
\r
528 public override int MethodLevel{ get{ return level; }}
\r
531 public class UstonSS : CountMethod
\r
533 public UstonSS( int n ) : base( n )
\r
537 protected override double[] GetCounts() { return counts; }
\r
538 // Card counts A 2 3 4 5 6 7 8 9 T
\r
539 protected double[] counts = new double[] {-2, 2, 2, 2, 3, 2, 1, 0,-1,-2 };
\r
540 new private string name = "Uston SS";
\r
541 new private int level = 2;
\r
542 public override string MethodName{ get{ return name; }}
\r
543 public override int MethodLevel{ get{ return level; }}
\r
546 public class WongHalves : CountMethod
\r
548 public WongHalves( int n ) : base( n )
\r
552 protected override double[] GetCounts() { return counts; }
\r
553 // Card counts A 2 3 4 5 6 7 8 9 T
\r
554 protected double[] counts = new double[] {-1,.5, 1, 1,1.5,1,.5, 0,-.5,-1 };
\r
555 new private string name = "Wong Halves";
\r
556 new private int level = 1;
\r
557 public override string MethodName{ get{ return name; }}
\r
558 public override int MethodLevel{ get{ return level; }}
\r
561 public class ZenCount : CountMethod
\r
563 public ZenCount( int n ) : base( n )
\r
567 protected override double[] GetCounts() { return counts; }
\r
568 // Card counts A 2 3 4 5 6 7 8 9 T
\r
569 protected double[] counts = new double[] {-1, 1, 1, 2, 2, 2, 1, 0, 0,-2 };
\r
570 new private string name = "Zen Count";
\r
571 new private int level = 2;
\r
572 public override string MethodName{ get{ return name; }}
\r
573 public override int MethodLevel{ get{ return level; }}
\r
576 public class HiLoA : CountMethod
\r
578 // The standard HiLo method with an Ace side count
\r
579 public HiLoA( int n ) : base( n )
\r
583 protected override double[] GetCounts() { return counts; }
\r
584 // Card counts A 2 3 4 5 6 7 8 9 T
\r
585 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 0, 0, 0,-1 };
\r
586 public override double GetWager( double normalBet )
\r
589 double trueCount = Count;
\r
590 int aceCount = base.SideCount( Card.CardType.Ace );
\r
592 double aceRatio = ((cardCount / 13.0) - aceCount) / (( Decks*52 - cardCount ) / 52.0 );
\r
593 trueCount += aceRatio;
\r
595 if( trueCount > 0 )
\r
596 wager = normalBet * trueCount;
\r
597 else if( trueCount == 0 )
\r
599 else if( trueCount < 0 )
\r
600 wager = normalBet * trueCount;
\r
602 // $10 table minimum :) Also, round to nearest integer
\r
603 wager = (int)Math.Max( 10, wager );
\r
608 new private string name = "Hi-Lo Ace Side Count";
\r
609 new private int level = 1;
\r
610 public override string MethodName{ get{ return name; }}
\r
611 public override int MethodLevel{ get{ return level; }}
\r
614 public class HiOptIA7 : CountMethod
\r
616 public HiOptIA7( int n ) : base( n )
\r
620 protected override double[] GetCounts() { return counts; }
\r
621 // Card counts A 2 3 4 5 6 7 8 9 T
\r
622 protected double[] counts = new double[] { 0, 0, 1, 1, 1, 1, 0, 0, 0,-1 };
\r
623 public override double GetWager( double normalBet )
\r
626 double trueCount = Count;
\r
627 int aceCount = base.SideCount( Card.CardType.Ace );
\r
628 int sevenCount = base.SideCount( Card.CardType.Seven );
\r
630 double aceRatio = ((cardCount / 13.0) - aceCount) / (( Decks*52 - cardCount ) / 52.0 );
\r
631 double sevenRatio = ((cardCount / 13.0) - sevenCount) / (( Decks*52 - cardCount ) / 52.0 );
\r
632 trueCount += aceRatio;
\r
633 trueCount += sevenRatio;
\r
635 if( trueCount > 0 )
\r
636 wager = normalBet * trueCount;
\r
637 else if( trueCount == 0 )
\r
639 else if( trueCount < 0 )
\r
640 wager = normalBet * trueCount;
\r
642 // $10 table minimum :) Also, round to nearest integer
\r
643 wager = (int)Math.Max( 10, wager );
\r
648 new private string name = "Hi Opt I Ace Seven side counts";
\r
649 new private int level = 1;
\r
650 public override string MethodName{ get{ return name; }}
\r
651 public override int MethodLevel{ get{ return level; }}
\r