Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Frage zu Types und vielen Variablen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.04.2011, 23:16    Titel: Frage zu Types und vielen Variablen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 30.04.2011, 23:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 30.04.2011, 23:55    Titel: Re: Frage zu Types und vielen Variablen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 01.05.2011, 00:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.05.2011, 11:25    Titel: Antworten mit Zitat

Danke an euch alle. Ich habe MOD's Lösung genommen, da mir diese am kürzesten erschienen ist. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 01.05.2011, 12:13    Titel: Antworten mit Zitat

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. durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 01.05.2011, 17:47    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 01.05.2011, 17:59    Titel: Antworten mit Zitat

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. zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.05.2011, 20:49    Titel: Antworten mit Zitat

Das mit den Begrenzungen habe ich schon erledigt. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 14.05.2011, 23:55    Titel: Antworten mit Zitat


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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 15.05.2011, 12:03    Titel: Antworten mit Zitat

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. zwinkern

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. zwinkern
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. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz