Kniffel JTable

beast

Neues Mitglied
Guten Tag erstmal,
ich bin bei meiner Tabelle für das Spiel Kniffel auf ein großes Problem gestoßen und zwar:
1: Wie kann etwas wenn ich eine Zeile in der Tabelle (JTable) anklicke, dass in der Tabelle wie in meinem Ansatz (der anscheinend falsch ist) die Summe in der Spalte "Chance" steht wenn man Reihe 12 der Tabelle anklickt.

2: Mein Ansatz
Java:
 columnNames = {"Punkte",
  "Spieler 1",
  "Spieler 2"};

       Object[][] data = {
       {"Einser","",""},
       {"Zweier","",""},
       {"Dreier","",""},
       {"Vierer", "",""},
       {"Fünfer","",""},
       {"Sechser","",""},
       {"Bonus","",""},
       {"Summe Oben","",""},
       {"Dreierpasch","",""},
       {"Viererpasch","",""},
       {"Full House","",""},
       {"Kleine Straße","",""},
       {"Große Straße","",""},
       {"Kniffel","",""},
       {"Chance",summe,""},
       {"Summe Gesamt","",""}
       };
   

       final JTable table = new JTable(data, columnNames);
   
       table.setEnabled(true);
   
       table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

   
     
          @Override
          public void valueChanged(ListSelectionEvent event) {
          if (table.getSelectedRow()==12) {
           summe=wuefel[1]+wuefel[2]+wuefel[3]+wuefel[4]+wuefel[5];
      
          }
          }
         });
 
Zuletzt bearbeitet:
Hallöchen,
ich werde aus Deiner Frage nicht schlau! Wenn Du mal selbst Deine Frage liest wirst Du mir bestimmst zustimmen, oder?🙂
Was genau ist jetzt Dein Problem?
 
Java:
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                JTable jtab = (JTable) e.getComponent();
                int row = jtab.rowAtPoint(e.getPoint());
                if (row == 12) {
                    String value = "DEINE SUMME ZUSAMMENRECHNEN";
                    jtab.getModel().setValueAt(value, 14, 1);
                }
            }

        });
 
Java:
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                JTable jtab = (JTable) e.getComponent();
                int row = jtab.rowAtPoint(e.getPoint());
                if (row == 12) {
                    String value = "DEINE SUMME ZUSAMMENRECHNEN";
                    jtab.getModel().setValueAt(value, 14, 1);
                }
            }

        });
DANKE DIR

Ehm und wie würde ich das mit einer Straße z.B machen... muss ich da jede mögliche "if" abfragen oder gibt es da einen anderen Weg?
 
Ehm und wie würde ich das mit einer Straße z.B machen... muss ich da jede mögliche "if" abfragen oder gibt es da einen anderen Weg?
1. Schreibe eine Methode "würfeln", die ein int[5] zurückgibt, wobei jedes der 5 ints nur einen Wert zwischen 1 und 6 (beides inklusive) haben darf.
2. Schreibe dir einen Satz von Klassen, die das array auf 1. daraufhin überprüfen, ob es bestimmte Kriterien erfüllt, z. B. die Klasse "Kniffel", die überprüft, ob alle ints denselben Wert haben, oder die Klasse "FullHouse", die überprüft, ob das array einen Zwiling und einen Drilling beinhaltet, usw. Diese Klassen sollten von einer gemeinsamen Oberklasse (z. B. "Würfelkombination") abgeleitet sein, die eine abstrakte Methode "istGültig(int[] wurf)" definiert. Diese würda dann in den Unterklassen entsprechend implementiert werden.
3. Verwende die Klasse aus 2. zum erstellen eines eigenen Tabellenmodel. Die 1. Spalte würde dann 14 Instanzen der Klasse aus 2. enthalten, die Spalten ab der zweiten die Zahlenwerte für eine Runde.
 
Keine Ahnung wie weit du mit dem Rest vom Konzept bist, ob da überhaupt per Computer gewürfelt wird oder wie auch immer. In jedem Fall, wenn ich mich da Recht erinnere muss der Spieler ja immer selber entscheiden was er wo hin haben will bei Kniffel.

Daher kannst du Harry Kanes Idee zum Prüfen sicher aufgreifen, aber aber das Entscheiden und anklicken muss sicher selber machen. Kürzer ginge es zum Beispiel mit folgendem Code

Java:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import javax.swing.JTable;

/**
* PSEUDO CODE
*
*/
public class Wuerfeln {

    private static final int DREIERPASCH = 3;
    private static final int KNIFFEL = 5;
   
   
   
    /**
     * Initialisiere alle Variationen
     *
     *
     */
    public Variation[] varianten = new Variation[] {
        (int[] values) -> IntStream.of(values).filter(value -> value == 1).sum(), // alle einser
        (int[] values) -> IntStream.of(values).filter(value -> value == 2).sum(), // alle 2er
        (int[] values) -> IntStream.of(values).boxed().collect(
                Collectors.groupingBy(p -> p)).
                    values().
                        stream().
                            filter(p -> p.size() >= DREIERPASCH).map(p -> values).flatMapToInt(p -> IntStream.of(values)).sum(), // dreierpasch
        (int[] values) -> IntStream.of(values).sum(), // chance
        (int[] values) -> IntStream.of(values).boxed().collect(
                Collectors.groupingBy(p -> p)).
                    values().
                        stream().
                            filter(p -> p.size() >= KNIFFEL).
                                map(p -> values).flatMapToInt(p -> IntStream.of(new int[] {50})).sum(), // kniffel
                           
        // die anderen Variationen auffüllen für alle rows, 4er Pasch, Strasse etc......
        // hab hier nur ein Paar Beispiele gemacht                               
    };
   
   
    public Wuerfeln() {
    }

    public static void main(String[] args) {
        // DEIN WÜRFEL ARRAY int[] values = new int[] {1, 1, 1, 4, 1};  // dein wurf
        Wuerfeln instance = new Wuerfeln();
       
        // jtable bauen
        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                JTable jtab = (JTable) e.getComponent();
                int row = jtab.rowAtPoint(e.getPoint());
                jtab.getModel().setValueAt(instance.varianten[row].calculate(DEIN WÜRFEL ARRAY), row, SPIELER SPALTE);
            }
           
        });
    }
   
    private interface Variation {
        int calculate(int[] values);
    }
}

Oben die Berechnungen auffüllen, dann kannst per klick in die Reihe/Spalte den Wurf prüfen und
das Ergebnis direkt in die Tabelle schreiben. Wichtig ist nur, dass die Anzahl der Varianten komplett ist,
kannst auch statt der streams die Berechnung über Methoden machen.
 

Zurück
Oben