Zum letzten Type eintrag springen, welche den Wert 1 hat?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

blackmaster

Betreff: Zum letzten Type eintrag springen, welche den Wert 1 hat?

BeitragSo, Aug 10, 2008 9:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
konnte den Titel nicht komplett oben hinschreiben.
Nun meine Frage und zwar, möchte ich gerne zum letzten Type eintrag springen, welche den Wert 1 von einer bestimmten Variable hat.

Ich habe das mal so versucht:
Code: [AUSKLAPPEN]
  'Alle Spieler abfragen und zeichnen
  For Info:Spieler = EachIn Spieler.List
    'Inhalt entfernt...
      'Inhalt entfernt...
        'Inhalt entfernt...

          For Info:Spieler = EachIn Spieler.List
            If SpielerNummer = Info.SpielerNummer Then
              'Wenn dieser Spieler schon verloren hat, dann überspringen
              If Info.SpielerVerloren = 1 Then
                SpielerNummer = SpielerNummer + 1
                If SpielerNummer > MaxSpieler Then SpielerNummer = 1
              EndIf
            EndIf
          Next

        'Inhalt entfernt...
      'Inhalt entfernt...
    'Inhalt entfernt...
  Next


Ich habe die Schleife verschachteln müssen, da es anders nicht geht, deshalb frage ich 2 mal die Type Felder ab.
Ich habe ja viele Code Teile entfernt beim Posten um es besser übersichtlich zu halten.

Zu meinem Problem:
Das mit den Überspringen funktioniert nicht immer gut, wenn der erste Spieler verloren hat und es dann eins Weiter zählt, klappt auch sehr gut, aber sobald SpielerNummer wieder auf 1 ist, überspringt er den Type Feld nicht mehr, obwohl dieser Feld (Info.SpielerVerloren) auf 1 ist.

Kann mein Problem jetzt nicht genauer erklären, liegt vieleicht daran, das es erst Morgends ist Wink

Ich hoffe, das man es trotzdem verstehen kann, wie ich es formuliert habe.

Also, es soll die Type Felder so lange überspringen, wie Info.SpielerVerloren=1 ist.

Für Hilfen wäre ich euch sehr dankbar.

MfG

Jolinah

BeitragSo, Aug 10, 2008 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich weiss nicht ob ich dich richtig verstanden habe, aber du könntest das z.B. auch so machen:

Code: [AUSKLAPPEN]

Function SpielerVerloren:Int(SpielerNummer:Int)
  For Info:Spieler = EachIn Spieler.List
    If Info.SpielerNummer = SpielerNummer Then
      If Info.SpielerVerloren = 1 Then
        Return True
      Else
        Return False
      EndIf
    EndIf
  Next

  'Spieler nicht gefunden.. sollte nicht vorkommen
  Return True
End Function

...

'Generell mal den nächsten Spieler auswählen
Local NaechsterSpieler:Int = AktuellerSpieler + 1

'Wenn die Spielergrenze überschritten wurde,
'den Spieler auf den ersten Spieler setzen
If NaechsterSpieler > MaxSpieler Then
  NaechsterSpieler = 1
EndIf

'Spielerliste sortiert nach Zahlen durchgehen
For i:Int = NaechsterSpieler To Spieler.List.Count()
  If SpielerVerloren(i) Then
    'Wenn der Spieler verloren hat, überspringen
    Continue
  Else
    'Wenn nicht, dann ist dies der nächste Spieler
    NaechsterSpieler = i

    'Schleife abbrechen
    Exit
  EndIf
Next
 

blackmaster

BeitragSo, Aug 10, 2008 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine antwort.

Ich habe nur die Function bei mir eingebaut und lasse eine While Schleife solange durchlaufen, wie SpielerVerloren=1 ist.

While SpielerVerloren(SpielerNummer) = 1
SpielerNummer = SpielerNummer + 1
If SpielerNummer > MaxSpieler Then SpielerNummer = 1
SpielerVerloren(SpielerNummer)
Wend

Ich tu das noch abändern, damit ich keine endlos schleife habe, wenn kein Spieler mehr vorhanden ist.

Funktioniert einwandfrei.

Und vielen Dank für deine Hilfe.

MfG

kog

BeitragSo, Aug 10, 2008 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst zum letzen Type Springen der den Wert 1 hat oder?
Die Ganze Liste durchgehen finde ich bisschen viel, wieso kehrst du die Liste nicht einfach um (Reverse), damit hast du den letzen eintrag direkt als 1. und er kann sich von hintne nach vorne durcharbeiten.
Vielleicht ist das Resource sparender, hab aber keine Tests gemacht.

D2006

Administrator

BeitragMo, Aug 11, 2008 10:37
Antworten mit Zitat
Benutzer-Profile anzeigen
kog:
Das glaub ich nicht, dass das sparsamer ist. Denn das Reverse wird auch mindestens(!) einmal die Liste komplett durchgehen müssen. Aber man kann ja einfach selbst die Liste von hinten durchgehen. Hab ich schon gemacht, sollte kein Problem sein. Allerdings hab ich hier jetzt keinen Zugriff auf BMax. Glaube aber, man muss dabei mit "TLink"s hantieren. Innerhalb ner Liste kriegt man den TLink zu einem Eintrag (beim ersten Mal den letzten) und mithilfe dieses Links kriegt man den, des vorigen Eintrags, worüber man auch selbst den vorigen kriegt. Und so weiter. Kompliziert zu beschreiben, Umsetzung sollte aber einfach sein. Dann bricht man halt einfach ab, wenn man die erste 1 findet oder die Liste durchgegangen wurde.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Moep

BeitragMo, Aug 11, 2008 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function getLastBlabla:TObj()
   For i=list.Count()-1 To 0 Step -1
      obj=TObj(list.ValueAtIndex(i))
      If obj.variable=1
         Return obj
      EndIf
   Next
   Return Null
Next


müsste das nich auch so gehen?

Weiß jetz nich ob ich das Problem richtig verstanden hab...
Aber wenn man das letzte Objekt mit einer bestimmten Bedingung aus einer Liste haben will dürfte das so funktionieren..

mfg
Hardstyle Schleichwerbung:
http://www.youtube.com/user/Hackepeter42

Achtung: Suchtgefahr!
moep123.ohost.de

D2006

Administrator

BeitragDi, Aug 12, 2008 8:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte so gehen. Wobei dass dann wirklich etwas uneffizient ist, da ganz stark anzunehmen ist, dass die Methode "ValueAtIndex" jedesmal durch die Liste durchiteriert bist zu der Stelle. Nehmen wir zum Beispiel an, die Liste hat 10 Einträge. Beim ersten Schleifendurchlauf, wird die Liste komplett durchiteriert, also 10 mal. Beim zweiten 9 mal, beim dritten 8 mal usw. usf. Angenommen wir suchen eigentlich den ersten Eintrag, so bewegen wir uns 10+9+8+7+6+5+4+3+2+1 = 55 mal durch die Liste. Mit meiner beschriebenen Methode, bewegen wir uns in dem Fall (=worst case) 10 mal durch die Liste.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Moep

BeitragDi, Aug 12, 2008 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay das hast du natürlich recht , daran hab ich überhaupt nicht gedacht^^

Aber wer weißt wie ValueAtIndex arbeitet? Razz..keine lust jetzt nachzugucken aber vllcht geht er nich durch die ganze Liste..

mfg
Hardstyle Schleichwerbung:
http://www.youtube.com/user/Hackepeter42

Achtung: Suchtgefahr!
moep123.ohost.de

BtbN

BeitragDi, Aug 12, 2008 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Method ValueAtIndex:Object( index )
   Assert index>=0 Else "Object index must be positive"
   Local link:TLink=_head._succ
   While link<>_head
      If Not index Return link._value
      link=link._succ
      index:-1
   Wend
   RuntimeError "List index out of range"
EndMethod


Suchaufwand: 20 sekunden

Moep

BeitragMi, Aug 13, 2008 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay da muss ich mich wohl geschlagen geben^^

Und.... "Suchaufwand 20 Sekunden"... is mir schon klar, dass das schnell geht..das Thema war für mich einfach nur nich so wichtig, dass ich das extra nachgucke.


mfg
Hardstyle Schleichwerbung:
http://www.youtube.com/user/Hackepeter42

Achtung: Suchtgefahr!
moep123.ohost.de

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group