In dieser Blogserie möchte ich Ihnen eine kleine Auswahl aus den „Rezepten“ unseres neuen Titels Visual C# 2017 präsentieren und Ihnen als künftigen oder fortgeschrittenen C#-Programmierer einen Vorgeschmack darauf geben, wie Sie einzelne Komponenten für das Microsoft .NET Framework programmieren können. Heute geht es darum anhand eines Skatspieles Ihre OOP Kenntnisse zu verbessern.Es wird gezeigt, wie die in einem Array abgespeicherten Karten-Objekte durch einen Konstruktor erzeugt werden und selbst wiederum nach außen als Eigenschaften einer Klasse Spiel in Erscheinung treten.

HINWEIS: Zum Verständnis ist die Kenntnis der Skatregeln keinesfalls Voraussetzung. Es reicht aus, zu wissen, dass das Spiel aus 32 Karten besteht und jeder der drei Spieler zu Beginn zehn Karten erhält und die restlichen zwei davon im sogenannten „Skat“ verbleiben.

Oberfläche

Die folgende Abbildung bedarf wohl keines weiteren Kommentars:

Quellcode

Es dient der Übersicht, wenn man für jede Klasse ein eigenes Klassenmodul verwendet. Diesmal aber wollen wir zeigen, dass man auch mehrere Klassen gemeinsam in einem Modul implementieren kann, und erweitern dazu das bereits vorhandene Form1-Modul. Ob mehrere Klassen in einer Codedatei übersichtlich sind, sei jetzt mal dahingestellt. Unterhalb des Klassencodes von Form1 deklarieren wir die Klassen Karte und Spiel:

public class Karte
{   
    public string Farbe { get; set; }
    public string Wert { get; set; }

 

Der Konstruktor:

    public Karte(string f, string w)
    {
        Farbe = f;
        Wert = w;
    }
}

 

Die Klasse Spiel kapselt 32 Instanzen der Klasse Karte:

public class Spiel
{

 

Die Eigenschaft Karten (das ist ein Array mit 32 Karten):

public Karte[] Karten = new Karte[32];

 

Eine Hilfsmethode soll das Generieren der Karten vereinfachen:

private void createKarten(string farbe, int a)
{
    Karten[a] = new Karte(farbe, "Sieben");
    Karten[a + 1] = new Karte(farbe, "Acht");
    Karten[a + 2] = new Karte(farbe, "Neun");
    Karten[a + 3] = new Karte(farbe, "Zehn");
    Karten[a + 4] = new Karte(farbe, "Bube");
    Karten[a + 5] = new Karte(farbe, "Dame");
    Karten[a + 6] = new Karte(farbe, "König");
    Karten[a + 7] = new Karte(farbe, "As");
}

 

 

Der Konstruktor erzeugt und füllt das Spiel der Reihe nach mit allen 32 Karten:

public Spiel()
{
     createKarten("Eichel", 0);
     createKarten("Grün", 8);
     createKarten("Rot", 16);
     createKarten("Schell", 24);
}

 

Die Methode zum Mischen der Karten:

public void Mischen()
{

 

Der Zwischenspeicher für den Kartentausch:

Karte tmp;

 

Ein Zufallszahlengenerator:

Random rnd = new Random();

Alle Karten nacheinander durchlaufen:

for (int i = 0; i < Karten.Length; i++)
{

 

Den Zufallsindex einer anderen Karte bestimmen:

int z = rnd.Next(0, Karten.Length);

 

Die zufällige Karte mit der aktuellen Karte vertauschen:

            tmp = Karten[z];
            Karten[z] = Karten[i];
            Karten[i] = tmp;
        }
    }
}

HINWEIS: Aus Gründen der Einfachheit bleibt der Index 0 des Karten-Arrays ungenutzt.

 

Nun zum Klassencode von Form1:

public partial class Form1 : Form
{
    ...

 

Ein neues Kartenspiel wird erzeugt:

Spiel spiel = new Spiel();

 

Eine Hilfsroutine zum Löschen der Anzeige:

private void Loeschen()
{
    listBox1.Items.Clear();
    listBox2.Items.Clear();
    listBox3.Items.Clear();
    listBox4.Items.Clear();
}

 

Alle Karten mischen:

private void button1_Click(object sender, System.EventArgs e)
{
    loeschen();      
    spiel.Mischen();
}

 

Alle Karten austeilen:

private void button2_Click(object sender, EventArgs e)
{
     loeschen();

 

Die Karten für Müller:

for (int i = 0; i < 10; i++)
{
    listBox1.Items.Add(spiel.Karten[i].Farbe + "  " + spiel.Karten[i].Wert);

Die Karten für Meier:

for (int i = 10; i < 20; i++)
{
    listBox2.Items.Add(spiel.Karten[i].Farbe + "  " + spiel.Karten[i].Wert);
}

 

Die Karten für Schulze:

for (int i = 20; i < 30; i++)
{
    listBox3.Items.Add(spiel.Karten[i].Farbe + "  " + spiel.Karten[i].Wert);
}

 

Die restlichen zwei Karten wandern in den Skat:

        for (int i = 30; i < 32; i++)
        {
            listBox4.Items.Add(spiel.Karten[i].Farbe + "  " + spiel.Karten[i].Wert);
        }
    }
    ...
}

 

Test

Wenn Sie, vor lauter Ungeduld, unmittelbar nach Programmstart auf die Schaltfläche „Karten austeilen“ klicken, werden Sie von allen drei Spielern laute Protestrufe ernten, da die Karten offensichtlich nicht gemischt wurden:

Erst nach ein- oder mehrmaligem Klick auf die Schaltfläche „Karten mischen“ hat die Gerechtigkeit ihren Einzug gehalten und der Zufall bestimmt, welche Karten die Spieler Müller, Meier und Schulze erhalten: