Schwer zu erklären...
Übersicht

Blade90Betreff: Schwer zu erklären... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ![]() Mit freundlichen Grüßen |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du solltest dir definitiv mal Types ansehen Type![]() ![]() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Perfekt, danke euch! Hat mir schon viel weiter geholfen, ich glaub ich schaffs jetzt, wenn ich, melde ich mich! | ||
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ü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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Ana |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 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 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 Thenzu ü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) 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 würde einen Fehler erzeugen, nach dem Löschen ist T2 = null BlitzBasic: [AUSKLAPPEN] For t.typename = Each TypeName 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann Types & Arrays auch kombinieren:
BlitzBasic: [AUSKLAPPEN] Type 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Blade90 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok mit den Stützen versuche ich es nochmal, danke. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group