Schwer zu erklären...

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Blade90

Betreff: Schwer zu erklären...

BeitragFr, Apr 29, 2011 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie der Threadname schon sagt, ist mein Problem nicht ganz einfach zu erklären. Ich versuche es daher mal kompliziert, in der Hoffnung jemand versteht meine Problematik:

Ich programmiere im Moment an einem simplen Fußballmanager. Jedoch komme ich an einem Punkt seit Tagen nicht weiter: Ich habe mehrere Spieler mit verschiedenen Fähigkeitswerten ausgestattet (Passen1 = 3; Passen2 = 5, Passen1 ist also die Passfähigkeit von Spieler 1, Passen2 von Spieler 2 etc.). Am Ende wird mithilfe dieser Fähigkeitswerte sowie den Positionen der Spieler mit einer Formel ein Ergebnis errechnet. Das Problem für mich ist, dass ich diese Werte flexibel auf die Positionen verschieben können muss. Wenn ich es kompliziert machen könnte, würde es etwa so aussehen:

STURMPOSITION1 = Schuss1+Passen1+... (1 weil Spieler 1)
STURMPOSITION2 = Schuss2+Passen2+... (Spieler 2)
...

Allerdings müsste ich dann, sobald ein Spieler eine andere Position einnimmt, jedes Mal das in die Formel neu eintragen:

STURMPOSITION1 = Schuss3+Passen3+... (Spieler 3, also anderer Spieler)

Ich möchte jedoch, dass ich einfach nur noch etwas schreibe wie:

STURMPOSITION1 = Spieler3

und Blitz dann automatisch berechnet, weil es weiß, was Spieler3 für Fähigkeiten hat. Die Frage ist nur: Wie ordne ich dem Namen Spieler3 diese Werte zu? Oder denke ich völlig verkehrt? Das mag sich nach einem Luxusproblem anhören, doch wenn man mal ein paar hundert Spieler und ein paar Dutzend Positionen zu vergeben hat, wird die Sache sehr unübersichtlich und zeitaufwendig. Die Beschreibung sowie das Problem zeigt euch mit Sicherheit schon, auf welch niedrigem Niveau ich mich noch befinde, aber hey Surprised deshalb bin ich ja im Beginner Forum Cool . Ich hoffe die Frage war einigermaßen verständlich und ihr könnt mir helfen.


Mit freundlichen Grüßen

Xeres

Moderator

BeitragFr, Apr 29, 2011 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest dir definitiv mal Types ansehen Type oder zumindest Arrays Dim. Mit "normalen" Variablen kann man kein Spiel ordentlich durch strukturieren (wie du ja grad feststellst).
Such nach Tutorials im Forum und schau dir die Möglichkeiten an, dann siehst du hoffentlich eine passable Lösungsmöglichkeit - ansonsten nochmal nachfragen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragFr, Apr 29, 2011 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blade,

du möchtest also dynamisch programmieren, in BB nutzt man dazu die Types. Am besten liest du dir in der Hilfe mal durch was es über die zu wissen gibt. Aber von mir erstmal soviel:

Types werden während das Programm läuft erzeugt und haben Felder mit Eigenschaften. Sie werden alle in einer Reihe oder Liste gespeichert, du kannst sie nicht dirket mit dem Namen ansprechen, da sie von dir keinen Namen zu gewiesen bekommen haben. Hier mal ein Anwendungsbeispiel für deinen Fall:

BlitzBasic: [AUSKLAPPEN]
Type Spieler ;Name des Types, hier bestimmen wir seinen Bauplan, also aus was so ein Type bestehen soll
Field x,y ;Die Positionen die Spielers auf dem Bildschirm
Field Feldposition.Position ; hier kannst du die Position abspeichern wie Sturm oder so, die auch als Types gespeichert sind, deshalb das .position
Field pass,flanken,haste_nicht_gesehen ; ich versteh nicht so viel von Fußball :oops:
Field ID ;meistens sinnvoll eine eindeutige nummer an einen type zu vergeben
End Type ;Ende des "Bauplans"

;Du kannst sie auch als Funktionsrückgabe oder Funktionsparameter benutzen

Function SetPosition(s.Spieler); Die funktion bekommt also einen spieler übergeben
Return s\flanken + s\pass + s\haste_nicht_gesehen ; Wenn du auf ein Feld zugreifen willst, dann nutz du den variablen namen in unserem fall s und dann \ und dann den namen des feldes des types
End Function

Function CheckallSpieler()
For s.spieler = Each spieler ;hier wird s = jedem vorhandenen Spieler gesetzt und dann kannst du mit s machen was du willst, wenn du einen bestimmten suchst kannst du es mit if und der id machen
Sturm = Setposition(s)
Next
End Function



Hoffe du verstehst ein bisschen was ich meine. Types sind enorm nützlich und es lohnt sich, sich damit zu beschäftigen, letztendlich wirst du vermutlich irgendwann nahezu alles in types machen.

Liebe Grüße

Diana
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Blade90

BeitragFr, Apr 29, 2011 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Perfekt, danke euch! Hat mir schon viel weiter geholfen, ich glaub ich schaffs jetzt, wenn ich, melde ich mich!

Ana

BeitragFr, Apr 29, 2011 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr gut, viel Spass =)
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Blade90

BeitragDo, Mai 05, 2011 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich habe jetzt ein bisschen über Types und Dims gelesen, doch leider komme ich immer noch nicht weiter. Auch dein Script Beispiel sieht sehr schön aus, doch trotz längerem Überlegen bin ich noch nicht auf die Lösung gekommen. Ich glaube mir fehlt einfach das logische Denken für solch einfache Befehle. Ich hab zwar verstanden, dass man mit Type und den dazugehörigen Fields einem Spieler Eigenschaften zuweisen kann, doch wie ich dass nun in meine Formel einbaue: Keine Ahnung...

Xeres

Moderator

BeitragDo, Mai 05, 2011 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Überlege dir was du hast und was du brauchst: Welche Objekte gibt es, welche Eigenschaften haben diese? Nimm ggf. Stift & Papier und sortiere alles. Schreibe in Pseudo-Code, was wann vom Programm gemacht werden muss.
Ohne irgendeine Struktur kann man dir dazu schlecht was sagen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragDo, Mai 05, 2011 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
So richtig kann ich dir leider nicht weiterhelfen da mir nicht ganz klar ist woran es scheitert, aber ich versuch mal ein paar allgemeine Dinge.

Zu ersteinmal Types werden dynamisch in während der Laufzeit erstellt und können je nach bedarf in beliebiger Anzahl erstellt und gelöscht werden.

Erstellt wird ein Type mit
BlitzBasic: [AUSKLAPPEN]
t.typename = New typename


wobei unsere Variable die den Type beinhaltet nun t ist und der typname typename ist.

Bevor wir jedoch einen Type erstellen können, müssen wir festlegen welche Attribute er haben soll. Diese Attribute können elementare Sachen wie Int,float,char oder String (jaaa ich weiß der ist nicht elementar aber im Grunde spielt das hier keine Rolle), aber auch andere oder der selbe Type sein. Die Syntax dazu sieht wie folgt aus:
BlitzBasic: [AUSKLAPPEN]
Type TypeName
Field x,y
Field image
Field Name$
Field P.Position
End Type


wir öffnen also die Deklaration mit Type und schließen sie mit End Type, jedes Attribute leiten wir Field ein oder schreiben es hinter eines und trennen es mit einem Kommar.
Wenn wir ein Feld haben wollen, das einen anderen Type (genauer die Adresse eines anderen Types) haben wollen, dann müssen wir Variablen.Typname verwenden.

Wie kommen wir nun an einen Type? Den einzelnen Type können wir nicht einfach direkt ansprechen, da er in keiner uns bekannten Variable ist. Dafür gibt es den Befehl each. Zusammen mit einer For schleife können wir einer Variable nach einander die Adressen unserer Types zu weisen, und somit jede einzelnt ansprechen über ein und den selben Variablenname. Das sieht dann so aus:

BlitzBasic: [AUSKLAPPEN]
For t.typename = Each typename
Print t\name
Next


Nun wird t nacheinander jeder Type des Typen TypeName und unser Code wird uns die namen aller types ausgeben.

Wir können Types aber auch direkt in Variablen speichern, was wir im grunde auch kurzzeitig in der For - Each - Schleife gemacht haben. Aber hier um es nochmal zu verdeutlichen.

BlitzBasic: [AUSKLAPPEN]
Global t2.typname = New Typname


T2 kann nun wie eine Variable verwendet werden. Oben hab ich es schon klammheimlich verwendet die \ Notation, Java, C++, Bmax und bestimmt noch ca 100 andere nehmen hier . statt \ aber gut, sei bb sein Individualstreben mal verziehen.
Mit Variablenname\Typefeldname können wir auf die mit Field erstellten Attribute zugreifen, das geht auch mehr fach

BlitzBasic: [AUSKLAPPEN]
Print "Der Name des Types ist " + t2\name + "und er ist mit dem Type Position den wir nicht kennen " + t2\p\name + " verbunden"


Hier kann allerdings eine große Gefahr der Types auftretten, sie können gleich Null sein. Wobei hier 0 und Null nicht das selbe sind. Null ist eine besondere Stelle in deinem Speicher auf den Alle Typevariablen zeigen, die keinen Type zugewiesen bekommen haben, 0 ist halt der Wert null.

BlitzBasic: [AUSKLAPPEN]
T2 = Null
Print t2\name


wird einen Fehler erzeugen, Null hat halt einfach kein Field Name, es hat überhaupt nichts. Das ist wie durch 0 Teilen oder so, jedenfalls rastet dein Computer dann aus, hat keine lust mehr und das programm wird zwangsweise mit einer Fehlermeldung beendet, deshalb empfiehlt es sich immer wenn du es nicht garantiert weißt mit
BlitzBasic: [AUSKLAPPEN]
If t2 <> Null Then 
zu überprüfen ob es wirklich einen Type gibt.

Types können wie andere Variablen auch in Funktionsparametern und Rückgabewerten auftauchen.

BlitzBasic: [AUSKLAPPEN]
Function Move.Typename(t.typename)
t\x = t\x + 1
Return t
End Function


Der Funktionsname ist Move das .typname gibt an das nicht wie sonst standartmäßig ein Intwert zurückgegeben wird, sondern ein Type der Typen TypeName. In den Parametern gibt das t.typname an, das wir einen Typen von der Art TypeName übergeben. In der Funktion kann dieser über t angesprochen werden und mit der \ Notation können wir seine Werte verändern. Anders als bei (localen) Variablen, ist der Type quasi Global und die Veränderung bleibt auch außerhalb der Funktion erhalten.

Zu guter Letzt noch das Löschen eines Types, das geht einfach mit
BlitzBasic: [AUSKLAPPEN]
Delete Variablenname


Allerdings musst du sicher gehen das Variablenname dann später nicht mehr benutzt wird, zumindest nicht, bis es einen neuen Wert bekommt.

BlitzBasic: [AUSKLAPPEN]
Delete T2
t2\name = "Ich bin gelöscht!"


würde einen Fehler erzeugen, nach dem Löschen ist T2 = null

BlitzBasic: [AUSKLAPPEN]
For t.typename = Each TypeName
If t\name = "Ich will gelöscht werden" Then Delete t
Next


würde gehen, da t einen neuen Wert bekommt bevor irgendetwas nach dem delete damit gemacht wird

hoffe ich konnte dir helfen,
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Sir Gauss der III

BeitragDo, Mai 05, 2011 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Types sind sicher sehr hilfreich, und in eingen Fällen wohl auch dem Dim - Befehl vor zu ziehen.

Der einfachheitshalber solltest du dich aber zu beginn wohl mehr mit dem Dim - Befehl beschäftigen. Er ist leichter zu handhaben und wohl auch einfacher nach zu vollziehen.

Der Dim-Befehl ermöglicht es, eine Variable durchnummeriern zu können. im Grunde ist dimm nichts anderes als eine Zusammenfassung.

Anstatt:
Code: [AUSKLAPPEN]
Global spieler1
Global spieler2
Global spieler3
...
Global spieler100


ist es mit dim möglich:
Code: [AUSKLAPPEN]
Dim Spieler(100)


mit einer Zeile wurden nun 100 Variablen mit name "Spieler" festgelegt. auf die Variablen kannst du nun zugreifen wenn du den Variablennamen und die entsprechende Nummer ausbibst:
Code: [AUSKLAPPEN]
position=Spieler(1)


Der vorteil von Dim ist es, dass dass die entsprechende Variablennummer auch durch eine weitere Variable aufgerufen werden kann. bei Spieler1, Spieler2, Spieler3 ... ist das nicht möglich.
Code: [AUSKLAPPEN]
Dim Spieler(100)

Repeat
   n=n+1
   Spieler(n)=1
Until n=20


mit diesen wenigen Zeilen werden nun 20 Spieler mit Wert 1 belegt. Wenn du nun einem Spieler (wie bei Typen) weitere Eigenschaften (z.B. Ort) mitgeben möchtest, erstellst du einfach ein neues Dim feld, und bei der selben Nummer hat es dann die Entsprechende Eigenschaft des Spielers:

Code: [AUSKLAPPEN]
Dim Spieler(100)
Dim pos_x(100)
Dim pos_y(100)

Repeat
   n=n+1
   Spieler(n)=1
   pos_x(n)=n+1
   pos_y(n)=n+1
Until n=20


nun haben die 20 Spieler je eine x und y Position.


Der Nachteil bei Dim ist, dass du zu beginn festlegen musst, wie viele Felder die Variable besitzt. und zum löschen sollte jede Eigenschaft auf 0 gesetzt werden.
Wobei, wie gesagt, Dim-Felder sich wie jede andere Variable verhalten und genutzt werden, nur eben dass die Zahl hinter der Variable durch eine weitere durchgezählt werden kann.

Xeres

Moderator

BeitragDo, Mai 05, 2011 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann Types & Arrays auch kombinieren:
BlitzBasic: [AUSKLAPPEN]
Type TSpieler
Field ;[...]
End Type

Dim Spieler.TSpieler(3)

Spieler(0) = New TSpieler

;[...]

Alle möglichen Syntaktischen Varianten auf zu zählen wird aber kaum hilfreich oder nötig sein, solange nicht klar ist, was denn überhaupt das Ziel sein soll.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Blade90

BeitragDo, Mai 05, 2011 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok mit den Stützen versuche ich es nochmal, danke.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group