Zurück Kapitel Weiter


OT/OB-Logo

 

ST-Computer - Digitales Archiv
Objektiv gesehen: OT/OB-Library

Die OT/OB-Lib schafft wichtige Voraussetzungen zum Objektorientierten Programmieren in GFA-BASIC. Erschaffen Sie mit dieser Bibliothek Ihre eigenen Variablen- und Objekttypen!

Beispiel Fußballmanager:
Zuerst definieren Sie einen Fußballspieler mit seinen Eigenschaften, bspw. Spielstärke, Transferwert und Spielergehalt. Jetzt können beliebig viele Spieler mit der OT/OB-Lib im Speicher angelegt werden. Als nächstes definieren Sie eine Mannschaft, bestehend aus 11 solcher Spieler. Auch hier können wieder beliebig viele Mannschaften im Speicher gehalten werden.

Was noch fehlt ist eine kleine Prozedur, die unter Berücksichtigung der Spielerstärken der beteiligten Mannschaften und etwas Zufall das Endergebnis eines Fußballspiels ermittelt. So einfach soll ein Fußballmanager sein?

Die OT/OB-Lib nutzt dabei nicht den Variablenspeicher des GFA-BASIC, sondern fordert dynamisch vom Betriebssystem immer nur in etwa so viel Speicher an, wie gerade benötigt wird.

  • Strukturen zur Typbildung (Klassenbildung)
  • dynamische Speicherverwaltung (nutzt ausschließlich das Betriebssystem-RAM, nicht den GFA-Variablenspeicher)
  • Einfachvererbung
  • ausführliche Dokumentation mit Grundlagen zum Objektorientierten Programmieren, natürlich speziell an GFA-Programmierer gerichtet

Die Programmstruktur wird bei Benutzung dieser Bibliothek sehr übersichtlich. Arbeiten an nachträglichen Änderungen, was bekanntlich zu einem kniffeligen Unterfangen ausufern kann, sind bei solchen Programmen aufgrund der Übersichtlichkeit problemlos möglich.

So einfach sieht ein Programm aus, welches zwei Fußballmanschaften mit je 11 Spielern generiert, und diese mehrmals gegeneinander antreten läßt:


'
' *** Mannschaften anlegen ***
'
fch:
DATA Franz
DATA Bert,Hugo,Sascha
DATA Markus,Frank,Theo,Daniel
DATA Matthias,Andreas,Jürgen
'
bvb:
DATA Teddy
DATA Gerhard,Jan,Christian
DATA Stephan,Bodo,Pascal,Bobby
DATA Patrick,Jonas,Uwe
'
RESTORE fch
LET fch=@verein("FC 08 Homburg",80)
RESTORE bvb
LET bvb=@verein("BVB 09 Borussia Dortmund",40)
'
' *** Spiel austragen ***
'
PRINT "Es spielt: ";@verein_name$(fch);" gegen ";@verein_name$(bvb);"!"
PRINT
PRINT "Die Aufstellungen:"
PRINT
PRINT USING "\........\ Tor Abw Mit Stu   \........\ Tor Abw Mit Stu"[..
..] @verein_name$(fch),@verein_name$(bvb)
'
FOR spieler%=0 TO 10
  '
  LET spieler1=@verein_spieler(fch,spieler%)
  LET tor1&=@fussballspieler_tor(spieler1)
  LET abwehr1&=@fussballspieler_abwehr(spieler1)
  LET mitte1&=@fussballspieler_mitte(spieler1)
  LET sturm1&=@fussballspieler_sturm(spieler1)
  '
  LET spieler2=@verein_spieler(bvb,spieler%)
  LET tor2&=@fussballspieler_tor(spieler2)
  LET abwehr2&=@fussballspieler_abwehr(spieler2)
  LET mitte2&=@fussballspieler_mitte(spieler2)
  LET sturm2&=@fussballspieler_sturm(spieler2)
  '
  PRINT USING "\........\ ### ### ### ###   \........\ ### ### ### ###",[..
  ..] @fussballspieler_name$(spieler1),tor1&,abwehr1&,mitte1&,[..
  ..] sturm1&,@fussballspieler_name$(spieler2),tor2&,abwehr2&,mitte2&,sturm2&
  '
NEXT spieler%
PRINT
'
FOR i%=1 TO 5
  @fussballspiel(fch,bvb,fch_tore&,bvb_tore&)
  PRINT i%;".Spiel: Das Spiel endete ";fch_tore&;":";bvb_tore&;"!"
NEXT i%
'
@verein_free(fch)
@verein_free(bvb)

 

Dies sind Beispielausgaben einer solchen Spielrunde:

Es spielt: FC 08 Homburg gegen BVB 09 Borussia Dortmund!

Die Aufstellungen:

FC 08 Homb Tor Abw Mit Stu   BVB 09 Bor Tor Abw Mit Stu
Franz       71   2   1   0   Teddy       43   4   6   8
Bert         3  70   8   3   Gerhard      4  40   1   4
Hugo         4  70  21  17   Jan          7  37   0  10
Sascha       2  77   3  15   Christian    5  36   0   7
Markus       9  22  72  22   Stephan      5   2  39   5
Frank        7  18  79  24   Bodo         6   9  34   7
Theo         5  24  81   9   Pascal       9   5  32   1
Daniel       6  22  72   4   Bobby        6   3  35   3
Matthias     2  15  14  86   Patrick      1  12   4  31
Andreas      7  18  24  82   Jonas        9   3   1  41
Jürgen       1  21   2  71   Uwe          0   7  11  34

1.Spiel: Das Spiel endete 1:0!
2.Spiel: Das Spiel endete 3:0!
3.Spiel: Das Spiel endete 2:1!
4.Spiel: Das Spiel endete 4:1!
5.Spiel: Das Spiel endete 5:1!

Anmerkung: Die Tatsache, dass der FC 08 Homburg dem BvB 09 in der Simulation so deutlich überlegen scheint, weist nicht etwa auf einen Programmfehler hin. Hier zeigt sich lediglich, dass man als Programmierer weitaus effektivere Möglichkeiten zur Einflußnahme auf den Ausgang eines Spieles hat, als Vereinsfunktionäre, Spieler und Fans eines Bundesligisten zusammen. :-)


Auch die Unterprogramme, die das Spielergebnis ermitteln, besitzen eine sehr einfache Struktur:


'
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

 

Weitere Details zur Verwendung der OT/OB-Lib werden in unserer sehr ausführlichen, gedruckten Dokumentation beschrieben. Die Dokumentation ist bei uns zum Selbstkostenpreis erhältlich.

Man erkennt, dass sich der Programmierer hier wirklich nur noch mit dem Algorithmus beschäftigen mußte, der ein möglichst realistisches, aber dennoch zufälliges Spielergebnis erzeugen sollte. Darüber, wo die Daten über die Spieler und die Vereine abgelegt sind, brauchte er sich keine Gedanken mehr zu machen.


Neu in Version 1.1:

  • Interne Verbesserungen, die insbesondere zur Verkleinerung der Lib beitragen.


Publikationen zur OT/OB-Lib im Web

ATOS Programmierpraxis - Moderne Zeiten
Objektorientiertes Programmieren in GFA-Basic - Teil I
Objektorientiertes Programmieren in GFA-Basic - Teil II
Objektorientiertes Programmieren in GFA-Basic - Teil III


Anfragen per E-Mail an:
herzog@run-software.de



Zurück Kapitel Weiter