Programm-Programmierungs Frage (Java)

Joined
Apr 8, 2007
Messages
6,474
Reaction score
0
Hey Leute ;)

ich bin gerade mal wieder dabei mein kleines PokerProgramm voran zu treiben und hab gerade ein Problem und weiss nicht ob ich optimal Lösen würde.... ich habe 2 Comboboxen mit jeweils 13 Einträgen ca. und dazu eine Checkbox und nun will ich für jede Combo die zwischen den 2 Comboboxen und der Checkbox möglich ist ein "Event" machen ... muss ich jetzt alle möglichen Kombis mit IF- durchgehen ... oder gibts da ne besser Möglichkeit.... atm hab ich die ComboBoxen mit "Strings" gefüllt.... aber nen Kumpel meinte zu mir, dass ich das eher mit MVC machen soll... ich weiss aber leider nicht genau wodrauf er genau hinaus will

danke schonmal im vorraus :)
 
MVC steht für Model View Controller und ist ein Architekturmuster, welches eine brauchbare Aufteilung eines Quelltextes definiert.

Man trennt somit die reinen Daten (z.B. in einer Datenbank - Model / Modell) von der Darstellung (z.B. dem Form - View / Präsentation ) und von dem steuernden Programm (deine Java Klassen etc. - Controller / Steuerung).

Zusätzlich definiert man noch, wer wie mit wem Sprechen darf.

321px-ModelViewControllerDiagram.svg.png

Die Steuerung darf also sowohl die Präsentation, als auch das Modell direkt ansprechen.
Die Präsentation darf nur das Modell direkt ansprechen, kann jedoch ein Event auslösen, womit die Steuerung angesprochen wird.
Und das Modell kann zuletzt ein Event auslösen, womit die Präsentation angesprochen wird, um die Anzeige zu aktualisieren.


Warum er dir dies rät kann ich dir jedoch nicht beantworten, solange ich deinen Quelltext nicht gesehen habe und nicht weiß, was dein Programm macht.
Je nachdem was du nun umsetzen willst ist es sinnvoller die Daten in das Modell oder in die Präsentation zu schreiben.

Alle möglichen Kombinationen könntest du durch viele IF-Anweisungen prüfen, jedoch könnte es auch sehr gut sein, dass dein Problem eine deutlich generischere Lösung zulässt. Dazu müssen wir aber wie gesagt schon etwas mehr zum eigentlich Programm wissen.
Aufgabe + Quelltext wäre ein Anfang.
 
also viel Quelltext hab ich noch net erstmal nur die Swing gebaut ... also ich wollte das so machen, dass ich 2 Comboboxen mit Karten von 2 - Ass jeweils habe und eine Checkbox wo ich Suited ankreuzen kann ... und dann soll er mir zu der jeweiligen Hand ein System ausgeben wie ich spielen soll welches er z.b. in einem Textfeld ausgibt ... und ich müsste jetzt halt jede Mögliche Kombination der beiden Comboboxen untereinander und mit der Checkbox überprüfen wobei ich eigentl. nicht überprüfungen muss J 5 oder 5 J is ja egal
 
abgesehen davon, dass ichs total hohl finde, sowas zu programmieren:

1. mvc hat nichts mit deinem probelm zu tun
2. wenn du für jede kombination eine exakte vorher definierte ansage haben willst musst du die kombinationen differenzieren
-> ich würde entweder ein komplexes bewertungssystem für karten oder intervalle definieren.
ne schönere lösung fällt mir nicht ein
 
Ich habe mal ein paar grundlegende Klassen zusammengetippt (Achtung: Ich habe sie nicht auf Fehler überprüft!).
Was nun noch fehlt ist eine Klasse, welche die jeweilige Hand angibt und eine, welche die noch möglichen Hände bestimmt.
Ich denke man sieht recht schnell ein, dass man dabei J 5 und 5 J in einem Zug behandeln kann.

Alternativ könnte man anstelle von Enum auch Binärwerte nutzen, das würde auch die Erkennung der Hand erleichtern. Jedoch sollte man dann auch Konstanten nutzen um die Lesbarkeit zu erhalten.
(Im Allg. würde ich dies bevorzugen)

Ich denke du solltest dich jetzt erstmal an der Klasse versuchen, welche die schon bestehende Hand zum Zeitpunkt X erkennt. Dann sieht man auch besser wo bei dir die Schwierigkeiten liegen und kann dort leichter ansetzen.


Java:
public class Poker
{
	public static void main(String[] args)
	{

	}
}
Java:
import java.util.ArrayList;

public class Player
{
	protected ArrayList<Card> Cards = new ArrayList<Card>();
	protected String name;

	public Player(String name)
	{
		this.name = name;
	}
	
	public String getName()
	{
		return this.name;
	}
	
	public void addCard(Card card)
	{
		this.Cards.add(card);
	}
	
	public ArrayList<Card> getCards()
	{
		return this.Cards;
	}
	
	public String toString()
	{
		return this.getName();
	}
}
Java:
public class PlayerSelf extends Player
{
	public PlayerSelf(String name)
	{
		super(name);
	}
}
Java:
public class PlayerOther extends Player
{
	public PlayerOther(String name)
	{
		super(name);
	}
}
Java:
import java.util.ArrayList;

public class CommunityCards
{
	protected ArrayList<Card> Cards = new ArrayList<Card>();
	
	public void addCard(Card card)
	{
		this.Cards.add(card);
	}
	
	public ArrayList<Card> getCards()
	{
		return this.Cards;
	}
}
Java:
enum CardSuit
{
	DIAMONDS, HEARTS, SPADES, CLUBS
}

enum CardRank
{
	DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
}

public class Card
{
	private final CardSuit suit;
	private final CardRank rank;

	public Card(CardSuit suit, CardRank rank)
	{
		this.suit = suit;
		this.rank = rank;
	}
	
	public CardSuit getSuit()
	{
		return this.suit;
	}
	
	public CardRank getRank()
	{
		return this.rank;
	}
	
	public String toString()
	{
		return rank + " of " + suit;
	}
}


//EDIT
Ich habe mal schnell ein Beispiel hingetippt.
Die untere Funktion TwoPair bestimmt nun ganz allg. ob man ein TwoPair besitzt.

Java:
public class Poker
{
	public static void main(String[] args)
	{
		PlayerSelf self = new PlayerSelf("Osbes");
		CommunityCards community = new CommunityCards();
		self.addCard(Card.getInstance(Card.Suit.DIAMONDS, Card.Rank.DEUCE));
		self.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.DEUCE));
		System.out.println(Hand.TwoPair(self, community));
		
		PlayerSelf NewSelf = new PlayerSelf("Osbes");
		NewSelf.addCard(Card.getInstance(Card.Suit.DIAMONDS, Card.Rank.DEUCE));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.THREE));
		System.out.println(Hand.TwoPair(NewSelf, community));
		NewSelf.addCard(Card.getInstance(Card.Suit.DIAMONDS, Card.Rank.FOUR));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.FIVE));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.SIX));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.SEVEN));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.EIGHT));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.NINE));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.TEN));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.JACK));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.QUEEN));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.KING));
		NewSelf.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.ACE));
		System.out.println(Hand.TwoPair(NewSelf, community));
		community.addCard(Card.getInstance(Card.Suit.HEARTS, Card.Rank.DEUCE));
		System.out.println(Hand.TwoPair(NewSelf, community));
	}
}

Java:
import java.util.Map;
import java.util.EnumMap;

public class Card
{
	private final Suit suit;
	private final Rank rank;
	private static Map<Suit, Map<Rank, Card>> Deck = new EnumMap<Suit, Map<Rank, Card>>(Suit.class);
	
	public enum Suit
	{
		DIAMONDS,
		HEARTS,
		SPADES,
		CLUBS
	}

	public enum Rank
	{
		DEUCE,
		THREE,
		FOUR,
		FIVE,
		SIX,
		SEVEN,
		EIGHT,
		NINE,
		TEN,
		JACK,
		QUEEN,
		KING,
		ACE
	}

	static
	{
		for (Suit suit : Suit.values())
		{
			Map<Rank, Card> suitDeck = new EnumMap<Rank, Card>(Rank.class);

			for (Rank rank : Rank.values())
			{
				suitDeck.put(rank, new Card(suit, rank));
			}
			Deck.put(suit, suitDeck);
		}
	}

	private Card(Suit suit, Rank rank)
	{
		this.suit = suit;
		this.rank = rank;
	}
	
	public static Card getInstance(Suit suit, Rank rank)
	{
		return Deck.get(suit).get(rank);
	}

	public Suit getSuit()
	{
		return this.suit;
	}
	
	public Rank getRank()
	{
		return this.rank;
	}
	
	public String toString()
	{
		return rank + " of " + suit;
	}
}

Java:
import java.util.ArrayList;

public class Hand
{
	public static int CardsToInt(ArrayList<Card> cards)
	{
		int integer = 0;
	
		for(Card card: cards)
		{
			integer = integer + (int) Math.pow(2, card.getSuit().ordinal() * 13 + card.getRank().ordinal());
		}
		
		return integer;
	}

	public static boolean TwoPair(PlayerSelf self, CommunityCards community)
	{
		ArrayList<Card> cards = self.getCards();
		cards.addAll(community.getCards());
		
		long binary = CardsToInt(cards);
		
		while(binary > 0)
		{
			long diff1 = 1 + ((long) 1<<13);
			long diff2 = 1 + ((long) 1<<26);
			long diff3 = 1 + ((long) 1<<39);
			
			if((binary & diff1) == diff1 || (binary & diff2) == diff2 || (binary & diff3) == diff3)
			{
				return true;
			}
			
			binary = binary>>1;
		}
		
		return false;
	}
}
 
okay danke schonmal für eure Mühe .... werde mich dem mal annehmen in meinem freien Block :)

@Style ... sinnvoll vll. nicht aber ich denk mir öfters mal kleine Programme aus und versuche diese möglichst geschickt umzusetzen ... um in Übung zu bleiben :)
aber bei mir funzen meine Programme meistens bloss beim "Geschickt" haperts :D

weil ich meintestens zu umständlich,zu einfach oder zu statisch programmiere :P
 
Last edited:
Back
Top