Fragen zu Zufallszahlen im array?



  • Hallo,
    ich bin gerade dabei Kakuro spiel zu schreiben und möchte gerne die Felder mit Zufallszahlen von 1 - 9 eintragen, also keine Doppelte Zufallszahlen in einem Block.

    Hier mal die Daten:

    Spielfeld[x][y].Feld = "M" //= Mauer
    Spielfeld[x][y].Feld = "S" //= Sume Feld
    Spielfeld[x][y].Feld = "N" //= Leeres Feld, in denen die Zufallszahlen hinein sollen
    

    Also, ab Feld N sollen Zufallszahlen eingetragen werden "Keine Doppelte", dabei sollen die Felder "S" und "M" beachtet werden.
    Nach diese Blöcke "S" und/oder "M" dürfen jedoch wieder die Zahl vorkommen, die davor im Block schon vorhanden ist.

    Ich möchte alle leere Felder "N" mit Zufallszahlen versehen, wenn jemand von euch das Spiel kennt, dann wisst ihr ja wie ich das meine, mit den Zufallszahlen und das verhindern der Doppelten.

    Ich bedanke mich schonmal für die Hilfe.



  • Ich hab das mal so versucht:

    int ZaehlerX=0;
      int ZaehlerY=0;
      int Doppelt=0;
      int Zahl=0;
      for (int y=0; y<8; y++)
      {
        for (int x=0; x<6; x++)
        {
          if (Spielfeld[x][y].Feld == "N")
          {
            Form1->Canvas->Draw(x*36-x,y*36-y,Image1->Picture->Bitmap);
            Zahl = random(9)+1;
            Spielfeld[x][y].Wert = Zahl;
    
            ZaehlerX = x;
            ZaehlerY = y;
            Doppelt = 0;
            while (ZaehlerX > 0)
            {
              ZaehlerX--;
    
              if ((Spielfeld[ZaehlerX][y].Feld == "M") || (Spielfeld[ZaehlerX][y].Feld == "S"))
              {
                break;
              }
              if (Spielfeld[ZaehlerX][y].Wert == Zahl)
              {
                Doppelt = 1;
                break;
              }
            }
            while (ZaehlerY > 0)
            {
              ZaehlerY--;
    
              if ((Spielfeld[x][ZaehlerY].Feld == "M") || (Spielfeld[x][ZaehlerY].Feld == "S"))
              {
                break;
              }
              if (Spielfeld[x][ZaehlerY].Wert == Zahl)
              {
                Doppelt = 1;
                break;
              }
            }
            if (Doppelt == 1)
            {
              Spielfeld[x][y].Wert = 0;
            }
          }
        }
      }
    

    Edit: Jetzt funktioniert es, ich habe vergessen die Variable Doppelt wieder hinterher auf 0 zu setzten.

    Noch eine Frage habe ich, wie kann ich, wenn dieser if Block

    if (Doppelt == 1)
    {
      Spielfeld[x][y].Wert = 0;
    }
    

    ausgeführt wird, das die x und y Schleife an dieser Stelle wiederholt wird, ich brauche das, um eine andere Zufallszahl in diesem Feld zu setzen und nochmal Prüfen auf gleiche Zahl.

    Vielen Dank schonmal.

    MfG



  • Hi,

    an deiner Stelle würd ich den Link rausnehmen.

    mfg
    Peter



  • Wieso?
    Das ist ja mein bearbeitetes Bild oder liegt das an der Seite wegen Werbung oder so?

    Naja, jedenfalls habe ich mein Problem jetzt so gelöst:

    int ZaehlerX=0;
    int ZaehlerY=0;
    int Doppelt=0;
    int Zahl=0;
    for (int y=0; y<12; y++)
    {
      for (int x=0; x<12; x++)
      {
        Doppelt = 0;
        do
        {
          if (Spielfeld[x][y].Feld == "N")
          {
            Form1->Canvas->Draw(x*36-x,y*36-y,Image1->Picture->Bitmap);
    
            if (Doppelt == 1)
            {
              Spielfeld[x][y].Wert = Zahl;
              Doppelt = 0;
            } else {
              Zahl = random(9)+1;
              Spielfeld[x][y].Wert = Zahl;
            }
    
            ZaehlerX = x;
            ZaehlerY = y;
    
            while (ZaehlerX > 0)
            {
              ZaehlerX--;
    
              if ((Spielfeld[ZaehlerX][y].Feld == "M") || (Spielfeld[ZaehlerX][y].Feld == "S"))
              {
                break;
              }
              if (Spielfeld[ZaehlerX][y].Wert == Zahl)
              {
                Doppelt = 1;
                break;
              }        
            }
            while (ZaehlerY > 0)
            {
              ZaehlerY--;
    
              if ((Spielfeld[x][ZaehlerY].Feld == "M") || (Spielfeld[x][ZaehlerY].Feld == "S"))
              {
                break;
              }
              if (Spielfeld[x][ZaehlerY].Wert == Zahl)
              {
                Doppelt = 1;
                break;
              }
            }
            if (Doppelt == 1)
            {
              Zahl = Zahl + 1;
              if (Zahl > 9) Zahl = 1;
              Spielfeld[x][y].Wert = 0;
            }
          }
        } while(Doppelt == 1);
      }
    }
    

    Ich habe eine do while schleife verwendet, der abbrecht, wenn Doppelt = 0 ist, und nun funktioniert es.

    Edit: Ich habe festgestellt, das sich manchmal die Schleife aufhängt und somit das ganze Programm anhält.
    Könnte vieleicht jemand kucken, ob ich alles richtig gemacht habe?

    MfG


Anmelden zum Antworten