Programmiere Einarmigen Banditen

Silvin05

Mitglied
Hallo Java Fricks

Ich bin Neuling hier und auch Neuling in Java Programmierung!

Ich habe eine Aufgabe einen Einarmiges Bandit zu Programmieren. Das Programme soll ein GUI werden also mit JFrame. Der GUI teile und die Zufall Zahlen in Drei Labels habe ich hinbekommen.

Das Logisches Teile soll folgendes Programmiert werden:

„Der Spieler hat 100 EUR Startguthaben. Jedes Spiel kostet 10 EUR. Bei zwei identischen Würfeln erhält er 20 EUR Gewinn, bei drei identischen Würfeln 100 EUR. Das Spiel soll beendet werden, wenn der Spieler alles verspielt hat“.

Ich habe Ehrlicherweise Probleme mit dem Logische Teilen beziehungsweise ich weiß nicht wie ich die Methoden Programmieren kann damit die geforderte Aufgabe für das Spiel erfühlt ist.

Kann mir hier einer erfahrener par Typs gegeben beziehungsweise Beispiel Methode postet.

Dank im Voraus für euer Unterstützung!
 

ing0-bing0

Aktives Mitglied
Probleme mit dem Logische Teilen beziehungsweise ich weiß nicht wie ich die Methoden Programmieren kann damit die geforderte Aufgabe für das Spiel erfühlt ist.

Kann mir hier einer erfahrener par Typs gegeben beziehungsweise Beispiel Methode postet
Na ja, die Logik, ganz unabhängig von der Oberfläche, könnte ja in etwa so sein:

Java:
import java.util.Arrays;
import java.util.Random;

public class BLogik {
    private int guthaben = 100;
    private int spielnummer = 0;
    private final int[] würfel = new int[3];
    private final int höchstzahl = 10;

    public int nächsteRunde() {
        if (guthaben < 10) {
            return -1;
        }
        guthaben -= 10;
        spielnummer++;
        for (int i = 0; i < würfel.length; i++) {
            würfel[i] = new Random().nextInt(höchstzahl) + 1;
        }
        int zähler1 = 0;
        for (int i = 0; i < würfel.length; i++) {
            int zähler2 = 0;
            for (int j = 0; j < würfel.length; j++) {
                if (i != j && würfel[i] == würfel[j]) {
                    zähler2++;
                }
            }
            if (zähler2 > zähler1) {
                zähler1 = zähler2;
            }
        }
        if (zähler1 == 1) {
            guthaben += 20;
        } else if (zähler1 == 2) {
            guthaben += 100;
        }
        return zähler1;
    }

    public static void main(String[] args) {
        BLogik bandit = new BLogik();
        int zähler;
        do {
            System.out.println("Spielnummer: " + (bandit.spielnummer + 1));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
            System.out.println("Der Spieler setzt 10");
            zähler = bandit.nächsteRunde();
            System.out.println("Es wurde " + Arrays.toString(bandit.würfel));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
        } while (zähler != -1);
    }
}

Kann sein, dass ich noch etwas vergessen habe, aber so in etwa sollte es funken ... Weitere Fragen auch gerne PN
 

Oneixee5

Top Contributor
Na ja, die Logik, ganz unabhängig von der Oberfläche, könnte ja in etwa so sein:

Java:
import java.util.Arrays;
import java.util.Random;

public class BLogik {
    private int guthaben = 100;
    private int spielnummer = 0;
    private final int[] würfel = new int[3];
    private final int höchstzahl = 10;

    public int nächsteRunde() {
        if (guthaben < 10) {
            return -1;
        }
        guthaben -= 10;
        spielnummer++;
        for (int i = 0; i < würfel.length; i++) {
            würfel[i] = new Random().nextInt(höchstzahl) + 1;
        }
        int zähler1 = 0;
        for (int i = 0; i < würfel.length; i++) {
            int zähler2 = 0;
            for (int j = 0; j < würfel.length; j++) {
                if (i != j && würfel[i] == würfel[j]) {
                    zähler2++;
                }
            }
            if (zähler2 > zähler1) {
                zähler1 = zähler2;
            }
        }
        if (zähler1 == 1) {
            guthaben += 20;
        } else if (zähler1 == 2) {
            guthaben += 100;
        }
        return zähler1;
    }

    public static void main(String[] args) {
        BLogik bandit = new BLogik();
        int zähler;
        do {
            System.out.println("Spielnummer: " + (bandit.spielnummer + 1));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
            System.out.println("Der Spieler setzt 10");
            zähler = bandit.nächsteRunde();
            System.out.println("Es wurde " + Arrays.toString(bandit.würfel));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
        } while (zähler != -1);
    }
}

Kann sein, dass ich noch etwas vergessen habe, aber so in etwa sollte es funken ... Weitere Fragen auch gerne PN
Ich habe überlegt ob ich den Code kritisieren soll. Ich schaffe es aber einfach nicht über die Treppen aus if/for hinwegzusehen. Ich halte so einen Code für unverständlich und als Commit würde ich das nicht akzeptieren.
Ich will deshalb mal eine Alternative zeigen um die Anzahl identischer Würfel (s. ursprünglicher Post) zu ermitteln. Es gibt 3 Slots also gibt es nur 3 Möglichkeiten: 1, 2, 3
Java:
        final int[] dices = { 7, 7, 9 }; // gewürfelte Slots
        
        final HashMap<Integer, Integer> map = new HashMap<>(dices.length);
        for (final int i : dices) {
            map.merge(i, 1, (v1, v2) -> v1 + v2);
        }
        final int countOfIdenticalDices = Collections.max(map.values());

        System.out.println("Anzahl identischer Würfel:" + countOfIdenticalDices);
Man könnte das auch zu einem Einzeiler verkürzen ich fand es so nur etwas leserlicher.
 

ing0-bing0

Aktives Mitglied
Man könnte das auch zu einem Einzeiler verkürzen ich fand es so nur etwas leserlicher.
Ja, der Einzeiler könnte so sein:

Java:
int zähler1 = Arrays.stream(würfel).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream().sorted(Map.Entry.<Integer,Long>comparingByValue().reversed()).findFirst().get().getValue().intValue() - 1;

Man sollte aber immer so antworten, dass der Fragende es versteht.
 

Staarfightaar

Bekanntes Mitglied
Java:
int zähler1 = Arrays.stream(würfel).boxed().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())).entrySet().stream().sorted(Map.Entry.<Integer,Long>comparingByValue().reversed()).findFirst().get().getValue().intValue() - 1;
:D riesen schinken an methoden aufrufen und dann noch ein schnuckliges -1 hinten dran, fand ich lustig :D
 

Silvin05

Mitglied
Zeige doch mal was du schon hast und wo genau du Probleme hast. Benutze die Code-Tags: </> links oben im Eingabefeld.
Hi @Oneixee5,
[CODE lang="java" title="Banditen"]
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Banditen extends JFrame{

//automatisch über Eclipse eingefügt
private static final long serialVersionUID = 3006212012028893840L;

//ein Label für die Ausgabe
private JLabel ausgabeWuerfel1, ausgabeWuerfel2,ausgabeWuerfel3;
private JLabel lbbilder1, lbbilder2, lbbilder3, lbbilder4, lbbilder5, lbbilder6;
private JButton btnstart;
private int startGuthaben = 100;
private int wuerfelGewin;
private JPanel panelbilder, panelbtn,panelBtnWueZahlen;

//die innere Klasse für die Ereignisverarbeitung
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {

Random wuerfel = new Random();
int augenZahl;
for (int i=1; i<2; i++) {
augenZahl = i + wuerfel.nextInt(6);
ausgabeWuerfel1.setText("" + augenZahl);
}
int augenZahl2;
for (int i=1; i<2; i++) {
augenZahl2 = i + wuerfel.nextInt(6);
ausgabeWuerfel2.setText("" + augenZahl2);
}
int augenZahl3;
for (int i=1; i<2; i++) {
augenZahl3 = i + wuerfel.nextInt(6);
ausgabeWuerfel3.setText("" + augenZahl3);
}

}

}

//der Konstruktor
public Banditen(String titel) {
super(titel);

//Label gewürfelt Zahlen
panelbilder = new JPanel();
ausgabeWuerfel1 = new JLabel();
ausgabeWuerfel2 = new JLabel();
ausgabeWuerfel3 = new JLabel();
// Label Würfel bilder
lbbilder1 = new JLabel();
lbbilder1.setIcon(new ImageIcon("bilder/eins.png"));
lbbilder2 = new JLabel();
lbbilder2.setIcon(new ImageIcon("bilder/zwei.png"));
lbbilder3 = new JLabel();
lbbilder3.setIcon(new ImageIcon("bilder/drei.png"));
lbbilder4 = new JLabel();
lbbilder4.setIcon(new ImageIcon("bilder/vier.png"));
lbbilder5 = new JLabel();
lbbilder5.setIcon(new ImageIcon("bilder/fuenf.png"));
lbbilder6 = new JLabel();
lbbilder6.setIcon(new ImageIcon("bilder/sechs.png"));

panelbilder.add(lbbilder1);
panelbilder.add(lbbilder2);
panelbilder.add(lbbilder3);
panelbilder.add(lbbilder4);
panelbilder.add(lbbilder5);
panelbilder.add(lbbilder6);
btnstart = new JButton("Start");
panelbilder.add(btnstart);
add(panelbilder);
panelbilder.setBorder(new TitledBorder("Einarmiges Bandit-Würfelbilder"));

panelBtnWueZahlen = new JPanel();
// panelbtn = new JPanel();

ausgabeWuerfel1 = new JLabel("7");
ausgabeWuerfel1.setFont(new Font("sherif", Font.BOLD, 30));
ausgabeWuerfel2 = new JLabel("7");
ausgabeWuerfel2.setFont(new Font("sherif", Font.BOLD, 30));
ausgabeWuerfel3 = new JLabel("7");
ausgabeWuerfel3.setFont(new Font("sherif", Font.BOLD, 30));

panelBtnWueZahlen.add(ausgabeWuerfel1);
panelBtnWueZahlen.add(ausgabeWuerfel2);
panelBtnWueZahlen.add(ausgabeWuerfel3);

add(panelBtnWueZahlen);
// panelBtnWueZahlen.setLayout(new GridLayout());
panelBtnWueZahlen.setBorder(new TitledBorder("GEWÜRFELT ZAHLEN"));

ButtonListener wuerfeln = new ButtonListener();
btnstart.addActionListener(wuerfeln);


//ein Gridlayout mit 3 Spalten
setLayout(new GridLayout(0,1));

//die Standard-Aktion setzen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//packen und anzeigen
pack();
setVisible(true);
setResizable(false);
}

public static void main (String [] args){
new Banditen(" Banditen");
}

}

[/CODE]
Dank für deine Antwort.
hier ist meine beginners Code. Wie schon in meinem Beitrag geschrieben habe, die Logik Methoden sind nicht drin auf Grund dessen habe das Probleme hier gemeldet.
 

Silvin05

Mitglied
Ich habe überlegt ob ich den Code kritisieren soll. Ich schaffe es aber einfach nicht über die Treppen aus if/for hinwegzusehen. Ich halte so einen Code für unverständlich und als Commit würde ich das nicht akzeptieren.
Ich will deshalb mal eine Alternative zeigen um die Anzahl identischer Würfel (s. ursprünglicher Post) zu ermitteln. Es gibt 3 Slots also gibt es nur 3 Möglichkeiten: 1, 2, 3
Java:
        final int[] dices = { 7, 7, 9 }; // gewürfelte Slots
      
        final HashMap<Integer, Integer> map = new HashMap<>(dices.length);
        for (final int i : dices) {
            map.merge(i, 1, (v1, v2) -> v1 + v2);
        }
        final int countOfIdenticalDices = Collections.max(map.values());

        System.out.println("Anzahl identischer Würfel:" + countOfIdenticalDices);
Man könnte das auch zu einem Einzeiler verkürzen ich fand es so nur etwas leserlicher.
@Oneixee5
Deine Code schau ich mir an.
Na ja, die Logik, ganz unabhängig von der Oberfläche, könnte ja in etwa so sein:

Java:
import java.util.Arrays;
import java.util.Random;

public class BLogik {
    private int guthaben = 100;
    private int spielnummer = 0;
    private final int[] würfel = new int[3];
    private final int höchstzahl = 10;

    public int nächsteRunde() {
        if (guthaben < 10) {
            return -1;
        }
        guthaben -= 10;
        spielnummer++;
        for (int i = 0; i < würfel.length; i++) {
            würfel[i] = new Random().nextInt(höchstzahl) + 1;
        }
        int zähler1 = 0;
        for (int i = 0; i < würfel.length; i++) {
            int zähler2 = 0;
            for (int j = 0; j < würfel.length; j++) {
                if (i != j && würfel[i] == würfel[j]) {
                    zähler2++;
                }
            }
            if (zähler2 > zähler1) {
                zähler1 = zähler2;
            }
        }
        if (zähler1 == 1) {
            guthaben += 20;
        } else if (zähler1 == 2) {
            guthaben += 100;
        }
        return zähler1;
    }

    public static void main(String[] args) {
        BLogik bandit = new BLogik();
        int zähler;
        do {
            System.out.println("Spielnummer: " + (bandit.spielnummer + 1));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
            System.out.println("Der Spieler setzt 10");
            zähler = bandit.nächsteRunde();
            System.out.println("Es wurde " + Arrays.toString(bandit.würfel));
            System.out.println("Das Guthaben beträgt: " + bandit.guthaben);
        } while (zähler != -1);
    }
}

Kann sein, dass ich noch etwas vergessen habe, aber so in etwa sollte es funken ... Weitere Fragen auch gerne PN
Deine Code schau ich mir an.
 

Silvin05

Mitglied
Zeige doch mal was du schon hast und wo genau du Probleme hast. Benutze die Code-Tags: </> links oben im Eingabefeld.
anbei mein Code.
Ich werde weiterhin nicht Klug. Das GUI Teilt aus meiner Sicht ist ausreichend fertig, bleibt weiterhin die Frage wie kann ich die Startguthaben, die Kosten für jede Spiel, die 20 Euro Gewinn wenn der Spieler Zwei gleiche Zahlen würfelt, die 100 Euros Gewinn wenn der Spieler Drei gleiche Zahlen würfelt und das Spiel beenden wenn der Spieler alles verspielt, berechnen und in GUI Anzeigen lassen.
Das würfeln Funktioniert und der Spiel Zähler für jeden Schaltfläche Click Funktioniert auch
[CODE lang="java" title="einarmigen Bandit"]
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Bandit extends JFrame{

//automatisch über Eclipse eingefügt
private static final long serialVersionUID = 3006212012028893840L;

//Drei Label für die Würfel Ausgabe
private JLabel ausgabeWuerfel1, ausgabeWuerfel2, ausgabeWuerfel3;
// Die Lebel für Bilder
private JLabel lbbilder1, lbbilder2, lbbilder3, lbbilder4, lbbilder5, lbbilder6;
//eine Schaltfläche zum starten der Spiel
private JButton btnstart;
private int startGuthaben = 100;
private int spielNr = 0;
//Drei Panels für Bilder, gewürfelt
private JPanel panelbilder, panelAusgabe,panelgeWueZahlen;
//Label für das Spiel Ausgaben
private JLabel lbSpielNummer, lbstartgutHaben, lbbetraegtGuthaben, lbSpieler;

//die innere Klasse für die Ereignisverarbeitung
class ButtonListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {

Random wuerfel = new Random();
int wuerfel1;
startGuthaben -= 10;
spielNr++;
for (int i=1; i<2; i++) {
wuerfel1 = i + wuerfel.nextInt(6);
ausgabeWuerfel1.setText("" + wuerfel1);
lbSpielNummer.setText("" + spielNr);
}
int wuerfel2;
for (int i=1; i<2; i++) {
wuerfel2 = i + wuerfel.nextInt(6);
ausgabeWuerfel2.setText("" + wuerfel2);
}
int wuerfel3;
for (int i=1; i<2; i++) {
wuerfel3 = i + wuerfel.nextInt(6);
ausgabeWuerfel3.setText("" + wuerfel3);

}
}
}

//der Konstruktor
public Bandit(String titel) {
super(titel);

//Label gewürfelt Zahlen
panelbilder = new JPanel();
ausgabeWuerfel1 = new JLabel();
ausgabeWuerfel2 = new JLabel();
ausgabeWuerfel3 = new JLabel();
//neue Labels
lbSpielNummer = new JLabel("0");
lbstartgutHaben = new JLabel("0");
lbbetraegtGuthaben = new JLabel("0");
lbSpieler = new JLabel(" Der Spiler Legt 10 euros");
btnstart = new JButton("Start");
// Label Würfel bilder
lbbilder1 = new JLabel();
lbbilder1.setIcon(new ImageIcon("bilder/eins.png"));
lbbilder2 = new JLabel();
lbbilder2.setIcon(new ImageIcon("bilder/zwei.png"));
lbbilder3 = new JLabel();
lbbilder3.setIcon(new ImageIcon("bilder/drei.png"));
lbbilder4 = new JLabel();
lbbilder4.setIcon(new ImageIcon("bilder/vier.png"));
lbbilder5 = new JLabel();
lbbilder5.setIcon(new ImageIcon("bilder/fuenf.png"));
lbbilder6 = new JLabel();
lbbilder6.setIcon(new ImageIcon("bilder/sechs.png"));

panelbilder.add(lbbilder1);
panelbilder.add(lbbilder2);
panelbilder.add(lbbilder3);
panelbilder.add(lbbilder4);
panelbilder.add(lbbilder5);
panelbilder.add(lbbilder6);
panelbilder.add(btnstart);
add(panelbilder);
panelbilder.setBorder(new TitledBorder("Einarmiges Bandit-Würfelbilder"));

panelgeWueZahlen = new JPanel();
// panelbtn = new JPanel();

ausgabeWuerfel1 = new JLabel("7");
ausgabeWuerfel1.setFont(new Font("sherif", Font.BOLD, 30));
ausgabeWuerfel2 = new JLabel("7");
ausgabeWuerfel2.setFont(new Font("sherif", Font.BOLD, 30));
ausgabeWuerfel3 = new JLabel("7");
ausgabeWuerfel3.setFont(new Font("sherif", Font.BOLD, 30));

panelgeWueZahlen.add(ausgabeWuerfel1);
panelgeWueZahlen.add(ausgabeWuerfel2);
panelgeWueZahlen.add(ausgabeWuerfel3);

//Panel Ausgabe
panelAusgabe = new JPanel();


panelAusgabe.add(new JLabel("Start Guthaben: "));
panelAusgabe.add(lbstartgutHaben);
panelAusgabe.add(lbSpieler);
panelAusgabe.add(new JLabel(" Spielnummer: "));
panelAusgabe.add(lbSpielNummer);
panelAusgabe.add(new JLabel(" Das Guthaben beträgt: "));
panelAusgabe.add(lbbetraegtGuthaben);

panelAusgabe.setLayout(new FlowLayout(1, 20, 20));
panelAusgabe.setBorder(new TitledBorder("Würfel Ausgaben"));


add(panelgeWueZahlen);
add(panelAusgabe);
// panelgeWueZahlen.setLayout(new FlowLayout());
panelgeWueZahlen.setBorder(new TitledBorder("Würfel Zahlen"));

ButtonListener wuerfeln = new ButtonListener();
btnstart.addActionListener(wuerfeln);


//ein Gridlayout mit 3 Spalten
setLayout(new GridLayout(0,1));

//die Standard-Aktion setzen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//packen und anzeigen
pack();
setVisible(true);

//Größenänderungen sind nicht zugelassen
//damit das mühsam erstellte Layout nicht durcheinander kommt
setResizable(true);
}

}
[/CODE]
Riesen Dankschön im Voraus.
 

Neue Themen


Oben