Ipotizzando una lista di N componenti, per effettuare tutti match possibili tra i giocatori non devi far altro che far sfidare prima il giocatore 0 con il giocatore 1, poi 0 con il giocatore 2, ecc..., fino a 0 contro il giocatore N-1. Successivamente, ricominci il loop facendo scontrare il giocatore 1 con il giocatore 2, il giocatore 1 con il giocatore 3, ecc..., sempre fino a 1 contro N-1. Come vedi, l'unica differenza è l'aumentare dell'indice del giocatore "principale" e dell'indice di partenza per le sfide. In questo modo eviti di ripetere sfide. Qualche ciclo for (o while se preferisci) dovrebbe essere sufficiente.
Ho realizzato anche una versione grafica delle iterazioni effettuate dal programma per farti comprendere meglio