Bits haben falsche position

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Matthias

Betreff: Bits haben falsche position

BeitragFr, Dez 01, 2006 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay
Habe mir mal den Pfadfinding vorgeknöpft und mir stört das in nodemap (DimFeld) nur 0 und 1 gespeiechert werden also nur 1Bit aber verbrauchen
tue ich drozdem 32Bits das wolte ich nun eigentlich ändern aber irgendwie
funktioniert das nicht. Vieleicht kann mir jemand helfen.

mit Leertaste Weg Finden
l=Map Laden
s=Map Speichern
Code: [AUSKLAPPEN]

Graphics 800,600,16,2

SetBuffer BackBuffer()
ClsColor 255,255,255


Global startx  =07
Global starty  =14
Global endx    =22
Global endy    =14
Global PfadAnz
Global Ras=20
Global mapwidth=Int(800/Ras):Global mapheight=Int(600/Ras)



Dim map(mapwidth,mapheight)
Dim nodemap(mapwidth,mapheight)


Dim dirx(7)
Dim diry(7)
Dim dirz(7)





For i=0 To 7
  Read dirx(i)
  Read diry(i)
  Read dirz(i)
Next





ClsColor 255,255,255:Cls


MAPAUFB()
ERSTMAP()



Function MAPAUFB()
R=Ras*.5
For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1

Color 230,230,230
Select Map(ZX,ZY):Case 0:Default:Color 0,0,0:End Select
Rect ZX*Ras,ZY*Ras,Ras-1,Ras-1




Next:Next
Select PfadAnz:Case 1
Color 255,0,0
For path.path=Each path

Rect path\node\x*Ras,path\node\y*Ras,Ras-1,Ras-1,1
 NX=path\node\x:NY=path\node\y
nodes3=nodes3+1
  Next
End Select

Color 0,255,0
  Rect startx*Ras,starty*Ras,Ras-1,Ras-1,1

  Color 100,200,255
  Rect endx*Ras,endy*Ras,Ras-1,Ras-1,1


End Function



Function ERSTMAP()
Repeat:Tas$=Chr(GetKey())

MX=Int(MouseX()/Ras):MY=Int(MouseY()/Ras)
Select MouseDown(1):Case 1:Color 0,0,0:Rect MX*Ras,MY*Ras,Ras-1,Ras-1:Map(MX,MY)=1:End Select
Select MouseDown(2):Case 1:Color 230,230,230:Rect MX*Ras,MY*Ras,Ras-1,Ras-1:Map(MX,MY)=0:End Select
Select Tas$:Case "s":SAVEMAP():End Select
Select Tas$:Case "l":LOADMAP():MAPAUFB():
Case "1":StartX=MX:StartY=MY:MAPAUFB()
Case "2":EndX=MX:EndY=MY:MAPAUFB()
Case " ":Zeit=MilliSecs():pathfinding1(startx,starty,endx,endy)

:PfadAnz=1-PfadAnz:MAPAUFB()


End Select
AppTitle nodemap(MX,MY)
Flip
Until KeyDown(1)=1
End
End Function


Function SAVEMAP() 
File=WriteFile("Map.Dat")
For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1
WriteByte(File,Map(ZX,ZY))
Next:Next
CloseFile File
File=WriteFile("StartEnde.ini")
WriteLine(File,StartX)
WriteLine(File,StartY):WriteLine(File,EndX):WriteLine(File,EndY)
CloseFile File



End Function

Function LOADMAP()
File=ReadFile("Map.Dat")
For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1
Map(ZX,ZY)=ReadByte(File)
Next:Next
CloseFile File
File=ReadFile("StartEnde.ini")
StartX=ReadLine(File):StartY=ReadLine(File):EndX=ReadLine(File):EndY=ReadLine(File)
CloseFile File

End Function

Type node
  Field parent.node
  Field cost
  Field x
  Field y
End Type

Type open
  Field node.node
End Type

Type path
  Field node.node
End Type







;---------------------------------------------------------------------

Function pathfinding1(startx,starty,endx,endy)
  Delete Each node
  Delete Each open
  Delete Each path
  Dim nodemap(mapwidth,mapheight)
  If startx=endx And starty=endy Then Return

  node.node=New node
  node\x=startx
  node\y=starty
  open.open=New open
  open\node=node
;"------------------Problemzone----------------"
 Po=Startx/32:Ws=Startx Mod 32
nodemap(Po,starty)=2^Ws
;"-------------------------------------------------"

  .again1

  node=Null
  cost=2147483647
  For open=Each open
    delta=Abs(open\node\x-endx)+Abs(open\node\y-endy)
    If open\node\cost+delta<cost Then
      cost=open\node\cost+delta
      node=open\node
      tempopen.open=open
    EndIf
  Next
  If node=Null Then Return
  Delete tempopen
If KeyDown(200)=1 Then Return

  For i=0 To 7
    x=node\x+dirx(i)
    y=node\y+diry(i)
    If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then

;"------------Problemzone-------------------------------"
 Po=Int(X/32):Ws=X Mod 32   
      If map(x,y)=0 And ((nodemap(Po,y) And 2^Ws)<>0) Then
;"-----------------------------------------------------------"
 
        If dirz(i)=1 Then
       
          If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump1
        EndIf
        tempnode.node=New node
        tempnode\parent=node
        tempnode\cost=node\cost+1
        tempnode\x=x
        tempnode\y=y
        open.open=New open
        open\node=tempnode

;"-------------------------Problemzone-------------
 Po=X/32:Ws=X Mod 32
        nodemap(po,y)=nodemap(po,y)+2^Ws
;"-------------------------------------------------------       

If x=endx And y=endy Then finish=1:Exit
        .jump1
      EndIf
    EndIf
  Next
  If finish=0 Then Goto again1

  While tempnode\parent<>Null
    path.path=New path
    path\node=tempnode
    tempnode=tempnode\parent
  Wend
  path.path=New path
  path\node=tempnode
End Function

FOODy

BeitragFr, Dez 01, 2006 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Meiner Meinung nach ist das alles andere als Sinnig.

Aber naja: https://www.blitzforum.de/foru...hp?t=19901


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

Matthias

BeitragFr, Dez 01, 2006 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Was Ist dan daran unsinnig??? Wenn ich ein DimFeld habe mit 1024x1024auf 32Bit (an 4096x4096 nicht zu denken)

dann sind das ca 4200KB=4,2MB Rammspeicher
aber ich will nicht zahlen bis 32Bit Speichern sondernt nur 1Bit
das sind dann 131KB also 4MB weniger.

Warum gleich mit Kannonen auf Spatzen schießen???

FOODy

BeitragFr, Dez 01, 2006 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil das Zeitintensiv ist jeden Bit einzeln anzusprechen.
Kann man in B3B den keine Byte-Dims erstellen? Confused

Ansonsten machst du "einfach" eine Bank die du mit Bytes fütterst statt ein IntegerDimFeld.



Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

Matthias

BeitragFr, Dez 01, 2006 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja schon da habe ich dan 24Bits schonmal gespart und aber es sind immernoch 7Bits unnütze auserdem dauert das Speichern in einer Bank genauso lange als würde ich gleich das auf 1Bit kürzen. Auserdem mus der Pfad nicht bei jedenm Schleifendurchgang gefunden werden.

Nun Hilf mir dochmal Bitte. Du kannst das doch bestimmt.
Und frage nicht nach sinn und zweck.
Umsomehr Ramspeicher übrig ist um so mehr Palmen oder Fahrzeuge kann ich Benutzen.

Auserdem brauche ich das auch noch für ein Radar map und auch für ein Kampfstärken Map. Da habe ich jetzt schon drei Felder. Glaub mir das ist schon sinvoll.

FOODy

BeitragFr, Dez 01, 2006 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann tu die 3 Felder in ein einziges Feld Very Happy
Ein Byte hat 8 Bits.
Die kannste dann ausnutzen.

Falls du sowas nicht gemacht hast hier ein Beispiel: (nur mit Blitzmax getestet Confused )
Code: [AUSKLAPPEN]
;Framework BRL.StandardIO

Const CONST_SCHALTER_1:Int = %00000001
Const CONST_SCHALTER_2:Int = %00000010
Const CONST_SCHALTER_3:Int = %00000100

Local feld1:Int = CONST_SCHALTER_1|CONST_SCHALTER_3
Local feld2:Int = CONST_SCHALTER_1|CONST_SCHALTER_2
Local feld3:Int = CONST_SCHALTER_2|CONST_SCHALTER_3

Print "feld1(schalter 1): "+(feld1&CONST_SCHALTER_1<>0)
Print "feld1(schalter 2): "+(feld1&CONST_SCHALTER_2<>0)
Print "feld1(schalter 3): "+(feld1&CONST_SCHALTER_3<>0)

Print "feld2(schalter 1): "+(feld2&CONST_SCHALTER_1<>0)
Print "feld2(schalter 2): "+(feld2&CONST_SCHALTER_2<>0)
Print "feld2(schalter 3): "+(feld2&CONST_SCHALTER_3<>0)

Print "feld3(schalter 1): "+(feld3&CONST_SCHALTER_1<>0)
Print "feld3(schalter 2): "+(feld3&CONST_SCHALTER_2<>0)
Print "feld3(schalter 3): "+(feld3&CONST_SCHALTER_3<>0)


Sowas schonma probiert?


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

Matthias

BeitragFr, Dez 01, 2006 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein habe ich noch nicht aber das hilft mir auch nicht wirklich weiter es ist zu Algemein gehalten. Ich weis jetzt nicht wie ich das Beispiel in meinen Code Einsetzen Kann.

Naja vieleicht ist es einfach zu schwierig auch für dich. Aber drozdem nochmal Danke.

FOODy

BeitragFr, Dez 01, 2006 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub du hast mich nicht richtig verstanden Confused
Hier ist noch ein Beispiel:
Code: [AUSKLAPPEN]
;Framework BRL.StandardIO
;Import BRL.Retro

Const NODE_1:Int = %00000001
Const NODE_2:Int = %00000010
Const NODE_3:Int = %00000100
Const NODE_4:Int = %00001000
Const NODE_5:Int = %00010000
Const NODE_6:Int = %00100000
Const NODE_7:Int = %01000000
Const NODE_8:Int = %10000000

Local node:Byte = NODE_1|NODE_5
Print Right(Bin(node),8)

Print "Feld 1 ist auf: "+NodeActive(node,NODE_1)
Print "Feld 2 ist auf: "+NodeActive(node,NODE_2)
Print "Feld 5 ist auf: "+NodeActive(node,NODE_5)

Function NodeActive(node:Byte,id:Int)
   Return (node&id<>0)
EndFunction


Hier kann man 8 Felder in einem Byte speichern. (mit dem Wert 0|1)
Im Prinzip ist es das gleiche wie vorhin, aber vllt sagt dir dieses mehr aus?

Es ist die einzigste Lösung die mir so einfällt.
Weniger als ein Byte kann man nicht an Speicher reservieren.
So oder so, mindestens ein Byte wird gebraucht.

Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group