Algorytm PokerTexas Holde'm

0

Witam,
Poszukuję algorytmu (lub pomysłu na niego) jak napisać "sprawdzanie" kart w pokerze, odmiana texas holdem?

Dla niewtajemniczonych dodam na czym to polega...

Gracz ma 2 karty na ręce, 5 kart jest "wspólnych" na stole... Z tych dwóch na ręce i 3 dowolnych ze stołu gracz wybiera najwyższą "figurę pokerową"... W tym przypadku chodzi o to, że to program ma wybrać tę najdogodniejszą figurę...

Jeśli ktos ma pomysł/propozycję jak rozwiązać tego typu algorytm to będę niewymownie wdzięczny...

0

3 karty z 5 możesz wybrać na 10 (słownie dziesięć) sposobów, sprawdzanie odbywa się raz na partię a nie w pętli 2000 razy na sekundę, więc osobiście zrobiłbym chyba tak, że program sprawdzałby wszystkie figury pokerowe, które jest w stanie uzyskać i wybierał tą najlepszą....

0

Zaciekawił mnie temat, więc posiedziałem chwilę nad tym i efektem jest taki oto kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TKarty = (kierAS, kierKROL, kierDAMA, kierWALET, kier10, kier9,
            karoAS, karoKROL, karoDAMA, karoWALET, karo10, karo9,
            pikAS, pikKROL, pikDAMA, pikWALET, pik10, pik9,
            treflAS, treflKROL, treflDAMA, treflWALET, trefl10, trefl9);

type
  TZbiorKart = set of TKarty;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CheckCards(rozdane : TZbiorKart);
  end;

var
  Form1: TForm1;
  Rozdane : TZbiorKart;
  Figury : array of TZbiorKart;
  Opisy : array of string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 rozdane := [kierAS, karoAS, karoKROL, treflDAMA, pikWALET, pik10, trefl9];
 CheckCards(rozdane);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 rozdane := [kierAS, karoAS, karoKROL, treflDAMA, pikWALET, pik10, trefl9];
 CheckCards(rozdane);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 rozdane := [pikAS, karoAS, karoKROL, treflWALET, pikWALET, pik10, trefl9];
 CheckCards(rozdane);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 rozdane := [kierAS, karoAS, pikAS, treflDAMA, pikWALET, pik10, trefl9];
 CheckCards(rozdane);
end;

procedure TForm1.CheckCards(rozdane: TZbiorKart);
var
 I: Integer;
 s: string;
begin
 s := 'Nic';
 for I := 0 to high(figury) do
   begin
     if rozdane * figury[i] = figury[i] then
      begin
       s := Opisy[i];
       break;
      end;
   end;
 form1.Caption := s;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j,k,l,m : integer;
begin
 //kombinacje pokerów
 for I := 1 to 4 do
   begin
     for j := 1 to 4 do
       begin
         for k := 1 to 4 do
           begin
             for l := 1 to 4 do
               begin
                 for m := 1 to 4 do
                   begin
                     SetLength(figury,high(figury)+2);
                     if i=1 then Include(figury[high(figury)],kierAS) else
                     if i=2 then Include(figury[high(figury)],karoAS) else
                     if i=3 then Include(figury[high(figury)],pikAS) else
                     if i=4 then Include(figury[high(figury)],treflAS);

                     if j=1 then Include(figury[high(figury)],kierKROL) else
                     if j=2 then Include(figury[high(figury)],karoKROL) else
                     if j=3 then Include(figury[high(figury)],pikKROL) else
                     if j=4 then Include(figury[high(figury)],treflKROL);

                     if k=1 then Include(figury[high(figury)],kierDAMA) else
                     if k=2 then Include(figury[high(figury)],karoDAMA) else
                     if k=3 then Include(figury[high(figury)],pikDAMA) else
                     if k=4 then Include(figury[high(figury)],treflDAMA);

                     if l=1 then Include(figury[high(figury)],kierWALET) else
                     if l=2 then Include(figury[high(figury)],karoWALET) else
                     if l=3 then Include(figury[high(figury)],pikWALET) else
                     if l=4 then Include(figury[high(figury)],treflWALET);

                     if m=1 then Include(figury[high(figury)],kier10) else
                     if m=2 then Include(figury[high(figury)],karo10) else
                     if m=3 then Include(figury[high(figury)],pik10) else
                     if m=4 then Include(figury[high(figury)],trefl10);

                     SetLength(opisy,high(Opisy)+2);
                     Opisy[high(Opisy)] := 'Duży Poker';
                   end;
               end;
           end;
       end;
   end;
   //wszystkie kombinacje dla innych figur
end;

end.

Maknkamentem jest to że trzeba stworzyć tablicę wszystkich możliwości dla figur (chodzi o miksy kolorów). Na szczęście można to wykonać półautomatycznie (przykład w OnCreate).
Warunkiem poprawnego działania, jest umieszczenie w tablicy figur w kolejności ich "ważności", ponieważ gdy pętla natknie się na kombinację istniejącą, to przerywa działanie.

W tym kodzie, naciśnięcie buttona 1 lub 2 spowoduje wyświetlenie napisu "DUŻY POKER" natomiast
3 lub 4 wyświetli "NIC"

0

Dzieki wielkie :) Skorzystam z rady i przeanalizuje... Wskazówka nr dwa, która jeszcze trochę utrudni pisanie takiego kodu to fakt że w Holdema gra sie 52 kartami ;)

W miedzyczasie sam babrałem się w tym troche... Oto na co ja wpadłem (prosze tylko nie krytykować "optymalności" takiego pomysłu)...

Zasadniczo na razie planuję algorytm bez implementacji dlatego opis będzie niestety póki co tylko słowny :(

Tworze tablice 2d - jedna kolumna to wartosci kart (kolejno 2-10, figury jako 11,12,13,14) druga to kolory... Pozwoli to na łatwe porównanie ich ze sobą...
Póki co mam pomysł na procedurę służącą badaniu zależności wartości kart pod względem grup (para, dwie pary, trójka, full, kareta)...
Procedura otrzymuje jako parametr wartosci kart (kolory nie grają roli): k1,k2 (czyli te na ręce) k3,k4,k5,k6,k7 (czyli te na stole).
Pierwszy analizowany przypadek (nieco prostszy) to k1=k2.
Jakie teraz analizujemy przypadki...

  licznik1 := 2;
  //sprawdzanie zaleznosci na rece
  if (k1=k3) then licznik1 := licznik1+1;
  if (k1=k4) then licznik1 := licznik1+1;
  if (k1=k5) then licznik1 := licznik1+1;
  if (k1=k6) then licznik1 := licznik1+1;
  if (k1=k7) then licznik1 := licznik1+1;

  //sprawdzanie zaleznosci na stole
  if (k3=k4) then licznik2 := licznik2+1;
  if (k3=k5) then licznik2 := licznik2+1;
  if (k3=k6) then licznik2 := licznik2+1;
  if (k3=k7) then licznik2 := licznik2+1;

  if (k4=k5) then licznik2 := licznik2+1;
  if (k4=k6) then licznik2 := licznik2+1;
  if (k4=k7) then licznik2 := licznik2+1;

  if (k5=k6) then licznik2 := licznik2+1;
  if (k5=k7) then licznik2 := licznik2+1;

  if (k6=k7) then licznik2 := licznik2+1;

  if (licznik1=4) then Label1.Caption := 'Masz karete'
  else if (licznik2=1) then Label1.Caption := 'Masz '+intTostr(licznik1)+' takie same karty'
  else if (licznik1=2) AND (licznik2=2) then Label1.Caption := 'Masz dwie pary'
  else if (licznik1=2) AND (licznik2=3) then Label1.Caption := 'Masz fula'
  else if (licznik2=2) AND (licznik1=3) then Label1.Caption := 'Masz fula'
  end

Sytuacja gdzie k1!=k2 jest troche bardziej zawiła ale działa na podobnej zasadzie...
Rozwiązanie takie ma parę wad... Np. w przypadku k1!=k2 ale nie będę się w nie zagłębiał bo to dotyczy już ścisłych szczegółów zasad pokerowych...

Co do porównywania koloru - to nie jest problem... Jeśli chodzi o streety to myślę aby to tak rozwiązać by karty z ręki porównywać z pozostałymi (w sensie: umieszczam k1 pomiędzy jedną większą i jedną mniejszą... Różnice nie wynoszą |1| to znaczy że szans na streeta nie ma... jeśli inaczej - analogicznie dalej)...

Pytanie - czy warto w to brnąć w ten sposób, czy może lepiej tak jak przedstawił to kolega wcześniej, czy może jeszcze co innego...

1 użytkowników online, w tym zalogowanych: 0, gości: 1