KO-Turnier

devo22

Mitglied
Hi, ich soll ein KO-Turnier erstellen, das Ergebnis (Sieger, Finalist, Halbfinalisten etc) zufällig bestimmen und am Ende das Turnierergebnis in dieser Form ausgeben, zB:

Sieger: F
Finalist: C
Halbfinale: F:A, C:B
Viertelfinale: F:H, C:E, A:G, B:D
...

Ich habe es bereits geschafft, mit Scanner ein Turnier mit 4, 8, 16 und 32 Teilnehmern aufzubauen, mit collections.shuffle die Liste mit den Teilnehmern durchzumischen und Sieger und Finalist auszugeben. Was ich nicht schaffe ist der Aufbau der Turnierstruktur am Ende. Hat jemand eine Idee, wie das am einfachsten/effektivsten umzusetzen wäre? Würde mich über jede Hilfe freuen!!!

Hier mein bisheriger Code:

Java:
import java.util.*;
import java.io.*;

public class Tournament {

  public static void main (String [] args) {
	
	
	System.out.println("How many teams should participate? 4, 8, 16 or 32?");
	
	Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
	LinkedList list = new LinkedList();
	String s="";
	
	if (n == 4)
	{
	s = "A B C D";
	}
	
	if (n == 8)
	{
	s = "A B C D E F G H";
	}
	
	if (n == 16)
	{
	s = "A B C D E F G H I J K L M N O P";
	}
	
	if (n == 32)
	{
	s = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5";
	}
	
	System.out.println();
	System.out.println("Participants: ");
	System.out.println(s);
	System.out.println();
	
	Scanner number = new Scanner(s);
	
	while (number.hasNext()) {
	list.add(number.next());
	}
	System.out.println();
		
	ListIterator it = list.listIterator();
	
	Collections.shuffle(list, new Random());        
     
     System.out.println("Winner: " + list.get(0));
	 System.out.println("Runner-up: " + list.get(1));
	 System.out.println("");
	}
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Poste mal mehr Details von der Aufgabenstellung. Ist dort explizit gefortder, Strings in dieser Form zu verwenden? Das sieht sehr schräg aus (wenn, dann kann man es auch einfacher machen, aber nur um das einordnen zu können...)
 

devo22

Mitglied
Die komplette Aufgabenstellung lautet folgendermaßen:

Write a program that first accepts a list of players participating in a knock-out tournament.
Then it shall randomly determine the initial pairings.
It shall further accept the results of the individual competitions in any logically possible order.
Finally it shall print the result tree in the following form: winner at the top, 2nd line: finals pairing, 3rd line: the 2 semi-finals pairings, etc.

E.g.:
B
A:B
C:A, B:D
....
 
G

Gast2

Gast
Ich würde mir auf jedenfall noch mindestens eine Klasse Paarung erstellen, die zwei Teilnehmer enthält und per Zufallszahl einen Gewinner bestimmt.
Pro Runde hast du eine Liste mit Paarungen. Aus den Gewinnern der jeweiligen Paarungen erstellst du dann wieder neue Paarungen, bis du nur noch eine Paarung hast und den Gewinner bestimmen kannst.
Wenn du dir dann im Laufe des Turniers alle Listen merkst kannst du auch den gwünschten Output erzeugen.
 

devo22

Mitglied
Ich würde mir auf jedenfall noch mindestens eine Klasse Paarung erstellen, die zwei Teilnehmer enthält und per Zufallszahl einen Gewinner bestimmt.
Pro Runde hast du eine Liste mit Paarungen. Aus den Gewinnern der jeweiligen Paarungen erstellst du dann wieder neue Paarungen, bis du nur noch eine Paarung hast und den Gewinner bestimmen kannst.
Wenn du dir dann im Laufe des Turniers alle Listen merkst kannst du auch den gwünschten Output erzeugen.
Danke, das hilft mir schon mal weiter!!!

Hab das mal eben so gemacht:

Java:
public class Pairings {

String a;
String b;
LinkedList l;
int choice;

public Pairings (String first, String second, LinkedList list) {

a = first;
b = second;
l = list;

    Random r = new Random(); 
    choice = r.nextInt(2);
    
	if(choice==0)
        {
	l.add(a);
	}

        else
        {
	l.add(b);
        }
   }
}
Nur ist mir jetzt unklar wie ich die Paarungen aus dem Scanner erstellen soll ...
 

devo22

Mitglied
habe jetzt in der Tournament-Klasse folgendes noch hinzugefügt, um die Pairings zu gestalten:

Java:
int i = 0;
	int j = 1;
	LinkedList l1 = new LinkedList();
	
	while (j < n) {
    Pairings p1 = new Pairings(list.get(i), list.get(j), l1);
	i=i+2;
	j=j+2;
	System.out.print(list.get(i) + " : " + list.get(j) + ", ");
	}
	System.out.print(l1);
Das funktioniert auch, nur bei der letzten Paarung bekomme ich eine OutofBounds-Exception :eek:
 

devo22

Mitglied
Habe mich jetzt noch mal dazugesetzt - und das Beispiel funktioniert jetzt. Nur leider bin ich damit nicht wirklich zufrieden, weil die Lösung ziemlich umständlich ist. Ich würde das ganze gerne noch um einiges kompakter haben ... hat jemand Verbesserungsvorschläge für mich?

Java:
import java.util.*;
import java.io.*;

public class Tournament {

  public static void main (String [] args) {
		
	System.out.println("How many teams should participate? 4, 8 or 16?");
	
	Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
	int o = n;
	LinkedList list = new LinkedList();
	String s="";
	
	if (n == 4)
	{
	s = "A B C D";
	}
	
	if (n == 8)
	{
	s = "A B C D E F G H";
	}
	
	if (n == 16)
	{
	s = "A B C D E F G H I J K L M N O P";
	}
	
	System.out.println();
	System.out.println("Participants: ");
	System.out.println(s);
	System.out.println();
	
	Scanner number = new Scanner(s);
	
	while (number.hasNext()) {
	list.add(number.next());
	}

	System.out.println();
	Collections.shuffle(list, new Random());        
	
	int i = 0;
	int j = 1;
	LinkedList l1 = new LinkedList();
	LinkedList l2 = new LinkedList();
	LinkedList l3 = new LinkedList();
	LinkedList l4 = new LinkedList();
	LinkedList pairings1 = new LinkedList();
	LinkedList pairings2 = new LinkedList();
	LinkedList pairings3 = new LinkedList();
	LinkedList pairings4 = new LinkedList();
	
	while (i < n && j < n) {
    Pairings p1 = new Pairings(list.get(i), list.get(j), l1);
	pairings1.add(list.get(i) + " : " + list.get(j) + " ");
	i=i+2;
	j=j+2;
	}
		
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l1, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l1.get(i), l1.get(j), l2);
	pairings2.add(l1.get(i) + " : " + l1.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l2, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l2.get(i), l2.get(j), l3);
	pairings3.add(l2.get(i) + " : " + l2.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l3, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l3.get(i), l3.get(j), l4);
	pairings4.add(l3.get(i) + " : " + l3.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	System.out.println("RESULTS:");
	System.out.println();
	
	if (o == 4) {
	System.out.println("WINNER: " + l2.get(0));
	System.out.println("SEMI-FINALS: " + pairings2);
	System.out.println("QUARTER-FINALS: " + pairings1); }
	
	if (o == 8) {
	System.out.println("WINNER: " + l3.get(0));
	System.out.println("FINALS: " + pairings3);
	System.out.println("SEMI-FINALS: " + pairings2);
	System.out.println("QUARTER-FINALS: " + pairings1); }
	
	if (o == 16) {
	System.out.println("WINNER: " + l4.get(0));
	System.out.println("FINALS: " + pairings4);
	System.out.println("SEMI-FINALS: " + pairings3);
	System.out.println("QUARTER-FINALS: " + pairings2);
	System.out.println("ROUND OF 16: " + pairings1); }
	}
	}

Java:
import java.util.*;
import java.io.*;

public class Pairings {

Object a;
Object b;
LinkedList l;
int choice;

public Pairings (Object first, Object second, LinkedList list) {

a = first;
b = second;
l = list;

    Random r = new Random(); 
    choice = r.nextInt(2);
    
	if(choice==0)
    {
	l.add(a);
	}

    else
    {
	l.add(b);
	}
}
}
 

Marco13

Top Contributor
Ja, ist eher... schlecht...

EDIT: Vielleicht noch vorneweg: Das ist KEINE Empfehlung, etwas derartiges zu machen - das soll lediglich MEINE Interpretation der Aufgabenstellung andeuten!

Write a program that first accepts a list of players participating in a knock-out tournament.
->
Java:
setInitialPlayers(listOfPlayers); // List contains 2^n elements, e.g. Strings

Then it shall randomly determine the initial pairings.
Mit einem expliziten Aufruf? Soll die Liste zurückgeliefert werden? Steht nicht dabei. Im Zweifelsfall kann das direkt in 'setInitialPlayers' gemacht werden.

It shall further accept the results of the individual competitions in any logically possible order.
->
Java:
setResult(winner, loser); // Two elements from the listOfPlayers

Finally it shall print the result tree in the following form: winner at the top, 2nd line: finals pairing, 3rd line: the 2 semi-finals pairings, etc.
Das Format ist dort Beispielhaft angegeben. Nichts mit "SEMI-FINALS" usw., einfach nur die Player-Strings der jeweiligen Runde zeilenweise...
 
E

emailundlos

Gast
Beim Schach ist es z.B. so, dass nach vorher festgelegten und klar definierten Wettkampfregeln gespielt wird. Welche sind das hier? Ohne Eingabe soll ja jeweilige Sieger ermittelt werden, zufallig, warum?
 

Neue Themen


Oben