Stworzenie listy spotkań graczy.

0

Witam.

Nie bardzo wiedziałem jak zatytułować ten post. Otóż próbuję napisać program do przeprowadzenia
rozgrywek Pucharu Polski w grze Sensible World Of Soccer i póki co utknąłem nad takim problemem,
a mianowicie jak uzyskać taki efekt jak pod poniższym linkiem to znaczy umiem obliczyc ilość pól
do wpisania wyników w dynamicznie tworzoncyh editach a liste graczy mam w ListView PlayersGrpLW.

Played := (2 * PlayersGrpLW.Items.Count) - 2;
TeamCnt := PlayersGrpLW.Items.Count;
MatchCnt := (Played * TeamCnt) div 2;

Link to: http://www.sensiblesoccer.de/index.php?site=turniere_ergebnisse&tid=737&rid=3053&gid=3

Chodzi głownie o to jak stworzyć listę unikalnych spotkań. To znaczy tak pobrać nazwy graczy z
tabeli, aby uzyskać unikalne pary. Przy założeniu że z każdym przeciwnikiem gra się dwa razy.
Kombinowałem, ale działa ok tylko dla dwóch i trzech drużyn w tabeli. Jakby ktoś pisał kiedyś
coś takiego a'la manager czy może podobny program to prosiłbym o przykładowy kod procedury.

0

Pętla for i lecisz!

0

A można konkretniej, bo kombinuje i nie bardzo mi wychodzi, dla dwóch zawodników i trzech jest ok, ale przy
czterech powtarzają mi się wpisy. Poza tym nie wiem jak wykombinować, że jak istnieje już wynik na przykład
Gracz_A vs Gracz_B, to ma być odwrotność Gracz_B vs Gracz_A. Robię to takim kodem, lecz to ciągle nie to.

 public
    PlayersGrpLW : TListView;
    TeamCnt, MatchCnt, Played : integer;
  end;

  const
    VersusSeparator = ' vs ';
{...}
var
   I, J : integer;
   Player, Oponent : string;
begin
   PlayersGrpLW := LWgra;
   Played := (2 * PlayersGrpLW.Items.Count) - 2;
   TeamCnt := PlayersGrpLW.Items.Count;
   MatchCnt := (Played * TeamCnt) div 2;

   TempList1.Clear;
   TempList2.Clear;
   MatchesList.Clear;

  for J := 1 to Played div 2 do
    for I := 0 to PlayersGrpLW.Items.Count -1 do
   begin
     TempList1.Items.Add(PlayersGrpLW.Items[I].Caption);
     TempList2.Items.Add(PlayersGrpLW.Items[I].Caption);
   end;
  I := 0;
  J := TempList2.Items.Count -1;
   repeat
    Player := AnsiUpperCase(TempList1.Items[I]);
     TempList1.Items.Delete(I);
      Oponent := AnsiUpperCase(TempList2.Items[J]);
     TempList2.Items.Delete(J);
    I := TempList1.Items.Count-1;
   J := TempList2.Items.Count-1;
  MatchesList.Items.Add(Player + VersusSeparator + Oponent);
   until (TempList1.Items.Count = 0) and (TempList2.Items.Count = 0);
end;
0

Nie wiem czy dobrze rozumiem, chodzi Ci o ułożenie terminarza rozgrywek ligowych ? Kto z kim w pierwszej kolejce, kto z kim w drugiej, itd ... ?

0
for i := 1 to PlayerCount
  for j := 1 to PlayerCount
    if j < i then
     { playerA vs PlayerB }
    else if i = j
     { gracz ma wolny los walkowerem :P }
   else
     { playerB vs PlayerA }
0
bogdans napisał(a)

Nie wiem czy dobrze rozumiem, chodzi Ci o ułożenie terminarza rozgrywek ligowych ? Kto z kim w pierwszej kolejce, kto z kim w drugiej, itd ... ?

Chodzi mi dokładnie o taki sam efekt jaki jest na stronie (jak możesz to zobacz
na listę pod tabelą): http://www.sensiblesoccer.de/index.php?site=turniere_ergebnisse&tid=737&rid=3053&gid=3
Nie chodzi tutaj o terminarz ligowy, tylko o pary druzyn rozgrywających Puchar
w fazie grupowej - to jest kazdy z kazdym rozgrywa dwa mecze. Masz jakis kod?

0

Przecież TBS podał kod. O co jeszcze chodzi?!

0

Ale nie o to mi za bardzo chodziło, ale odpowiedź z przykłądowym kodem dostałem już na innym forum.
Poniżej zamieszczam gotowy kod, który do tworzenia listy i wyświetlenia wyników wykorzystuje ListBoxy.

PlayersGrpLW : TListView;
const
VersusSeparator = ' vs ';
{...}
function SwapPlayers(Str : string) : string;
var
HomePlayer, AwayPlayer : string;
begin
HomePlayer := Copy(Str, 1, Pos(VersusSeparator, Str) - 1);
AwayPlayer := Copy(Str, Pos(VersusSeparator, Str) + Length(VersusSeparator), Length(Str));
Result := AwayPlayer + VersusSeparator + HomePlayer;
end;
{...}
var
T, Y, N : integer;
TempList : TLisTBox;
begin
TempList := TListBox.Create(Self);
TempList.Parent := MainForm;
TempList.Visible := False;
TempList.Sorted := False;
TempList.Clear;

MatchesList := TListBox.Create(Self);
MatchesList.Parent := MainForm;
MatchesList.Visible := False;
MatchesList.Sorted := False;
MatchesList.Clear;

PlayersGrpLW := LWgra;
N := PlayersGrpLW.Items.Count;
for T := 0 to N-1 do
for Y := T+1 to N-1 do
begin
TempList.Items.Add(PlayersGrpLW.Items[T].Caption + VersusSeparator + PlayersGrpLW.Items[Y].Caption);
end;

for T := 0 to TempList.Count-1 do
begin
MatchesList.Items.Add(TempList.Items[T]);
MatchesList.Items.Add(SwapPlayers(TempList.Items[T]));
end;
ListBox1.Clear;
ListBox1.Items := MatchesList.Items;
end;

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