Das ATOS-Magazin 3/99
ATOS Programmierpraxis
Moderne Zeiten

# Bau des Spielsimulators

Realisiert ist unten nun ein kleiner Simulator. Es handelt sich um ein Operationsobjekt (also um eine Prozedur), dem man die Kennungen der Vereinsspeicherobjekte der sich gegenüberstehenden Fußballmannschaften übergibt, und von dem man das Spielergebnis zurückerhält.

Und in der Tat gibt es dazu nun wirklich nicht mehr viel zu sagen, denn der Quelltext liest sich fast besser als deutsche Sätze.

Zuerst werden über die Spielerstärken die Stärken von Torwart, Abwehr, Mittelfeld und Sturm jeder Mannschaft abgeschätzt. Anschließend wird daraus für Heim- und Gastmannschaft die "Torgefährlichkeit" errechnet. Darin ein fließt jeweils der eigene Sturm, der sich gegen die gegnerische Abwehr und den gegnerischen Torwart behaupten muß, sowie die beiden sich gegenüberstehenden Mittelfeldmannschaften. Aus der Summe der beiden Torgefährlichkeiten errechnet sich die Anzahl der Torchancen, die es in diesem Spiel geben wird.

Bevor dann abschließend der Zufallsgenerator nach der tatsächlichen Toranzahl befragt wird, erhalten beide Mannschaften noch einen Glücksbonus von 1000 auf ihre Torgefährlichkeit, denn im Fußball zählt bekanntlich nicht immer nur die Leistung. Dadurch werden die Mannschaften sozusagen etwas angeglichen. Hier könnte man der Heimmannschaft auch einen Heimvorteil verschaffen, oder dem DFB-Außenseiter etwas mehr Adrinalin. Der Zufallsgenerator gibt dann am Ende jeder Mannschaft die Gelegenheit, ihren Anteil an den Torcancen im Spiel auch zu verwerten -- oder eben nicht.

    '
    ' OP: fussballspiel
    PROCEDURE fussballspiel(heim#,gast#,VAR heim_tore&,gast_tore&)  !call
      '
      ' Diese Prozedur läßt zwei Mannschaften gegeneinander antreten.
      ' Sie liefert das Endergebnis des Spieles zurück.
      '
      LOCAL heim_tor&,heim_abwehr&,heim_mitte&,heim_sturm&
      LOCAL gast_tor&,gast_abwehr&,gast_mitte&,gast_sturm&
      LOCAL heim&,gast&,max_tore&
      '
      ' *** Mannschaftsstärken ermitteln ***
      '
      @fussballspiel_ermittele_staerke(heim#,heim_tor&,heim_abwehr&,
                                            heim_mitte&,heim_sturm&)
      @fussballspiel_ermittele_staerke(gast#,gast_tor&,gast_abwehr&,
                                            gast_mitte&,gast_sturm&)
      '
      LET heim&=ROUND(2*heim_sturm&-(gast_abwehr&+gast_tor&)+
                                            (heim_mitte&-gast_mitte&))
      LET gast&=ROUND(2*gast_sturm&-(heim_abwehr&+heim_tor&)+
                                            (gast_mitte&-heim_mitte&))
      '
      LET max_tore&=(ABS(heim&)+ABS(gast&))\100
      '
      ADD heim&,1000
      ADD gast&,1000
      '
      LET heim_tore&=RANDOM(ROUND(max_tore&*heim&/(heim&+gast&+1)))
      LET gast_tore&=RANDOM(ROUND(max_tore&*gast&/(heim&+gast&+1)))
      '
    RETURN
    PROCEDURE fussballspiel_ermittele_staerke(verein#,VAR tor&,
                                            abwehr&,mitte&,sturm&)
      '
      LET tor&=@fussballspieler_tor(@verein_spieler(verein#,0))
      '
      CLR abwehr&,mitte&,sturm&
      '
      FOR spieler%=1 TO 3
        ADD abwehr&,@fussballspieler_abwehr(@verein_spieler(verein#,
                                            spieler%))
        ADD mitte&,@fussballspieler_mitte(@verein_spieler(verein#,
                                            spieler%))\2
        ADD sturm&,@fussballspieler_sturm(@verein_spieler(verein#,
                                            spieler%))\4
      NEXT spieler%
      '
      FOR spieler%=4 TO 7
        ADD abwehr&,@fussballspieler_abwehr(@verein_spieler(verein#,
                                            spieler%))\2
        ADD mitte&,@fussballspieler_mitte(@verein_spieler(verein#,
                                            spieler%))
        ADD sturm&,@fussballspieler_sturm(@verein_spieler(verein#,
                                            spieler%))\2
      NEXT spieler%
      '
      FOR spieler%=8 TO 10
        ADD abwehr&,@fussballspieler_abwehr(@verein_spieler(verein#,
                                            spieler%))\4
        ADD mitte&,@fussballspieler_mitte(@verein_spieler(verein#,
                                            spieler%))\2
        ADD sturm&,@fussballspieler_sturm(@verein_spieler(verein#,
                                            spieler%))
      NEXT spieler%
      '
    RETURN

Die Ermittelung der Stärke von Abwehr, Mittelfeld und Sturm richtet nach den Spielerpositionen. So zählt auch ein im Sturm auftgestellter Spieler als Verstärkung in der Abwehr, aber nur mit einem Viertel seiner Abwehrqualitäten, da er sich die meiste Zeit ja nicht dort aufhält. Im Mittelfeld zählt er immerhin noch mit der Häfte seiner Mittelfeldqualitäten, wohingegen er im Sturm natürlich mit seiner voller Stürmerstärke dabei ist.

Sie sehen, daß zur Erklärung dieser Prozeduren kein einziges Wort über irgendwelche Arrays mit Spielerstärken, über wilde Speicherstrukturen, gar über Dateien oder Internetverbindungen verloren werden mußte. Hier sind wir wirklich beim Wesentlichen, denn die Zugriffe auf Objektattribute geschehen über ganz anschauliche und recht intuitive Funktionsaufrufe -- und das ist ein wirklicher Verdienst der zuvor gemachten Mühen.

Endlich spielen