Jump to content
Unity Insider Forum

If Absage Funktioniert nicht


Blubbi

Recommended Posts

Hallo zusammen,

ich benötige Hilfe mit meiner If abfrage.

Erst ein mal die Erklärung.

Geplant ist eine Wichtelapp.

der Aufbau besteht aus 6 Buttons je ein Butten für eine Person. z.b. Mama Papa Bruder Schwester...

Wenn man auf ein Butten klickt,

setzt er den Benutzer und sein Partner auf True. z.b. Butten eins = Papa und der Partner ist Mama.

danach fragt er eine Zufalls zahl ab von 1 bis 6 das sind die Personen. Nach der Prüfung prüft er ob man sich selber nicht zieht oder sein Partner und wiederholt sich. bis jemand gezogen wird der noch nicht gezogen wurde der Partner oder er selbst ist.

Das Programm funktioniert schon mal fast richtig. Aber Trotzdem kann man sein Partner ziehen.

Anbei einmal das Script vielleicht habt ihr da eine Idee oder ich habe ein Logik Fehler drin.

für Hilfe werde ich mich freuen.

Kurz noch

die Partner

Karl und Manu

Lena und Patrick

Nina und Sven

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class zuende : MonoBehaviour {

    public GameObject button1;
    public GameObject button2;
    public GameObject button3;
    public GameObject button4;
    public GameObject button5;
    public GameObject button6;
    public GameObject anzeige; //Anzeige Menü wenn man gezogen hat 
    public GameObject menu; //Menü für die Anzeiger der wer Zieht

    //Welche Person Wählt gerade aus
    public bool auswahl_karl = false;
    public bool auswahl_manu = false;
    public bool auswahl_lena = false;
    public bool auswahl_patrick = false;
    public bool auswahl_nina = false;
    public bool auswahl_sven = false;
    // Partner von der Person die Zieht
    public bool partner_karl = false;
    public bool partner_manu = false;
    public bool partner_lena = false;
    public bool partner_patrick = false;
    public bool partner_nina = false;
    public bool partner_sven = false;
    // Welche person wurde gezogen
    public bool gezogen_karl = false;
    public bool gezogen_manu = false;
    public bool gezogen_lena = false;
    public bool gezogen_patrick = false;
    public bool gezogen_nina = false;
    public bool gezogen_sven = false;

    public string gezogen = "leer"; //Text anzeige für die Person die gerade gezogen wurde.

    public Text gezogentext;

    public int randomZahl = 0; //Für die Zufallszahl

    // Auswahl wer Zieht
    public void Karl ()
    {
        Debug.Log ("Karl");
        auswahl_karl = true;
        auswahl_manu = false;
        auswahl_lena = false;
        auswahl_patrick = false;
        auswahl_nina = false;
        auswahl_sven = false;

        partner_karl = false;
        partner_manu = true;
        partner_lena = false;
        partner_patrick = false;
        partner_nina = false;
        partner_sven = false;

        button1.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
    public void Manu ()
    {
        Debug.Log ("Manuela");
        auswahl_karl = false;
        auswahl_manu = true;
        auswahl_lena = false;
        auswahl_patrick = false;
        auswahl_nina = false;
        auswahl_sven = false;

        partner_karl = true;
        partner_manu = false;
        partner_lena = false;
        partner_patrick = false;
        partner_nina = false;
        partner_sven = false;

        button2.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
    public void Lena ()
    {
        Debug.Log ("Lena");
        auswahl_karl = false;
        auswahl_manu = false;
        auswahl_lena = true;
        auswahl_patrick = false;
        auswahl_nina = false;
        auswahl_sven = false;

        partner_karl = false;
        partner_manu = false;
        partner_lena = false;
        partner_patrick = true;
        partner_nina = false;
        partner_sven = false;

        button3.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
    public void Patrick ()
    {
        Debug.Log ("Patrick");
        auswahl_karl = false;
        auswahl_manu = false;
        auswahl_lena = false;
        auswahl_patrick = true;
        auswahl_nina = false;
        auswahl_sven = false;

        partner_karl = false;
        partner_manu = false;
        partner_lena = true;
        partner_patrick = false;
        partner_nina = false;
        partner_sven = false;

        button4.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
    public void Nina ()
    {
        Debug.Log ("Nina");
        auswahl_karl = false;
        auswahl_manu = false;
        auswahl_lena = false;
        auswahl_patrick = false;
        auswahl_nina = true;
        auswahl_sven = false;

        partner_karl = false;
        partner_manu = false;
        partner_lena = false;
        partner_patrick = false;
        partner_nina = false;
        partner_sven = true;

        button5.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
    public void Sven ()
    {
        Debug.Log ("Sven");
        auswahl_karl = false;
        auswahl_manu = false;
        auswahl_lena = false;
        auswahl_patrick = false;
        auswahl_nina = false;
        auswahl_sven = true;

        partner_karl = false;
        partner_manu = false;
        partner_lena = false;
        partner_patrick = false;
        partner_nina = true;
        partner_sven = false;

        button6.SetActive (false); //deaktiviert den Button das er nicht noch einmal zieht

        Ziehen ();
    }
     //Zurück zu der Butten auswahl wer ziehen soll
    public void Auswahl ()
    {
        randomZahl = 0;
        menu.SetActive (true);
        anzeige.SetActive (false);
        Debug.Log ("Zur Auswahl");
    }
    //das Ziehungs auswahlverfahren.
    public void Ziehen ()
    {
        menu.SetActive (false);

        randomZahl = Random.Range (1, 6);
        Debug.Log (randomZahl);

        if (randomZahl == 1) //Karl
        {
            if (auswahl_karl == true)
            {
                Ziehen ();
            }
            else
            {
                if (partner_manu == true)
                {
                    Ziehen ();
                }
                else
                {
                    if (gezogen_karl == true)
                    {
                        Ziehen ();
                    }
                    else
                    {
                        gezogen = "Karl-Heinz";
                        gezogentext.text = gezogen;
                        gezogen_karl = true;
                        auswahl_karl = false;
                        auswahl_manu = false;
                        auswahl_lena = false;
                        auswahl_patrick = false;
                        auswahl_nina = false;
                        auswahl_sven = false;
                        partner_karl = false;
                        partner_manu = false;
                        partner_lena = false;
                        partner_patrick = false;
                        partner_nina = false;
                        partner_sven = false;
                        anzeige.SetActive(true);
                    }
                } 
                    

                
            }
        }
        else
        {
            if (randomZahl == 2) //Manu
            {
                if (auswahl_manu == true) {
                    Ziehen ();
                } else {
                    if (partner_karl == true) {
                        Ziehen ();
                    } else {
                        if (gezogen_manu == true) {
                            Ziehen ();
                        } else {
                            gezogen = "Manuela";
                            gezogentext.text = gezogen;
                            gezogen_manu = true;
                            auswahl_karl = false;
                            auswahl_manu = false;
                            auswahl_lena = false;
                            auswahl_patrick = false;
                            auswahl_nina = false;
                            auswahl_sven = false;
                            partner_karl = false;
                            partner_manu = false;
                            partner_lena = false;
                            partner_patrick = false;
                            partner_nina = false;
                            partner_sven = false;
                            anzeige.SetActive (true);
                        }
                    }



                }
            }
            else
            {
                if (randomZahl == 3) //Lena
            {
                    if (auswahl_lena == true) {
                        Ziehen ();
                    } else {
                        if (partner_patrick == true) {
                            Ziehen ();
                        } else {
                            if (gezogen_lena == true) {
                                Ziehen ();
                            } else {
                                gezogen = "Lena";
                                gezogentext.text = gezogen;
                                gezogen_lena = true;
                                auswahl_karl = false;
                                auswahl_manu = false;
                                auswahl_lena = false;
                                auswahl_patrick = false;
                                auswahl_nina = false;
                                auswahl_sven = false;
                                partner_karl = false;
                                partner_manu = false;
                                partner_lena = false;
                                partner_patrick = false;
                                partner_nina = false;
                                partner_sven = false;
                                anzeige.SetActive (true);
                            }
                        }



                    }
                }
                else
                {
                    if (randomZahl == 4) //Patrick
                    {
                        if (auswahl_patrick == true) {
                            Ziehen ();
                        } else {
                            if (partner_lena == true) {
                                Ziehen ();
                            } else {
                                if (gezogen_patrick == true) {
                                    Ziehen ();
                                } else {
                                    gezogen = "Patrick";
                                    gezogentext.text = gezogen;
                                    gezogen_patrick = true;
                                    auswahl_karl = false;
                                    auswahl_manu = false;
                                    auswahl_lena = false;
                                    auswahl_patrick = false;
                                    auswahl_nina = false;
                                    auswahl_sven = false;
                                    partner_karl = false;
                                    partner_manu = false;
                                    partner_lena = false;
                                    partner_patrick = false;
                                    partner_nina = false;
                                    partner_sven = false;
                                    anzeige.SetActive (true);
                                }
                            }



                        }
                    }
                    else
                    {
                        if (randomZahl == 5) //Nina
                        {
                            if (auswahl_nina == true) {
                                Ziehen ();
                            } else {
                                if (partner_sven == true) {
                                    Ziehen ();
                                } else {
                                    if (gezogen_nina == true) {
                                        Ziehen ();
                                    } else {
                                        gezogen = "Nina";
                                        gezogentext.text = gezogen;
                                        gezogen_nina = true;
                                        auswahl_karl = false;
                                        auswahl_manu = false;
                                        auswahl_lena = false;
                                        auswahl_patrick = false;
                                        auswahl_nina = false;
                                        auswahl_sven = false;
                                        partner_karl = false;
                                        partner_manu = false;
                                        partner_lena = false;
                                        partner_patrick = false;
                                        partner_nina = false;
                                        partner_sven = false;
                                        anzeige.SetActive (true);
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (randomZahl == 6) //Sven
                            {
                                if (auswahl_sven == true) {
                                    Ziehen ();
                                } else {
                                    if (partner_nina == true) {
                                        Ziehen ();
                                    } else {
                                        if (gezogen_sven == true) {
                                            Ziehen ();
                                        } else {
                                            gezogen = "Sven";
                                            gezogentext.text = gezogen;
                                            gezogen_sven = true;
                                            auswahl_karl = false;
                                            auswahl_manu = false;
                                            auswahl_lena = false;
                                            auswahl_patrick = false;
                                            auswahl_nina = false;
                                            auswahl_sven = false;
                                            partner_karl = false;
                                            partner_manu = false;
                                            partner_lena = false;
                                            partner_patrick = false;
                                            partner_nina = false;
                                            partner_sven = false;
                                            anzeige.SetActive (true);
                                        }
                                    }



                                }
                            }
                        }
                    }
                }
            }
        }
        
    }
}

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nimm's mir nicht übel, aber lass uns von vorne anfangen. Was du da hast, ist ein ziemliches Monster :)

Beim Programmieren hast du verschiedenste Datentypen und -Strukturen zur Verfügung. Booleans sind nur eine davon. Und wenn du mit Personen arbeiten willst, dann ist es sinnvoll, auch Dinge zu haben, die Personen repräsentieren. Dafür kannst du z.B. eine Klasse deklarieren:

class Wichtel
{
  public string name;
  
  public Wichtel(string name)
  {
    this.name = name;
  }
}

Das, und alles folgende, kommt in eine ansonsten leere Klasse. Von mir aus eine Komponente. Jetzt kannst du mit "new" neue Wichtel erstellen:

var sven = new Wichtel("Sven");

Den Namen eines Wichtels findest du mit dem "name"-Eigenschaft heraus, die in der Wichtel-Klasse definiert ist:

Debug.Log(sven.name); // Sven

Du kannst auch ein Array mit mehreren Wichteln darin erstellen. Ein Array ist grundsätzlich ein Objekt, das mehrere gleichartige Werte (z.B. Referenzen auf Wichtel-Objekte) speichern kann.

var alleWichtel = new Wichtel[6]
{
  new Wichtel("Sven"),
  new Wichtel("Karl"),
  new Wichtel("Manu"),
  new Wichtel("Lena"),
  new Wichtel("Patrick"),
  new Wichtel("Nina")
};

Jetzt kannst du mit einem Index auf die verschiedenen Wichtel zugreifen:

var manu = alleWichtel[2]; // 2 weil wir bei 0 anfangen zu zählen

Und diese Zahl kann wiederum anstatt einer Konstante der Wert einer int-Variable sein:

var index = 2;
var manu = alleWichtel[index];

Und der Wert dieser Variablen kann wiederum in einer Schleife hochgezählt werden:

for (var i = 0; i < alleWichtel.Length; i++)
{
  Debug.Log("Wichtel Nummer " + i + " heißt " + alleWichtel[i].name);
}

An dieser Stelle können wir das schon einmal testen, hier ist der Code: https://pastebin.com/daxabxa9

Jetzt geht es ans Ziehen. Da gibt es mehrere Wege. Wenn du tatsächlich "Ziehen" willst, dann sollte dein Programm aber nicht unter zufälligen Bedingungen aufhängen können. Die Chance, dass du 1000-Mal hintereinander neu ziehen musst, weil jemand immer sich selber zieht, ist halt nicht gleich null, und das finde ich immer nicht so gut :)

Zuerst einmal können wir die Wichtel-Klasse erweitern, und zwar um eine Referenz auf den zu beschenkenden.

class Wichtel
{
  public string name;
  public Wichtel beschenkter;
  
  public Wichtel(string name)
  {
    this.name = name;
  }
}

Jetzt kann man folgendes tun:

var manu = new Wichtel("Manu");
var patrick = new Wichtel("Patrick");

manu.beschenkter = patrick;

Debug.Log(manu.name + " beschenkt " + manu.beschenkter.name); // Manu beschenkt Patrick

Ich beschreibe jetzt einmal, wie man ziehen kann, aber danach kommt noch eine viel einfachere Lösung :)

Um jetzt zufällig Beschenkte zuzuweisen, ist es sinnvoll, alle Wichtel, die bisher noch kein Geschenk kriegen in einer Liste zu haben. Eine Liste ist wie ein Array, aber man kann Dinge rein und rausnehmen - und die Liste ändert entsprechend ihre Länge (bei einem Array würden einfach Felder "leer" werden). Zuerst einmal musst du etwas importieren, damit du Listen benutzen kannst. Dafür schreibst du einfach ganz oben hin:

using System.Collections.Generic;

wenn das da nicht schon steht.

Dann kannst du dir in deiner Methode, die da durchläuft, eine Wichtel-Liste erstellen:

var wichtelOhneGeschenk = new List<Wichtel>(alleWichtel);

In den Klammern wird das Array mit allen Wichteln übergeben, sodass direkt am Anfang alle Wichtel in der Liste stehen. Dann kannst du anfangen, zu ziehen. Wir gehen wieder alle Wichtel durch:

for (var i = 0; i < alleWichtel.Length; i++)
{
  var wichtel = alleWichtel[i];
  
  var beschenkter = // ???
    
  wichtel.beschenkter = beschenkter;
}

Wir müssen jetzt nur noch den Beschenkten finden, um ihn dem Wichtel zuzuweisen.

Dabei gelten zwei Regeln:

  1. Der Wichtel ist in der Liste (hat also noch kein Geschenk)
  2. Der Wichtel darf nicht der Wichtel sein, dem wir gerade einen Beschenkten zuweisen wollen.

Da es wie gesagt nicht so doll ist, wenn man zufällig oft neu zieht, ist es besser, eine Zahl zu würfeln die eins kleiner ist als die Menge der noch verfügbaren Wichtel:

var beschenkterIndex = Random.Range(0, wichtelOhneGeschenk.Count - 1);

Bei Listen heißt es "Count" statt "Length" für die Anzahl der Elemente.

Jetzt musst du dir vorstellen, dass du 6 Wichtel hast, irgendwo dadrin ist der, den du nicht ziehen willst, und der Würfelwurf ist maximal einen kleiner als es Wichtel gibt, sodass der Wichtel mit dem höchsten Index nicht mehr gezogen werden kann.

Wichtel:  0 1 2 3 4 5
Würfel:   0 1 2 3 4

Sagen wir, dass Nummer 2 derjenige ist, den wir nicht ziehen wollen, dann müssten wir an Stelle Nummer zwei alle Würfelergebnisse einen nach rechts schieben:

Wichtel:  0 1 2 3 4 5
Würfel:   0 1   2 3 4

Wenn wir also eine 2 Würfeln, dann ziehen wir Nummer 3. Jetzt sind alle Wichtel - bis auf 2 - abgedeckt.

Dieses Aufrücken sieht im Code so aus:

if (beschenkterIndex >= wichtelOhneGeschenk.IndexOf(wichtel))
{
  beschenkterIndex++;
}

Mit IndexOf kriegen wir den Index von unserem Wichtel in der Ohne-Geschenk-Liste heraus. Wir stecken also unseren Wichtel hinein und kriegen, in unserem Beispiel, 2 heraus. Und wenn der Würfelwurf 2 oder höher ergeben hat (>=), dann erhöhen wir um 1. Aus 2 wird also 3, aus 3 wird 4, usw.

Jetzt haben wir den Index der zu beschenkenden gefunden. Wir müssen jetzt nur noch anhand des Index wieder den Wichtel aus der Liste ziehen:

var beschenkter = wichtelOhneGeschenk[beschenkterIndex];

Dann müssen wir diesen Wichtel aus der Liste ziehen, denn ab jetzt ist sein Geschenk ja gesichert:

wichtelOhneGeschenk.RemoveAt(beschenkterIndex);

Und am Ende weiden wir den Beschenkten unserem Wichtel zu, wie oben beschrieben:

wichtel.beschenkter = beschenkter;

Jetzt fehlt leider noch, dass der Würfelwurf nicht mehr funktioniert, wenn nur noch einer auf der Liste steht. Wegen des Aufrückens und so. Also kommt der ganze Kram in eine if-Abfrage:

if (wichtelOhneGeschenk.Count >= 2) // Nur, wenn wir zwei oder mehr Wichtel ohne Geschenk auf der Liste übrig haben
{
  // Würfeln und so
}
else
{
  wichtel.beschenkter = wichtelOhneGeschenk[0];
}

Damit sieht der Code so aus: https://pastebin.com/uzAfteLU

Jetzt haben wir aber noch den hässlichen Sonderfall, dass am Ende ein einzelner Wichtel übrig bleibt, der sich selbst ziehen muss. Und damit wird diese Lösung wirklich anstrengend.

Deshalb einfach mal eine ganz andere Idee: Warum nicht einfach alle Wichtel in eine Liste schreiben und die Reihenfolge der Liste durchmischen? Jeder Wichtel beschenkt dann seinen Nachfolger.

Weil Arrays mischen ein bisschen nervig sein kann, packe einfach alle Wichtel wieder in eine Liste und ziehe solange zufällig aus der Liste, bis sie leer ist:

var wichtelSack = new List<Wichtel>(alleWichtel);

for (var i = 0; i < alleWichtel.Length; i++)
{
  var sackIndex = Random.Range(0, wichtelSack.Count);
  alleWichtel[i] = wichtelSack[sackIndex];
  wichtelSack.RemoveAt(sackIndex);
}

Die gezogenen Wichtel wird einfach der Reihe nach in das "alleWichtel"-Array zurückgeschrieben, in der Reihenfolge, in der sie gezogen werden.

Zum Ausgeben gibst du einfach alle Wichtel mit ihrem jeweiligen Nachbarn aus:

for (var i = 0; i < alleWichtel.Length; i++)
{
  Debug.Log(alleWichtel[i].name + " beschenkt " + alleWichtel[(i + 1) % alleWichtel.Length].name);
}

Wichtig ist hier der Index des Nachbarwichtels:

(i + 1) % alleWichtel.Length

"i + 1" bedeutet, dass wir hier den Wichtel mit dem nächsthöheren Index ausgeben ("i beschenkt i + 1"), aber wenn wir beim letzten Wichtel angekommen sind, dann muss der ja wieder den ersten beschenken. Mit Modulo (%) wiederholt man eine Zahlenfolge einer bestimmten Länge. Ist wie Geteilt rechnen mit Rest in der Grundschule. 5 / 3 ist 1 Rest 2. Dieser Rest 2 ist das Ergebnis von 5 % 3.

Damit sieht der gesamte Code so aus: https://pastebin.com/YjRb2Ffn

Diese Variante ist nochmal wesentlich kürzer, kann nicht schief gehen, und hat als Nebeneffekt nur einen großen Kreis von Wichteln, anstatt kleinere Kreise zu bilden. Letzteres ist natürlich Geschmackssache.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...