Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.04.2011, 23:16 Titel: Frage zu Types und vielen Variablen |
|
|
Hi
Ich bin bei meinem Spiel X-tfb gerade bei dem Punkt angelangt, bei dem ich den Frachtraum der Raumschiffe realisieren möchte. Wie mache ich das allerdings? Ich habe ein UDT für meine Raumschiffe, aber ich kann ja nicht in dem UDT die Anzahl jeder Fracht einzeln definieren? Dann bräuchte ich ja ca. 100 Variablen in dem UDT, für jede verschiedene Ware eine ...
Wie stelle ich dies also am besten an? |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 30.04.2011, 23:44 Titel: |
|
|
Du definierst am Besten ein zweites UDT für die Fracht und entscheidest dann (pro Schiffstyp) wie viel Fracht geladen werden kann. Da kannst du Begrenzungen einbauen wie du möchtest.
Die Güter selbst definierst du dann als ID innerhalb eines Enum.
Ein Beispiel für die Vorgehensweise:
Code: | #Define max_fracht_stacks 16 'maximale anzahl an gütern in einem frachtraum
Enum
weltraumbutter
spacebrot
kosmoscola
End Enum
Type fracht
id As Integer
menge As Integer
End Type
Type schiff
'...
schiffsfracht(max_fracht_stacks) As fracht
End Type
Dim weltraumkreuzer As schiff
weltraumkreuzer.schiffsfracht(0).id = weltraumbutter
weltraumkreuzer.schiffsfracht(0).menge = 5
Select Case weltraumkreuzer.schiffsfracht(0).id
Case weltraumbutter
Print "Das Schiff hat " & weltraumkreuzer.schiffsfracht(0).menge & " Einheiten Weltraumbutter geladen."
Case spacebrot
Print "Das Schiff hat " & weltraumkreuzer.schiffsfracht(0).menge & " Einheiten Spacebrot geladen."
Case kosmoscola
Print "Das Schiff hat " & weltraumkreuzer.schiffsfracht(0).menge & " Einheiten Kosmoscola geladen."
Case Else
Print "Das Schiff hat illegale Gueter unbekannter Art geladen."
End Select
Sleep
|
|
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 30.04.2011, 23:55 Titel: Re: Frage zu Types und vielen Variablen |
|
|
Hallo!
Westbeam hat Folgendes geschrieben: | Dann bräuchte ich ja ca. 100 Variablen in dem UDT, für jede verschiedene Ware eine ... |
Zur Speicherung beliebig vieler "Frachtgüter" zugehörig zu einer Raumschiff-UDT-Variablen wäre eine verkettete Liste sehr geeignet.
Die Knoten der Liste könnten Attribute enthalten, die die Frachtartikel beschreiben (Frachttyp, Gewicht, Anzahl, ...). Lediglich die Wurzel der Liste (Pointer auf das erste Element) müsste als UDT-Mitglieds-Variable im Raumschiff-UDT gespeichert werden. Wäre die Wurzel-Variable =0, hieße das, dass der Laderaum leer ist.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 01.05.2011, 00:44 Titel: |
|
|
Mein Beispiel mit FrachtList.
Die Frachtart werden bei mir in einem Array gespeichrt. die ID ist dann einfach die Position im array und es kann ueber Frachtart(ID) darauf zugegriffen werden.
Dem Frachtraum kann am mit Addfracht(ID,num) frachten zuweisen, returnt wird wie viele frachten hinzugefuegrt wurden. wenn zb 7 hinzugefuegt wurden und 3 returnt wurden, war der Frachtraum fuer die anderen zu klein.
Eine Fracht kann man mit SubFracht(ID,num) aus dem frachtraum nehmen. returnt wird, wie viel wirklich rausgenommen wurde wenn man zb. 7 rausnehmen will aber bloss 3 drinnen sind wird 3 returnt.
mit GetFrachtTypeNum(ID) kan man die anzahl der frachten im frachtraum bekommen.
mit ClearFrachtraum wird die liste zerstoert.
Hier der Code:
Code: | Type FrachtArt
Name As String ''Name
Size As UInteger ''Size, wenn z.b. dieses teil 2 stellen vom frachtraum einnimmt steht hier 2
Kosten As Single ''Kosten
End Type
Dim Shared Frachten(2) As FrachtArt
Frachten(0).Name = "kosmosbutter"
Frachten(0).Size = 1
Frachten(0).Kosten = 5
Frachten(1).Name = "weltraumbrot"
Frachten(1).Size = 3
Frachten(1).Kosten = 3
Frachten(2).Name = "spacecola"
Frachten(2).Size = 2
Frachten(2).Kosten = 9
Type SchiffsFracht
ID As UInteger ''ID = Stelle im Frachten Array
Num As UInteger ''Anzahl
Next As SchiffsFracht Ptr ''Next
End Type
Type SchiffsFrachtraumManager
Size As UInteger ''Size des Frachtraumes
FirstFracht As SchiffsFracht Ptr ''Erste Fracht
Declare Function AddFracht(ByVal As UInteger, ByVal As UInteger) As UInteger ''Fracht hinzufuegen
Declare Function SubFracht(ByVal As UInteger, ByVal As UInteger) As UInteger ''Fracht Ausladen
Declare Function GetFrachtTypeNum(ByVal As UInteger)As UInteger ''Anzahl der Fracht bekommen
Declare Sub ClearFrachtraum() ''List Loeschen
End Type
Function SchiffsFrachtraumManager.AddFracht(ByVal ID As UInteger, ByVal Num As UInteger) As UInteger
If Num = 0 Then Return 0
Dim F As SchiffsFracht Ptr
Dim S As UInteger
Dim RN As UInteger
F = This.FirstFracht
Do Until F = 0
S += F->Num * Frachten(F->ID).Size
F = F->Next
Loop
If S+Num * Frachten(ID).Size > This.Size Then
RN = 0
For i As UInteger = Num-1 To 1 Step -1
If S+i * Frachten(ID).Size <= This.Size Then
RN = i
Exit For
EndIf
Next
If RN = 0 Then Return 0
Else
RN = Num
EndIf
F = This.FirstFracht
Do Until F = 0
If F->ID = ID Then
F->Num += RN
Return RN
EndIf
F = F->Next
Loop
F = Allocate(SizeOf(SchiffsFracht))
F->ID = ID
F->Num = RN
F->Next = This.FirstFracht
This.FirstFracht = F
Return RN
End Function
Function SchiffsFrachtraumManager.SubFracht(ByVal ID As UInteger, ByVal Num As UInteger) As UInteger
Dim F As SchiffsFracht Ptr
Dim L As SchiffsFracht Ptr
F = This.FirstFracht
Do Until F = 0
If F->ID = ID Then
If F->Num < Num Then
Function = F->Num
Else
Function = Num
EndIf
If F->Num <= Num Then
If F = This.FirstFracht Then
This.FirstFracht = F->Next
Else
L->Next = F->Next
EndIf
DeAllocate(F)
Else
F->Num -= Num
EndIf
Exit Function
EndIf
L = F
F = F->Next
Loop
Return 0
End Function
Function SchiffsFrachtraumManager.GetFrachtTypeNum(ByVal ID As UInteger)As UInteger
Dim F As SchiffsFracht Ptr
F = This.FirstFracht
Do Until F = 0
If F->ID = ID Then
Return F->Num
EndIf
F = F->Next
Loop
Return 0
End Function
Sub SchiffsFrachtraumManager.ClearFrachtraum()
Dim F As SchiffsFracht Ptr
Dim D As SchiffsFracht Ptr
F = This.FirstFracht
Do Until F = 0
D = F
F = F->Next
DeAllocate(D)
Loop
This.FirstFracht = 0
End Sub
Type Schiff
SName As String
SType As UInteger
SFrachtraum As SchiffsFrachtraumManager
End Type
Dim weltraumkreuzer As schiff
weltraumkreuzer.SFrachtraum.Size = 20 ''Frachtraum auf 20 einheiten setzen
Print weltraumkreuzer.SFrachtraum.AddFracht(0,3) ''Fracht hinzufuegen
Print weltraumkreuzer.SFrachtraum.AddFracht(1,5) ''Fracht hinzufuegen
Print weltraumkreuzer.SFrachtraum.AddFracht(2,6) ''Fracht hinzufuegen
Print weltraumkreuzer.SFrachtraum.GetFrachtTypeNum(1) ''Anzahl der Frachten des Types 1
Print weltraumkreuzer.SFrachtraum.SubFracht(0,4) ''Anzahl der Frachten des Types 0 wird um 2 verringert
Print weltraumkreuzer.SFrachtraum.GetFrachtTypeNum(0) ''Anzahl der Frachten des Types 0
weltraumkreuzer.SFrachtraum.ClearFrachtraum()
sleep
|
Ich hoffe das hat geholfen.
Zuletzt bearbeitet von XOR am 01.05.2011, 17:36, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 01.05.2011, 11:25 Titel: |
|
|
Danke an euch alle. Ich habe MOD's Lösung genommen, da mir diese am kürzesten erschienen ist.  |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 01.05.2011, 12:13 Titel: |
|
|
Wie man sieht gibt es da mehrere Möglichkeiten und die lassen sich auch noch kombinieren. Es kommt immer bisschen darauf an, was am Ende erreicht werden soll. Da ein Schiff immer nur eine begrenzte Menge laden kann, denke ich auch, dass eine LinkedList überflüssig ist.
Für den Fall dass du es dann doch brauchen würdest, hat dir XOR ja ein schönes Beispiel erstellt. Allerdings - @XOR - Weltraumbutter, Spacebrot und Kosmoscola sind eingetragene Marken der MOD GmbH und dürfen ohne Lizenz nicht vertrieben werden.  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 01.05.2011, 17:47 Titel: |
|
|
@MOD
da es dir ja so wichtig mit den lizenzen ist habe ich nun mein Weltraumbutter zu Kosmosbutter, Spacebrot zu Weltraumbrot und Kosmoscola zu Spacecola gemacht. Ich hoffe das diese nicht unter einer deiner Lizenzen steht und bitte um entschuldigung diese tollen namen benutzt zu haben.
@Westbeam
Bei MOD's beispiel solltest du schauen das die gesammte guetermenge nicht ueber der Frachtraum groesse liege. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 01.05.2011, 17:59 Titel: |
|
|
Wenn ich mein neues Handy als iFone auf den Markt bringe, würde man mich verklagen, da das aber nur ein Scherz war, hast du nichts zu befürchten.
Ja, bei meinem Beispiel musst du dich um Begrenzungen selbst kümmern. Beispielsweise braucht ein Astronautenfernseher mehr Ladeplatz als ein Raketenbonbon, folglich passt weniger auf das gleiche Schiff. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 01.05.2011, 20:49 Titel: |
|
|
Das mit den Begrenzungen habe ich schon erledigt.  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 14.05.2011, 23:55 Titel: |
|
|
Zitat: | Fracht
42 Energiezellen
43 Kristalle |
Zitat: | Dann bräuchte ich ja ca. 100 Variablen in dem UDT, für jede verschiedene Ware eine |
hier bei disem bild hast du schaetze ich einen frachtraum von 100.
wenn du nicht schon bei schiffsfracht(max_fracht_stacks) As fracht fuer max_fracht_stacks die anzahl an verschiedenen guetern genommen hast, solltest du dir ueberlegen das zu machen, da du ja ca.100 verschiedene Waren hast und in diesem schiff[bild] einen einen ca. 100 fracht grossen frachtraum hast und die frachtraume wohl noch groesser werden und du gleiche Waren zusammenpackst brachst du die max_fracht_stacks nicht ueber maximalen verfuegbaren gueter im spiel zu setzen. so brauchst du auch nicht fuer jeden schiffstype ein eigenes UDT mit dem richtig grossen frachtraum.
Zur anzeige noch was:
beim frachtraum ev. auch groesse und wie viel belegt ist anzeigen.
Und ueberleg dir schon mal wie du es dann spaeter mit frachtraumupdates machen willst, wenn es so was geben wird.
Zur projektilkanone:
braucht man da auch projektile und bei den lasergeschuetzen energie?
und wozu der unterpunkt laser? mach doch lieber energie. von der kann man dann energie fuer laser und extra schubantriebe bekommen.
Mach doch auch mal irgendwo einen Treat auf zu diesem spiel oder sag mir doch mal wo man den findet ich haette noch so ein paar ideen und ev. verbesserungsvorschlaege.
Ich bin auch schon mal gespannt wie das am ende aussehen wird.
Wird das denn open oder closesurce? |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 15.05.2011, 12:03 Titel: |
|
|
XOR hat Folgendes geschrieben: | beim frachtraum ev. auch groesse und wie viel belegt ist anzeigen.
Und ueberleg dir schon mal wie du es dann spaeter mit frachtraumupdates machen willst, wenn es so was geben wird. |
Danke für den Tipp, wird natürlich sofort geändert. Frachtraumupdates wird es geben. Dabei wird die Variable "Ship.cargo" erhöht, welche die maximale Frachtraumkapazität ist.
XOR hat Folgendes geschrieben: | braucht man da auch projektile und bei den lasergeschuetzen energie?
und wozu der unterpunkt laser? mach doch lieber energie. von der kann man dann energie fuer laser und extra schubantriebe bekommen. |
Für die Projektilkanone benötigt man natürlich auch Projektile und für die Laser benötigt man Laserenergie.
Die Laserenergie wird nur für die Laser benötigt. Schubenergie gibt es nicht. Außerdem hat der Unterpunkt "Laser" eine gewisse Tradition bei den X-Spielen.
XOR hat Folgendes geschrieben: | Mach doch auch mal irgendwo einen Treat auf zu diesem spiel oder sag mir doch mal wo man den findet ich haette noch so ein paar ideen und ev. verbesserungsvorschlaege. |
Wurde getan, ich habe ihn eben erstellt. http://forum.qbasic.at/viewtopic.php?p=96063#96063
XOR hat Folgendes geschrieben: | Wird das denn open oder closesurce? |
Sobald das Spiel fertig ist, steht es unter der WTFPL(Do what the fuck you want to Public License) und ist somit natürlich OpenSource.  |
|
Nach oben |
|
 |
|