C: Lottospiel 6 aus 49 - keine doppelte Ziehung?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Tubalkain
Beiträge: 1
Registriert: Sa Feb 13, 2016 10:10 am

C: Lottospiel 6 aus 49 - keine doppelte Ziehung?

Beitrag von Tubalkain » Sa Feb 13, 2016 10:18 am

Hallo zusammen,

ich bin ganz neu dabei und betreibe C als Hobby. Es brennt also nicht :)

Als kleinen "Meilenstein" hatte ich mir vorgenommen ein Lotto-Spiel zu schreiben. Es soll folgende Funktionen haben:

1. Benutzer gibt 6 Tipps zwischen 1-49 ab. OK
2. Programm prüft ob Tipp valide ist (= Zahl zwischen 1-49). OK
3. Programm generiert 6 zufällige Lottozahlen. (PROBLEM, s.u.).
4. Programm zeigt an, wie viele richtige Tipps dabei sind. OK
5. Programm fragt ob noch mal gespielt werden soll. OK

Soweit ist es fertig und funktioniert auch wie gewünscht. ABER es hat noch einen großen Fehler - die zufällig generierten Lottozahlen können doppelt auftauchen. Das soll natürlich nicht passieren... habt ihr einen Tipp für mich?

Ich bin mir sicher das man das ganze "Spiel" deutlich schlanker programmieren kann, soweit bin ich aber noch nicht :)

Viele Grüße
Matthias

Code: Alles auswählen

// Spiel 6 aus 49,  Version 0.6
// (c)2016 Tubalkain
//
// Offene Punkte:
// 1. Fehlermeldung bei Fehleingabe. ERLEDIGT mit do/while Funktion
// 2. Keine Doppelte Ziehung.
// 3. Superzahl-System

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>


int main()


{
    char c;
    do
    {
        // Es werden die Zahlen getippt und gespeichert //

        int z1, z2, z3, z4, z5, z6;  // Das sind die Tipps.

        printf("\n\t LOTTO 6 aus 49\n");
        printf("\nBitte geben Sie Ihre 6 Tipps ab.");
        printf("\nDanach werden die Lottozahlen gezogen,");
        printf("\nund geprüft wie viele richtige Tipps");
        printf("\nSie abgegeben haben. Viel Glueck!\n");
            do
            {
                printf("\nBitte geben Sie Ihren 1. Tipp: ");
                scanf("%d", &z1);
            }while(z1<0 || z1>49);


            do
            {
                printf("\nBitte geben Sie Ihren 2. Tipp: ");
                scanf("%d", &z2);
            }while(z2<0 || z2>49);

            do
            {
                printf("\nBitte geben Sie Ihren 3. Tipp: ");
                scanf("%d", &z3);
            }while(z3<0 || z3>49);

            do
            {
                printf("\nBitte geben Sie Ihren 4. Tipp: ");
                scanf("%d", &z4);
            }while(z4<0 || z4>49);

            do
            {
                printf("\nBitte geben Sie Ihren 5. Tipp: ");
                scanf("%d", &z5);
            }while(z5<0 || z5>49);

            do
            {
                printf("\nBitte geben Sie Ihren 6. Tipp: ");
                scanf("%d", &z6);
            }while(z6<0 || z6>49);


    // Es beginnt die Ziehung der Lottozahlen //

    printf("\nDie Zahlen werden gezogen.....\n");
    Sleep(1000);                                        // Sleep für den dramaturgischen Effekt

    srand ( time(NULL) );
    int l1 = rand() %49+1;                              // Jetzt kommen die einzelnen Zahlen. Aber wie verhindern das doppelt?
    int l2 = rand() %49+1;
    int l3 = rand() %49+1;
    int l4 = rand() %49+1;
    int l5 = rand() %49+1;
    int l6 = rand() %49+1;


    //Laden und zeigen der Lottozahlen//

    printf("\nDie Lottozahlen lauten: \n");
    Sleep(1000);
    printf("\n\t%d\n", l1);
    Sleep(1000);
    printf("\n\t%d\n", l2);
    Sleep(1000);
    printf("\n\t%d\n", l3);
    Sleep(1000);
    printf("\n\t%d\n", l4);
    Sleep(1000);
    printf("\n\t%d\n", l5);
    Sleep(1000);
    printf("\n\t%d\n", l6);
    Sleep(1000);


    //Nach den Richtigen Treffern suchen//

    int richtige = 0;

    if(z1 == l1 || z1 == l2 || z1 == l3 || z1 == l4 || z1 == l5 || z1 == l6)
    {
        richtige = richtige +1;
    }

    if(z2 == l1 || z2 == l2 || z2 == l3 || z2 == l4 || z2 == l5 || z2 == l6)
    {
        richtige = richtige +1;
    }

    if(z3 == l1 || z3 == l2 || z3 == l3 || z3 == l4 || z3 == l5 || z3 == l6)
    {
        richtige = richtige +1;
    }

    if(z4 == l1 || z4 == l2 || z4 == l3 || z4 == l4 || z4 == l5 || z4 == l6)
    {
        richtige = richtige + 1;
    }

    if(z5 == l1 || z5 == l2 || z5 == l3 || z5 == l4 || z5 == l5 || z5 == l6)
    {
        richtige = richtige + 1;
    }

    if(z6 == l1 || z6 == l2 || z6 == l3 || z6 == l4 || z6 == l5 || z6 == l6)
    {
        richtige = richtige + 1;
    }

    if(richtige > 0)
    {
          printf("\nHERZLICHEN GLUECKWUNSCH! Sie haben %d richtige!!\n", richtige);
    }
    else
    {
        printf("\nSchade... keine richtigen Treffer.\n");
    }

     printf("\n\nWollen Sie Ihr Glueck noch mal versuchen? (J/N)? ");
     scanf("%c", &c);
     c = getchar();
     printf("\n");
    }
    while(c == 'J' || c == 'j');

    return 0;
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3112
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Lottospiel 6 aus 49 - keine doppelte Ziehung?

Beitrag von cloidnerux » Sa Feb 13, 2016 12:36 pm

Hi und Willkommen im Forum :D
Schau dir mal Arrays an, das macht das leben einfacher.

An sich hast du zwei Optionen:
Du schaust bei dem Generierend er Zahlen ob die in der vorherigen Ziehung schon mal aufgetaucht ist, sollte das der Fall sein, ziehst du nochmal. Dieser Algorithmus ist zwar kompakt, hat aber den Nachteil, dass er theoretisch unendlich laufen könnte, da ein Zufallsgenerator ja auch immer die selbe Zahl ausspucken könnte.

Eine andere Alternative wäre zu sagen, dass du einen "Beutel"/Array mit den möglichen Nummern hast, und aus diesem die Zahlen ziehst. Dies bedeutet, dass du nach jedem mal ziehen die Zahl aus dem Array entfernst, womit auch keine Doppelziehungen mehr möglich sind. Dieser Algorithmus wird immer mit der selben Zeit terminieren, ist aber etwas umständlicher, weil man eine sortierte Liste benötigt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8665
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Lottospiel 6 aus 49 - keine doppelte Ziehung?

Beitrag von Xin » Sa Feb 13, 2016 2:25 pm

Das mit den Arrays ansehen empfehle ich Dir ebenso.

Ich würde Dir auch raten beide Optionen zu implementieren. Die sortierte Liste im zweiten Fall kannst Du ja vorgeben mit einem Array:

Code: Alles auswählen

int kugeln[] = { 1, 2, 3, 4, 5.... 47, 48, 49, 0 };
Warum die 0 am Ende? Es gibt keine Kugel 0. Wenn 0, dann Schluss. Wenn Du jetzt die 3 ziehst, guckst Du, ob welche Zahl an Position 3 steht: die 4 (Arrays zählen ab 0). Du schreibst die vier in die gezogenen Zahlen und setzt die Position 3 auf -1. Nun ziehst du 48. Du nimmst die Zahl 49 als gezogene zahl und setzt die Position 48 auf -1. Dein Zufallsgenerator gibt die für die 3. Zahl wieder die Position 3 vor. Auf der Position 3 steht aber die -1. Ist die Zahl negativ gehst Du einfach eine Zahl weiter und guchst da. Position 4 hat den Wert 5, also nimmst Du dir die fünf und stetzt Position 4 auf -1. Nächster Zug. Du bekommst wieder die Position 48. An Position 48 hast Du die -1, also weiter. An Position 49 steht die 0, das Array endet hier also. Also korigierst Du die Position auf 0. An Position 0 steht die 1. Die nächste gezogene Zahl ist also die 1.

Solange Du weniger als 49 Züge machst, läuft das. Machst du mehr als 49 züge, sind alle Kugeln gezogen worden und er sucht sich zu Tode, weil er keine ziehbare Kugel mehr findet. ;)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten