Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Eine Klasse - Viele Würfel

In einem Rollenspiel gibt es oft viele Würfel mit verschieden vielen Seiten, weshalb es sich empfiehlt eine eigene Klasse nur für Würfel anzulegen, die das Auswürfeln verschiedener Zahlen übernehmen soll. Dies erhöht die Wiederverwendbarkeit und verbessert die Struktur des Programmcodes, da die Klasse später leicht um weitere Würfelkombinationen erweitert werden kann. Die Klasse für die Würfel soll den englischen Namen Dice bekommen.

Es gibt in den AD&D Regeln verschiedene Varianten die Eigenschaften einer Spielfigur festzulegen, sie alle basieren auf drei Würfeln mit sechs Seiten, was als 3W6 abgekürzt wird. So erhält man Attribute, die zwischen 3 und 18 Punkten liegen. In diesem Programm benutzen wir die erste der AD&D Varianten, in der alle Eigenschaften nacheinander durch 3W6 ermittelt werden und der Benutzer keine Gelegenheit erhält, das ermittelte Ergebnis selbst einer Eigenschaft zuzuweisen.

Fügen Sie auf die bekannte Art eine weitere Objective-C Klasse zu ihrem Projekt hinzu, die Sie Dice nennen. Bevor man mit dieser Klasse arbeiten kann, muss sichergestellt werden, dass der Zufallszahlengenerator neu gestartet wird. Das passiert am besten bei der Initialisierung der Klasse, somit kann man es nicht vergessen.
#import "Dice.h"

@implementation Dice

- (
id) init
{
    if(self = [super init])
    {
        srandom(time(
NULL));
    }
    return (self);
}

@end
Zurück zum Würfeln. Mit einem Würfel W6 kann man Zahlen zwischen 1 und 6 erreichen. Die Methode in der Dice-Klasse für diese Aufgabe sieht so aus:
- (NSNumber *) RollW6
{
    NSNumber *w6Number;
    w6Number = [[NSNumber alloc] initWithInt:(random() %
6) +1];
    return w6Number;
}
Möchte man 3W6 auswürfeln, muss man diese Methode nur drei Mal aufrufen. Da solch einen Kombination aber in Zukunft öfter benötigt wird, können Sie die Klasse um eine weitere Methode ergänzen.
- (NSNumber *) Roll3W6
{
    NSNumber * firstW6 = [
self RollW6];
    NSNumber * secondW6 = [
self RollW6];
    NSNumber * thirdW6 = [
self RollW6];

    NSNumber *diceNumber = [NSNumber numberWithInt:([firstW6 intValue] + [secondW6
     intValue] + [thirdW6 intValue]) ];

    return diceNumber;
}
Wie bei allen Beispiele auf dieser Seite wird auch hier die Speicherverwaltung dem Garbage Collector überlassen, der seit OS X 10.5 zur Verfügung steht. Vergessen Sie daher nicht, ihn für dieses Projekt zu aktivieren. Ohne Garbage Collector müssten Sie alle Objekte, die sie mit alloc anlegen, auch selbst wieder freigeben. Eine Alternative wäre die Verwendung des Autoreleasepool, was dann in etwa so funktionieren könnte:
- (NSNumber *) RollW6
{
    NSNumber *diceNumber;
    diceNumber = [[NSNumber alloc] initWithInt:(random() %
6) +1];
    return ([diceNumber autorelease]) ;
}
Für diese Klasse hätte man zweifellos auch einen int-Typ statt NSNumber verwenden können, sie wäre dann an machen Stellen sogar etwas einfacher in der Handhabung. Ein Objekt-Typ wie NSNumber ist aber immer dann notwendig, wenn man Daten speichern will, wie es später ja noch geschehen soll.

nächste Seite