Sprawdzenie czy wypadł mały strit w "kościach"

0

Witam. W temacie pod adresem: http://4programmers.net/Forum/549141 poruszyłem
kwestię rozróżniania układów pięciu 6 ściennych kostek do gry. Ilości wylosowanych oczek zapisuję w
tablicy, ale pojawił się problem. Myślałem, że mój kod działa poprawnie, ale jednak nie, gdyż mam
problem ze stwierdzeniem czy wypadł mały strit czyli na przykład układ oczek 1 2 3 4 4, a poniższy
kod (pochodzący z modułu compos, który wkleiłem w pośtcie pod powyższtm linkiem) za poprawnego
małego strita bierze również np kombinację 1 4 5 6 6, ktora jak widać małym stritem nie jest, bo mały strit
to cztery takie same kolejne oczka. Masz ktoś z Was może jakiś pomysł jak poprawić poniższa funkcję
aby działała poprawnie? Procedura o nazwie ZliczanieKosci; jak nazwa wskazuje zlicza ilości wystąpienia
poszczegółnych oczek, wcześniej sortując tablicę bajtów zawierającą oczka - rosnąco. Pozostałe układy
oczek sprawdzam raczej ok - przynajmniej tak wynika z moich testów, problem jest tylko z małym stritem.

function CzyWypadlMalyStrit: boolean;
const
  Przynajmniej = 4;
var
  I, Cnt : Byte;
begin
  Result := False;
  ZliczanieKosci;
  Cnt := 0;
  for I := Low(IlosciTab) to High(IlosciTab) do
  begin
    if (IlosciTab[I] > 0) then
    begin
      Cnt := Cnt + 1;
    end;
  end;
  if (Cnt = Przynajmniej) or (CzyWypadlDuzyStrit = True) then
  begin
    Result := True;
  end;
end;

EDIT: Już sobie poradziłem. Mianowicie w google wpisując delphi yahtzee game trafiamy na stronę
http://www.blueorbsoft.com/yahtzee/index.html która aktualnie nie działa. Ale od czego jest przecież
web.archive.org i tam pod poniższym adresem znajdujemy źródło gry Yahtzee w Delphi, mi się ono
nie kompiluje, bo nie znajduje zasobów i nie chciałem się w to bawić, bo potrzebny jest mi tylko kod
sprawdzający czy mamy "Small Straight". No i znalazłem. Kod jest dosyć prosty, ale nie mogłem na to
wpaść. Poniżej wklejam rozwiązanie oraz link do źródeł tamtej gry. Przy okazji dodam, że algorytm
zaliczy także mały strit kiedy mamy dużego, czyli dokładnie tak jak powinno być. A oto link do źrodeł
http://web.archive.org/web/20080131184159/...tzee/index.html w innym temacie też poprawiłem kod.

function CzyWypadlMalyStrit: boolean;
var
  I : Byte;
  A, B, C, D, E, F : Byte;
begin
  Result := False;
  ZliczanieKosci;
  for I := Low(OczkaTab) to High(OczkaTab) do
  begin
    if OczkaTab[I] = 1 then A := 0;
    if OczkaTab[I] = 2 then B := 1;
    if OczkaTab[I] = 3 then C := 2;
    if OczkaTab[I] = 4 then D := 3;
    if OczkaTab[I] = 5 then E := 4;
    if OczkaTab[I] = 6 then F := 5;
  end;

  if ((A = 0) and (B = 1) and (C = 2) and (D = 3)) or
  ((B = 1) and (C = 2) and (D = 3) and (E = 4)) or
  ((C = 2) and (D = 3) and (E = 4) and (F = 5)) then
    Result := True;
end;
0

O ile dobrze pamiętam w Twoim programie zastosowałeś coś na kształt histogramu - tabeli, która zawiera ilość wystąpień każdej z możliwych wartości na kostce 1..6.
Jeśli tak, to sprawdzenie stritów jest banalnie proste i sprowadza się do wyznaczenia najdłuższego ciągu kolejnych wyników rzutu. Poniższy kod wpisuje do zmiennej lMax długość najdłuższego strita.

lMax := 0;
lString := 0;
for i := Low(Histogram) to High(Histogram) do
  if Histogram[i] > 0 then begin
    Inc(lString);
    lMax := Max(lString,lMax);
  end else
    lString := 0;
0

Dzięki za sugestie, ale raczej zostane przy tamtej metodzie, bo kod jest podobny do użytego wczęsniej.

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