#!/usr/bin/perl
#############################################################
# "randdice.cgi" - Perl CGI-Web-Skript zum Generieren eines zufallsbedingten Wrfelwurfs.
# -------------------------------------------------------------
# Copyright  1995, Alicia da Conceicao.
# Dieses Programm ist Freeware und kann von jedermann so lange frei genutzt,
# vertrieben und modifiziert werden, wie diese Nachricht vollstndig im Quellcode
# erscheint und kein Profit aus dem Programm gezogen wird. Jeder andere
# Verwendungszweck bedarf der schriftlichen Genehmigung der Autorin.
##########################################################

#********** DEKLARIERE GLOBALE VARIABLEN

# "$hostName"     Ist der Internet Host-Name (oder IP-Nummer) des
#                 Host-Computers, auf dem sich das CGI-Skript
#                 befindet. ndern Sie ihn in Ihren Host-Namen um.

# "$scriptDir"    Wie von HTTP spezifiziert, ist dies das Verzeichnis
#                 in dem sich dieses CGI-Skript befindet. ndern Sie
#                 es Ihrem Verzeichnis entsprechend.

# "$scriptName"   Wie von HTTP spezifiziert, ist dies der Name dieses 
#                 CGI-Skripts.

# "$scriptTitle"  Wird als Titel und berschrift fr die HTML-Ausgabe des 
#                 Skripts verwendet.

# "@DIE"          Ist ein Array, das die mglichen Ergebnisse
#                 eines einzigen Wrfelwurfs enthlt. Beachten Sie, 
#                 da der erste Wert des Arrays einen Array-
#                 Index von 0 hat, der zweite einen Array-Index 
#                 von 1, ... und der letzte einen Array-Index von 
#                 $#DIE hat (in diesem Fall 5).

# "($#DIE + 1)"   Anzahl der Elemente im Array "@DIE", die in diesem Fall 6 sind.

# "$numDice"      Ist die Anzahl der in diesem Wurf verwendeten
#                 Wrfel. Sie drfen diese Zahl ndern, aber denken 
#                 Sie daran, da die Zahl der mglichen Zufallswerte 
#                 exponential zur Anzahl der Wrfel steigt. Daher 
#                 sollten Sie kleine Werte verwenden - oder Sie
#                 riskieren eine berlastung des Unterprogramms "randomValue".

# "$numValues"    Ist die Anzahl der mglichen Zufallswerte. Sie
#                 wird automatisch berechnet, daher ndern Sie sie 
#                 nicht. Ihr Wert ist die Anzahl der Elmente des
#                 Arrays "@DIE", potenziert mit "$numDice".

# "$num"          Ist die zufallsbeding erzeugte Zahl zwischen 0 und
#                 ($numValues - 1).

# "$toss"         Ist das Ergebnis des Wrfelwurfs.

$hostName = "ihr.host.name";
$scriptDir = "/ihr/verzeichnis";
$scriptName = $hostName.$scriptDir."/randdice.cgi";
$scriptTitle = "Zufalls-Wrfel";
@DIE = ("[1]", "[2]", "[3]", "[4]", "[5]", "[6]");

$numDice = 2;   # Diesen Wert knnen Sie auf andere kleine Werte ndern.
$numValues = ($#DIE + 1) ** $numDice;
$num;
$toss;

# *********** ANFANG HAUPTPROGRAMM

&randomDice ();   # Rufe das Unterprogramm "randomDice" auf

# ***** Hier ist das Ausgabe-Ergebnis an HTML

print STDOUT "Content-type: text/html\n\n",
      "<html><head><title>", $scriptTitle, "</title></head><body>\n",
      "<h1>", $scriptTitle, "</h1>\n",
      "<p>Hier ist ein zufallsbedingter Wrfelwurf: <b>", $toss, "</b>.</p>\n",
      "<form method=\"post\" action=\"http://", $scriptName, "\">\n",
      "<input type=\"hidden\" name=\"uniqueindex\" value=\"", time, "-", $$,
      "\">\n",
      "<P><input type=\"submit\" value=\"Ein weiterer\"> Wrfelwurf?</p>\n",

      "</form></body></html>\n";

#############################################################
# Beachten: Das Ergebnis des Skripts ist eine Ausgabe als HTML,
# insbesondere fr ein Form, das dem Skript erlaubt sich selbst 
# aufzurufen. Die Form enthlt einen versteckten Wert "uniqueIndex". 
# Der verwendete Wert besteht aus der Anzahl der Sekunden, die seit 
# dem Jahr 1970 verstrichen sind, denen die aktuelle Prozess-
# ID-Nummer ("$$") angehngt wurde. Diese Methode gewhrleistet, da 
# jedes Ausfhren dieses Skripts immer einen einzigartigen Wert haben 
# wird. Die Verwendung dieses einzigartigen Wertes fr eine Variable 
# in einem Form wird das Zwischenspeichern vermeiden und das nchste 
# Ausfhren des Skripts erzwingen.
#############################################################

# ********** ANFANG DER UNTERPROGRAMME:

#############################################################
# Beachte: Das Unterprogramm "randomValues" generiert eine zufallsbedingte
# Zahl und weist sie "$num" zu. Die Anzahl der Sekunden, die seit dem Jahr
# 1970 verstrichen sind und die aktuelle Prozess-ID-Nummer ("$$") wurden als
# Basis fr den Pseudo-Zahlen-Zufallsgenerator verwendet.
#############################################################

sub randomValue
    {
    srand (time + $$);               # den Zahlen-Zufallsgenerator "laden"
    $num = int (rand ($nunValues));  # generiere die Zufallszahl
    return $num;                     # schicke die Zufallszahl zurck
    }

#############################################################
# Beachten: Das Unterprogramm "randomDice" weist das Ergebnis einens
# zufallsbedingten Wrfelwurfs "$toss" zu. Es ruft zuerst das
# Unterprogramm "randomValue" auf, um einen Zufallswert ($num) zwischen 0 
# und ($numValues - 1) zu erzeugen. Diese Nummer kann auf die 
# Basis ($#DIE + 1) konvertiert werden, die in disem Fall 6 ist. Jede 
# Zahl wird dann einem Indexwert fr jeden Wurf entsprechen. 
# Die Variable "$toss" wird mit einem leeren String initialisiert.
# Danach wird jede Basis-Zahl ($#DIE + 1) innerhalb einer
# "for"-Schleife errechnet und die Variable "$toss" wird dem Array-
# Element "@DIE" angehngt, das dieses Zeichen als Array-Index 
# besitzt. Ein Leerzeichen zum Abgrenzen des Wrfels wird ebenfalls 
# angehngt. Das macht es weniger durcheinander und leichter zu
# lesen. Abschlieend wird die Ergebnis-Variable "$toss" zurck-
# geschickt.
#############################################################

sub randomDice
     {
     &randomValue ();    # Rufe das Unterprogramm "randomValue" auf
     $toss = "";         # Inizialisiere "$toss"
     for ($j = 0; $j < $numDice; ++$j)
         { $toss .= " ".$DIE [int ($num / (($#DIE + 1) ** $j)) % ($#DIE + 1)]; }
                         # Berechne die Basis-Zahl ($#DIE + 1) und
                         # hnge "$toss" an das Array-Element 
                         # "@DIE" an, das die Zahl wie der Array-
                         # Index hat.
     return $toss;       # Schicke den Wert von "$toss" zurck
     }

