Random Button mit Random Zahlen belegen

  • Antworten:12
Jan S
  • Forum-Beiträge: 18

14.10.2015, 22:14:48 via Website

Hallo Leute,

ich habe da folgendes Problem.

Erstens:Ich habe eine vorgegebende integer variable und möchte dazu 3 zufällige integer variablen erzeugen die sich alle nicht gleichen dürfen.

Zweitens:Diese 4 Zahlen soll zufällig auf vier Buttons verteilt werden.

Teil 1 habe ich ganz simple dreimal mit do while gelöst.
Wie ich den zweiten Teil lösen weiß ich aber absolut nicht.Wie kann ich zufällig einen Button auswählen??

Ich dachte vielleicht wenn ich die Button , Button1,Button2,Button3,Button4 nenne, könnte ich sie irgendwie so Aufrufen

Button+"variable1".setText("variable1");

Aber so einfach ist es leider nicht.Könntet ihr mir vielleicht sagen wie die Button zufällig auswähle??

— geändert am 14.10.2015, 22:15:17

Antworten
Sven R.
  • Forum-Beiträge: 1.904

14.10.2015, 22:26:24 via App

Alle Buttons in ein Array(oder List) und dann zufällig einen Index auswählen.

buttonArray[zufaelligerIndex]

— geändert am 14.10.2015, 22:27:05

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Jan S
  • Forum-Beiträge: 18

14.10.2015, 23:15:12 via Website

und was genau soll in dem array stehen?

wenn ich die variable dann aufrufe kann ich ja nicht einfach nen .setText anhängen und das wird erkannt oder?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2015, 00:34:54 via App

Ja wird erkant du brauchst eine Liste oder ein array vom typ Button.
Kannst du per Button[] btnArr... definieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

15.10.2015, 15:01:29 via Website

Cool danke hat geklappt .Glaube ich zumindestens.Das Problem ist ,wenn das Programm in die do while Schleife geht .Wird das Bild einfach schwarz und es passiert nichts.Aber das ist doch keine Endlosschleife oder?Woran kann es noch liegen?

    int btnnum1=0;
    int btnnum2=0;
    int btnnum3=0;
    int btnnum4=0;

    Random randbtn=new Random();


    do {

        btnnum1=randbtn.nextInt(3)+1;

    }while (btnnum1==btnnum2 || btnnum1==btnnum3 || btnnum1==btnnum4);

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2015, 15:06:06 via Website

Ja du hast eine nie Endende schleife...
Da kann das nicht gehen

Zudem warum bracuhst du da überhaupt eine?
Mach einfach den Random Befehl 4 mal hinternander.

LG Pascal //It's not a bug, it's a feature. :) ;)

Jan S

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

15.10.2015, 15:13:10 via Website

Warum so kompliziert?

        final List<Button> buttons = new ArrayList<>(Arrays.asList(button1, button2, button3, button4));
        Collections.shuffle(buttons);

Dann sind die Buttons in zufälliger Reihenfolge in der Liste.

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

15.10.2015, 22:04:28 via Website

Erstmal vielen dank für die Antworten.
@Pascal:Wieso habe ich eine Endlosschleife?Ich dachte wenn alle false sind springt der raus,oder nicht?Und ich sag doch wenn die Zahl nicht mit zwei übereinstimmt oder mit drei oder mit vier dann spring raus.Sonst mach ne neue zufallszahl?Verstehe ich da irgendwas falsch? Zu dem anderen Punkt.WEnn ich vier mal den Random Befehl habe ,kann es ja passieren das zweimal die selbe Zahl kommt und das soll nicht passieren.

@Zielke: Kann ich damit einfach nen Array "durchschütteln" und dann einfach mit nem
button[1].setText("");

aufrufen.Und jedesmal würde ein anderer Button ausgewählt werden????

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2015, 22:50:49 via App

Ganz einfach endlosschleife daher dass du immer nur eine variable Random setzt die anderen bekiben immer 0.
Und Zielkes Lösung geht in deine Richtung statt den index in eckigen Klammern benutzt du halt List#get(int) aber sonst passt das.

— geändert am 15.10.2015, 22:51:01

LG Pascal //It's not a bug, it's a feature. :) ;)

Jan S

Antworten
Jan S
  • Forum-Beiträge: 18

15.10.2015, 22:57:57 via Website

mhh sorry ich verstehs nicht.Ich vergleiche doch immer nur die eine Randomzahl(btnnum1) mit den drei anderen.Und wenn Sie mit einer der anderen Zahlen gleich ist,dann bekommt btnnum1 einen neuen Wert,sonst gehts weiter.

Wie muss ich das denn deiner Meinung nach in meinem Beispiel anpassen damit das so funktioniert??

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.10.2015, 23:34:04 via App

btnnum1=randbtn.nextInt(3)+1;

Den anderen integer variablen auch einen random Wert zuweisen und dann wird die schleife fast überflüssig

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jan S
  • Forum-Beiträge: 18

16.10.2015, 12:18:04 via Website

ja aber trotzdem kann es doch zu doppelungen kommen und das möchte ich halt abfangen.Ich habe das insgesamt so gemacht:

    btnnum1=randbtn.nextInt(3)+1;
    btnnum2=randbtn.nextInt(3)+1;
    btnnum3=randbtn.nextInt(3)+1;
    btnnum4=randbtn.nextInt(3)+1;
    zahl1=randomzahl.nextInt(6)+1;
    zahl2=randomzahl.nextInt(6)+1;
    zahl3=randomzahl.nextInt(6)+1;
    zahl4=randomzahl.nextInt(6)+1;

    Button[] button=new Button[3];

    button[btnnum1]=(Button) findViewById(R.id.firstbutton);
    button[btnnum2]=(Button) findViewById(R.id.secondbutton);
    button[btnnum3]=(Button) findViewById(R.id.thirdbutton);
    button[btnnum4]=(Button) findViewById(R.id.fourthbutton);



    germantxtview.setText(arraylist.get(randvoc).toString());
    button[btnnum1].setText(arraylist.get(zahl1).toString());
    button[btnnum2].setText(arraylist.get(zahl2).toString());
    button[btnnum3].setText(arraylist.get(zahl3).toString());
    button[btnnum4].setText(arraylist.get(zahl4).toString());

Allerdings stürzt das ab. Kann man mir jemand sagen was ich falsch gemacht habe?

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

16.10.2015, 13:47:49 via Website

Meine Lösung ging eigentlich in eine andere Richtung, war aber wohl zu knapp. Also hier ausführlicher (und die Zusatzinfo ausnutzend, dass es sich um Zahlen im Intervall [1..6] handelt):

    // aus den vorher per findViewById ermittelten Buttons button1 .. 4 eine Liste machen
    final List<Button> buttons = new ArrayList<>(Arrays.asList(button1, button2, button3, button4));
    // die wird dann - wie ein Kartenspiel - gemischt. Dafür gibt es eine eigene Methode.
    Collections.shuffle(buttons);

    // Da offensichtlich paarweise ungleiche Zufallszahlen von 1 bis 6 verwendet werden sollen, 
    // bietet sich auch hier der "Kartenspielansatz" an.
    final List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
    Collections.shuffle(numbers);

    // Nun haben wir also die Buttons und die Zahlen gemischt - jetzt ziehen wir jeweils die 
    // ersten vier Elemente.
    int idx = 0;
    for (final Button button : buttons) {
        button.setText(numbers.get(idx).toString());
        idx++;
    }

Und nein, shuffle funktioniert nicht mit Arrays.

Bitte erst API Doc lesen, dann fragen und dann bitte mit allen Infos, z.B. Stacktraces. Die Ansage "Allerdings stürzt das ab." verhindert, dass Dir geholfen wird. (Außer, jemand baut Deinen Code komplett nach, um Dir zu helfen....)

— geändert am 16.10.2015, 13:50:54

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Jan S

Antworten