Lotto Spiel

  • Themenstarter Themenstarter Nanny McPhie
  • Beginndatum Beginndatum
N

Nanny McPhie

Gast
huhu,
ich brauche mal hilfe 🙂 wir haben grad das thema arrays und java in info und das versteh ich gar nicht 😀 Jetzt sollen wir ein Lottospiel programmieren (- was ich noch hin bekommen hab) aber jetzt sollen wir noch sagen lassen wie viele Richtige der Spieler hatte? Wie mache ich das? Bitte mit möglichst wenigen Fachbegriffen erklären - ich verstehs echt nicht ....
LG
 
Auf eine grobe Frage mit wenig Informationen folgt eine genauso grobe Antwort:
Die 6 Zahlen des Users mit den 6 Gezogenen vergleichen, bz.w schauen ob Zahl 1,2,3,..usw. vom User bei den gezogenen dabei ist.

Wie man das jetzt umsetzt kommt eben drauf an. Hast du Arrays? Listen? etc...
 
Wo ist das Problem?

Du hast zwei Arrays:
1) Die Lotto Ziehung
2) Spieler Tip

Dann iterierst du über eine von beiden und guckst ob die Zahl im jeweiligen anderen Array vorhanden ist. Wenn ja, erhöhst du einen Counte rum 1. Fertig.
 
hi
also ich stell euch jetzt mal den gesamten JAVA rein und mein Lsg ansatz der aber nicht klappt

Java:
public class insLotto {

  public static void main(String[] args) {
     int[] lotto=new int[50];
     int[] tip=new int[50];
     int y = 0;
     int zufall=1;
     int k=0;
     int zahl = 0 ;
     int r=0;
     Scanner in=new Scanner(System.in);
     System.out.println("Geben Sie ihre 6 Zahlen ein:");
     for(int i=1; i<7; i++) {
       k=1;
       while (!(k==2)) {
             zahl=in.nextInt();
             if (zahl<50) {
             if (tip[zahl]==0 && zahl!=0) {
                k=2;
             }
             else {
                  System.out.println("Nehmen Sie eine andere Zahl!");
             }
             if (zahl>49) {
                System.out.println("Bitte geben Sie eine Zahl unter 50 ein!");
             }
             }
             else {
             System.out.println("zahl<50!");
             }


       }
       tip[zahl]=1;
     }

     System.out.println("Die gezogenen Zahlen sind:");
     for(int i=1; i<7; i++) {
     y=1;
     while (!(y==2)) {
     zufall = (int) (Math.random()*50);
     if (lotto[zufall]==0 && zufall!=0) {
        y=2;
     }
     }
     lotto[zufall]=1;
     System.out.println(zufall);
     }


     
   }
   
   }
 
hier der Lösungsansatz
Java:
System.out.println("Sie haben mit folgenden Zahlen gewonnen:");
          for(int i=0; i<=5; i++)
          {
              for(int j=0; j<=5; j++)
              {
                  if (zufall[i] == zahl[j])
                      System.out.println(zahl[j]);
              }
          }
 
Räum erst mal deinen Code auf - dann wird es einfacher

Grundgerüst:
Java:
public class Lotto {

	private static int[] lottozahlenZiehen() {
		//zahlen ziehen
	}

	private static int[] tipEingeben() {
		//tip eingeben
	}

	private static int trefferZaehlen(int[] lottozahlen, int[] tip) {
		//vergleichen
	}

	public static void main(String[] args) {
		int[] lottozahlen = lottozahlenZiehen();
		int[] tip = tipEingeben();
		int treffer = trefferZaehlen(lottozahlen, tip);
		System.out.println("Treffer: " + treffer);
	}

}
 
Hallo Nanny McPhie,
Deine Art in Java zu programmieren ist nicht ganz im Sinne des Erfinders, wie dir fassy deutlich machen will.
Als altem Basic-Programmierer und Java-Anfänger liegt mir aber die lineare Programmierung auch näher.

Ganz gut find ich den Ansatz, dass du Arrays mit 50 Elementen nimmst und dort nur Flags setzt, also quasi den Lottoschein immitierst, auch wenn es da dann ein bool-Array 49 Elementen getan hätte. Das Element im dem Index 0 darf man ja durchaus auch verwenden. Du musst dann halt statt z.B. Tip[Zahl] vielleicht Tip[Zahl-1] schreiben.
Weniger gefällt mir dann der if then Konstrukt (bei der Eingabe). Das ist schon wegen fehlender Einrückungen schwer lesbar.
Dann prüfst du zunächst, ob die eingegeben Zahl < 50 ist und dann, inwieweit diese Zahl bereits eingebene war.
Später dann nochmal, ob die Zahl >49 ist.
Wäre es hier nicht sinnvoller zu prüfen inwieweit Zahl < 1 oder Zahl > 49 und wenn
- Ja, Fehlermeldung
- sonst : Wenn Zahl schon da, dann Fehlermeldung, sonst Zahl eintagen und "while" verlassen..

Nachdem ich ja auch ein JAVA-Anfänger bin, weiss ich auch nicht, inwieweit das Array mit der Deklaration schon Werte enthält.
In Basic hätte ich erwartet dass alle Elemente des Array 0 sind, ohne dass ich dafür irgendwas zu tun hätte.
Wenn das bei Java auch so wäre, kein Problem, anderfalls aber schon.

Am Ende musst du - gemäß deiner Methode - die beiden Felder parallel vergleichen und zwar mit Index von 1 bis 49
Ein Treffer liegt vor, wenn Tipp = 1 und Lotto = 1;
 
Ich hab mal versucht dein Beispiel etwas "Java-gerecht" umzugestalten.
Kannst du dir ja vielleicht mal anschauen und du findest dann sicherlich auch leicht heraus,
wie man das ändern kann, so dass MeinTip durch Zufallszahlen entsteht und die
Gewinnzahlen eingegeben werden müssen.

Unbeachtet bleibt bei der ganzen Geschichte die Zusatzzahl, aber es ist ja auch nur ein Beispiel.

Java:
import java.util.*;

public class CLotto
{
  public static void main (String[] args) 
  {
    Lottozahlen MeinTip = new Lottozahlen();
    Lottozahlen GewinnZahlen = new Lottozahlen();
    MeinTip.eingeben();
    MeinTip.anzeigen("Mein Tip lautet:");
    GewinnZahlen.ziehen();
    GewinnZahlen.anzeigen("Die Gewinnzahlen lauten:");
    GewinnZahlen.vergleichen(MeinTip);
  }
}

class Lottozahlen 
{
  boolean a[];

  Lottozahlen()
  {
     this.a = new boolean[49];
  }

  public void ziehen()
  {
    for (int i=0;i < 49; i++)
      this.a[i] = false;

    for(int i=0; i<6; i++) 
    { 
      int zufall;
      do
        zufall = (int) (Math.random()*48);     
      while ( this.a[zufall] );
      this.a[zufall] = true;
    }
  }
 
  public void eingeben()
  {
     int zahl;
     for (int i=0;i < 49; i++)
       this.a[i]=false;

     Scanner in = new Scanner(System.in);
     System.out.println("Geben Sie ihre 6 Zahlen ein:");
     for(int i=1; i<7; i++) {
       boolean bA = true;
       do
       {
         zahl=in.nextInt();
         if (zahl<1 || zahl>50) {
           System.out.println("Bitte geben Sie eine Zahl zwischen 1 und 49 ein!");
         }
         else
         {
           if (this.a[zahl-1] == true) {
                System.out.println("Zahl war bereits eingegeben !");
           }
           else {
                  bA = false;
           }
         }
       }
       while (bA); 
       this.a[zahl-1] = true;
    }
  }

  public void vergleichen(Lottozahlen lz)
  {
    int z = 0;
    System.out.println("Treffer");
    for (int i=0;i < 49; i++)
    {
     if ( this.a[i] && lz.a[i] ) {
       z ++;
       System.out.println( z + " : " + i+1 );
       }
    } 
    if (z=0) System.out.println( "keine" );
  }

  public void anzeigen(String strTitle)
  {
    System.out.println(strTitle);   
    for (int i=0;i < 49; i++)
    {
     if ( this.a[i] == true ){
       System.out.println( i+1 );
      }
    } 
  }
}
 
Uuups, da hab ich doch glatt schell noch 2 Fehler eingebaut:

Einmal fehlten Klammern, "+i+1" ersetzt durch "+(i+1)"
[JAVA=80] System.out.println( z + " : " + (i+1) );[/code]
und einmal ist der Vergleich kein Vergleich, "z = 0" ersetzt durch "z == 0"
[JAVA=83] if (z == 0) System.out.println( "keine" );[/code]
 
So würde ich es machen (10 Minute quickshot, kann man noch wesentlich schöner machen)

Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class LottoSpiel {

	List<Spieler> lottoSpieler = new ArrayList<Spieler>();
	Set<Integer> lottoZahlen;

	private Spieler spielerEingeben() {
		Spieler spieler = new Spieler();
		Scanner sc = new Scanner(System.in);
		String spielerName = "";
		System.out.println("Bitte Namen für Spieler eingeben:");
		spielerName = sc.next();
		spieler.setName(spielerName);
		System.out.println("Spieler " + spieler.getName()
				+ " bitte Tip eingeben:");
		Set<Integer> spielerTip = new TreeSet<Integer>();

		do {
			boolean illegalNumber = false;
			Integer zahl = 0;
			try {
				zahl = sc.nextInt();
			} catch (InputMismatchException e) {
				illegalNumber = true;
			}
			if (zahl <= 0 || zahl >= 50 || illegalNumber
					|| spielerTip.contains(zahl)) {
				System.err
						.println("Eingabe nicht gültig, bitte wiederholen! Bisher eingegeben: "
								+ Arrays.toString(spielerTip.toArray()));
				continue;
			}
			spielerTip.add(zahl);
		} while (spielerTip.size() < 6);
		spieler.setTip(spielerTip);
		System.out.println("Spieler " + spieler.getName() + " Tip ist "
				+ Arrays.toString(spielerTip.toArray()));

		return spieler;
	}

	private Set<Integer> zieheLottozalen() {
		Set<Integer> zahlen = new TreeSet<Integer>();
		Random rnd = new Random();

		while (zahlen.size() < 6) {
			zahlen.add(rnd.nextInt(48) + 1);
		}
		return zahlen;
	}

	private int auswerten(Spieler spieler) {
		int treffer = 0;
		for (Integer i : spieler.getTip()) {
			if (lottoZahlen.contains(i)) {
				i++;
			}
		}
		return treffer;
	}

	public void start() {
		System.out.println("Spielstart");
		String weitererSpieler = "J";
		Scanner sc = new Scanner(System.in);
		do {
			lottoSpieler.add(spielerEingeben());
			System.out.println("Weiteren Spieler hinzufügen? [J/N]");
			weitererSpieler = sc.next();
		} while (!weitererSpieler.equals("N"));

		System.out.println("Lottozahlen werden gezogen...");
		lottoZahlen = zieheLottozalen();
		System.out.println("Die Lottozahlen sind: "
				+ Arrays.toString(lottoZahlen.toArray()));
		System.out.println("---------------------------------");
		for (Spieler spieler : lottoSpieler) {
			int treffer = auswerten(spieler);
			System.out.println("Spieler " + spieler.getName()
					+ " hat getippt: "
					+ Arrays.toString(spieler.getTip().toArray()) + " und "
					+ treffer + " Treffer");
		}
	}

	public static void main(String[] args) {
		LottoSpiel spiel = new LottoSpiel();
		spiel.start();
	}

}

class Spieler {
	private String name;
	private Set<Integer> tip;

	public void setTip(Set<Integer> tip) {
		this.tip = tip;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public Set<Integer> getTip() {
		return tip;
	}
}
 
Hallo fassy,

ist ja alles schön und gut, aber ob das so hilfreich ist?
Da hatte ich schon Bedenken, mich mit meinem Beispiel zu weit von Nanny's Code zu entfernen.
Man muss, denke ich, Leute dort abholen, wo sie stehen.

Was mich aber noch mehr stört, ich spiele jetzt schon 2 Stunden Lotto und mein bestes Ergebnis war ein 3er.
Andererseits wärs wohl auch frustrierend einen 6er zu erreichen, aber keine Millionen einzufahren...🙂
 

Zurück
Oben