Spielprogrammierung mit Java
HomeAufgabenDruckenJava-Online

Karten anzeigen mit Hand-Layouts


Die Applikationsklassen für Kartenspiele werden in der Regel von der Klasse CardGame abgeleitet, die ihrerseits aus GameGrid abgeleitet ist. Das Spielfenster erhält dadurch eine 1 Pixel Auflösung und einen grünen Hintergrund ohne Gitterlinien und keinen Navigationsbalken. Die Methoden show() und doRun() werden automatisch gestartet.

Hands sind sehr nützliche Container für Karten. Man verwendet sie nicht nur für Karten, welche die Spieler in der Hand halten, sondern auch für die Stapel und Kartenablage auf dem Spieltisch. Für die Darstellung von Karten können vier Layout-Klassen verwendet werden:

  • RowLayout
  • ColumnLayout
  • FanLayout
  • StackLayout

Mit der Methode setView() wird das Layout einer Hand zugeordnet und mit der Methode draw() werden die Karten einer Hand im Spielfenster dargestellt.

Eine Deck - Instanz erhält Informationen über die zur Verfügung stehende Karten als enum-Werte:
enum Suit mit den Werten KREUZ, KARO, HERZ, PIK für Jasskarten bzw. CLUBS, DIAMONDS, HEARTS, SPADES für die Bridgekarten
enum Rank mit den Werten ASS, KOENIG, DAME, BUBE, ZEHN, NEUN, ACHT, SIEBEN, SECHS bzw. ACE, KING, QUEEN, JACK, TEN, NINE, EIGHT, SEVEN, SIX, FIVE, FOUR, THREE, TWO
Statt BUBE wird oft auch BAUER verwendet.

Zu diesen Karten stellen wir folgende Sprites zur Verfügung, die automatisch auf Grund der enum-Bezeichner geladen werden:
KREUZ-ACE sprites/kreuz0.gif
KREUZ-KING sprites/kreuz1.gif
KREUZ-QUEEN sprites/kreuz2.gif
bzw.
CLUBS-ACE sprites/clubs0.gif
CLUBS-KING sprites/clubs1.gif
CLUBS-QUEEN sprites/clubs2.gif
usw.

 
(Für die Arbeit mit einer lokalen Entwicklungsumgebung müssen sich die Kartendateien im Unterverzeichnis sprites des src-Verzeichnisses befinden. Unter dem Menüpunkt Kartenbibliothek stellen wir Ihnen weitere Kartensätze zum Herunterladen zur Verfügung).

Im folgenden Beispiel werden die unterschiedlichen Kartenlayouts gezeigt.

Programmcode für lokale Bearbeitung downloaden (CardGameEx1.zip)

Programmcode:

// CardGameEx1.java 

import ch.aplu.jcardgame.*;
import ch.aplu.jgamegrid.*;

public class CardGameEx1 extends CardGame
{
  public enum Suit
  {
    KREUZ, KARO, HERZ, PIK
  }

  public enum Rank
  {
    ASS, KOENIG, DAME, BUBE, ZEHN, NEUN, ACHT, SIEBEN, SECHS
  }
  private Deck deck = new Deck(Suit.values(), Rank.values(), "cover");
  private final int nbCards = 6;
  private final int nbPlayers = 4;
  private Hand[] hand;

  public CardGameEx1()
  {
    super(600, 600);
    hand = deck.dealingOut(nbPlayers, nbCards);
    RowLayout rowLayout = new RowLayout(new Location(200, 150), 350);
    hand[0].setView(thisrowLayout);
    hand[0].draw();
    ColumnLayout columnLayout = new ColumnLayout(new Location(500, 250), 400);
    hand[1].setView(thiscolumnLayout);
    hand[1].draw();
    FanLayout fanLayout = new FanLayout(new Location(200, 850), 500, 260, 280);
    hand[2].setView(thisfanLayout);
    hand[2].draw();
    StackLayout stackLayout = new StackLayout(new Location(380, 500));
    hand[3].setView(thisstackLayout);
    hand[3].setVerso(true);
    hand[3].draw();
  }

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

Erklärungen zum Programmcode:
Deck deck = new Deck(Suit.values(), Rank.values(), "cover")
Erzeugt ein Kartenspiel, wobei die Farbe durch den enum Suit und der Rang durch den enum Rank festgelegt. Cover ist der abgekürzte Dateiname für das Sprite der Kartenrückseite
Hand[ ] hand = deck.dealingOut(nbPlayers, nbCards)

Veteilt Karten aus dem Kartenspiel. Es wird ein Array von Hand zurückgegeben, wobei die Elemente 0..nbPlayers je nbCards Karten erhalten. Die Karten sind zufällig gemischt

RowLayout rowLayout = new RowLayout(new Location(200, 150), 350)

Legt einen RowLayot an der Position (200, 150), mit der Breite 350 fest
hand[0].setView(this, rowLayout)
Setzt den Layou der Hand
hand[0].draw()
Stellt die Hand dar

hand[3].setVerso(true)

Die letzte Hand wird mir der Kartenrdargestelltückseite angezeigt