Fragen zu DefData?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

blackmaster

Betreff: Fragen zu DefData?

BeitragMo, Okt 27, 2008 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich möchte das Spiel TopWords mal nach Programmieren, jetzt habe ich aber ein Problem mit DefData.

Edit: Hier mal ein Screen was für Spiel ich meine:
http://picnic.ciao.com/de/2699878.jpg

Ich habe dazu erstmal ein Array für die Karte erstellt, für die aktuelle Map und dann erstelle ich ein Array für die Steine und weise die Steine die werte von der Karte zu, auf welche Position man den Stein Setzen möchte.

Code: [AUSKLAPPEN]
[code]Global Karte:Int[10,10]
Global Spielstein:Int[10,10,20,5][/code]


und hier die Daten für die Spielsteine:
Code: [AUSKLAPPEN]
#stein_data
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0
DefData 0,0,0,0,0,0,0,0,0,0


das Problem ist, es müssen 4 Parameter für die Daten vorhanden sein, ich weiss jetzt nicht, wie ich diese mit eingeben kann.

Wie würdet ihr das ambesten machen mit der Map und die Spielsteine?

Ich wäre euch sehr dankbar für Tipps und Lösungsvorschläge.

MfG

Xeres

Moderator

BeitragMo, Okt 27, 2008 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenn' das Spiel nicht, darum: Wozu braucht man da die Karte? Liegen da schon Buchstaben verteilt?
Wenn ja würde ein Zufällig initialisiertes Spielfeld einfacher gehen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

blackmaster

BeitragMo, Okt 27, 2008 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir.
Ich versuche ambesten mal ein Scrabble Spiel nach zu Programmieren und möchte wissen, wie ich das Spielfeld über DefData einlese, da ich 3 Parameter im Array habe (x,y,p), das p ist für die Punktzahl für die jeweilige Tiles.

Code: [AUSKLAPPEN]
#map_data
DefData 3,1,1,4,1,1,1,3,1,1,1,4,1,1,3
DefData 1,5,1,1,1,6,1,1,1,6,1,1,1,5,1
DefData 1,1,5,1,1,1,4,1,4,1,1,1,5,1,1
DefData 4,1,1,5,1,1,1,4,1,1,1,5,1,1,4
DefData 1,1,1,1,5,1,1,1,1,1,5,1,1,1,1
DefData 1,6,1,1,1,6,1,1,1,6,1,1,1,6,1
DefData 1,1,4,1,1,1,4,1,4,1,1,1,4,1,1
DefData 3,1,1,4,1,1,1,2,1,1,1,4,1,1,3
DefData 1,1,4,1,1,1,4,1,4,1,1,1,4,1,1
DefData 1,6,1,1,1,6,1,1,1,6,1,1,1,6,1
DefData 1,1,1,1,5,1,1,1,1,1,5,1,1,1,1
DefData 4,1,1,5,1,1,1,4,1,1,1,5,1,1,4
DefData 1,1,5,1,1,1,4,1,4,1,1,1,5,1,1
DefData 1,5,1,1,1,6,1,1,1,6,1,1,1,5,1
DefData 3,1,1,4,1,1,1,3,1,1,1,4,1,1,3


Und wo muss ich die 3te Parameter(p) im DefData eintragen?

Danke schonmal für die Hilfe.

MfG

Xeres

Moderator

BeitragMo, Okt 27, 2008 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Die X/Y Größe vom Spielbrett ist doch statisch, du musst nur den Dritten Parameter einlesen.
Code: [AUSKLAPPEN]
SuperStrict

Local map_x:Int, map_y:Int, p:Int
ReadData map_x, map_y
Local map:Int[map_x, map_y]

For Local x:Int = 0 Until map_x
   For Local y:Int = 0 Until map_y
      ReadData(p)
      map[x, y] = p
   Next
Next

'* Testweise ausgeben:
Print map[0, 0] + " " + map[1, 0] + " " + map[2, 0]
Print map[0, 1] + " " + map[1, 1] + " " + map[2, 1]
Print map[0, 2] + " " + map[1, 2] + " " + map[2, 2]

#map_data
DefData 3,3 '* 3x3 Felder (X und Y größe)
DefData 0,1,0 '* Was auf der Position für ein Zustand sein soll
DefData 1,2,1
DefData 0,1,0


Edit:
Ausführliches Beispiel
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

blackmaster

BeitragDi, Okt 28, 2008 4:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir für das Beispiel.

Was ich noch wissen möchte ist, wie du die Map und Steine erstellen würdest?
Also ich habe das aktuelle Spielfeld in einem Array und die Spielsteine in einem Array.

Ich musss das halt wissen, da ich später bei der Punkte berechnung der gesetzten Steine keine probleme bekomme.

Edit: Oder sollte ich die Spielsteine ambesten mit Types erstellen?
Beispiel:
Code: [AUSKLAPPEN]
Global SteinList:TList = New TList
Type TSpielStein
  Field SteinX:Int
  Field SteinY:Int
  Field SteinXFeld:Int
  Field SteinYFeld:Int
  Field SteinFrames:Int
  Field SteinBuchstabe:String
  Method New()
    SteinList.AddLast(Self)
  End Method
End Type


Ich danke Dir schonmal.

MfG

Xeres

Moderator

BeitragDi, Okt 28, 2008 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja Array und Type kombinieren.
Code: [AUSKLAPPEN]
SuperStrict

Type TSpielStein
   Field Wert:Int
   
   Function Create:TSpielStein(fwert:Int)
      Local s:TSpielStein = New TSpielStein
      s.Wert = fwert
      Return s
   End Function
End Type

Local map_x:Int, map_y:Int, p:Int
ReadData map_x, map_y
Local map:TSpielStein[map_x, map_y]   '*** Die Map enthält Daten vom Typ TSpielStein

For Local x:Int = 0 Until map_x
   For Local y:Int = 0 Until map_y
      ReadData(p)
      map[x, y] = TSpielStein.Create(p)   '** Erstellt einen Spielstein und legt ihn im Array ab.
   Next
Next

'* Testweise ausgeben:
For Local i:Int = 0 Until map_x
   For Local j:Int = 0 Until map_y
      Print map[i, j].Wert
   Next
Next

#map_data
DefData 3,3 '* 3x3 Felder (X und Y größe)
DefData 0,1,0 '* Was auf der Position für ein Zustand sein soll
DefData 1,2,1
DefData 0,1,0

Du erstellst einen Array und ließt aus dem Data-Block die Werte für Wortwerte aus, das Feld für den Buchstaben der dort liegt bleibt Leer bis man dort was ablegt.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

blackmaster

BeitragDi, Okt 28, 2008 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank.

Aber wenn man doch auf 1 Feld ein Buchstaben drauf setzt, wird diese doch dann gelöscht und den Stein dort drauf gesetzt, so kann ich dann nicht mehr prüfen, auf welches Feld der Buchstabe ist, wegen die Farbige Felder, indem man bestimmte Punkte bekommt.

Wenn ich das Array mit Type kombiniere, muss es ja funktionieren.
Sry, ich muss mich da ein bisschen ein arbeiten um Feld mit Type zu kombinieren.

Ich werde erstmal paar Übungen machen, bevor ich los lege.

Vielen Dank für den Beispielcode.

MfG
  • Zuletzt bearbeitet von blackmaster am Mi, Okt 29, 2008 0:07, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragDi, Okt 28, 2008 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst in den Type doch beliebig viele Werte verwenden. Erstmal wird ein "leerer" Spielstein auf jedem Feld erstellt, der nur Informationen für mehrfachen Buchstaben/Wortwert enthält. Wenn man einen Buchstaben legen möchte, bekommt der Spielstein den Wert des Buchstabens.
Du musst nur einmal alle Spielfelder erstellen und einzelne Werte eintragen oder zurück setzen; den Type musst du dann nicht löschen, es sei denn, du willst eine anderes Spielbrett Laden.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

blackmaster

BeitragMi, Okt 29, 2008 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, ich hab das mit den Steinen anders versucht, hier mal der komplette Code:
Code: [AUSKLAPPEN]
SuperStrict
Graphics 1024,768,0

SetMaskColor 255,0,255
Global tile:TImage = LoadAnimImage("img/tile.png",32,32,0,7)
Global steine:TImage = LoadAnimImage("img/steine.png",32,32,0,32)
Global SteinFrames:Int

Type TSpielStein
   Field Wert:Int
   Field Text:String
   Field SteinImFeld:Int
   Field SteinFrames:Int
   
   Function Create:TSpielStein(fwert:Int)
      Local s:TSpielStein = New TSpielStein
      s.Wert = fwert
      Return s
   End Function
End Type

Local map_x:Int, map_y:Int, p:Int
ReadData map_x, map_y
Local map:TSpielStein[map_x, map_y]   '*** Die Map enthält Daten vom Typ TSpielStein

For Local x:Int = 0 Until map_x
   For Local y:Int = 0 Until map_y
      ReadData(p)
      map[x, y] = TSpielStein.Create(p)   '** Erstellt einen Spielstein und legt ihn im Array ab.
      If map[x, y].Wert = 3 Then map[x, y].Text = "DREIFACHER WORT WERT"
      If map[x, y].Wert = 4 Then map[x, y].Text = "DOPPELTER BUCHSTABEN WERT"
      If map[x, y].Wert = 5 Then map[x, y].Text = "DOPPELTER WORT WERT"
      If map[x, y].Wert = 6 Then map[x, y].Text = "DREIFACHER BUCHSTABEN WERT"
   Next
Next

Repeat
  Cls

  '* Testweise ausgeben:
  For Local i:Int = 0 Until map_x
    For Local j:Int = 0 Until map_y
      SetColor 255,255,255
      DrawImage tile,100+i*32,100+j*32,map[i, j].Wert
      'Stein im Feld anzeigen, wenn = 1
      If map[i, j].SteinImFeld = 1 Then DrawImage steine,100+i*32,100+j*32,map[i, j].SteinFrames
      SetColor 0,0,0
      If MouseX() > 100+i*32 And MouseX() < 100+i*32+32 Then
        If MouseY() > 100+j*32 And MouseY() < 100+j*32+32 Then
          SetColor 255,255,255
          DrawText map[i, j].Text,20,20

          If MouseHit(1) And MouseDown(1) Then
            map[i, j].SteinImFeld = 1
            map[i, j].SteinFrames = SteinFrames 'den aktuelle Stein im Spielfeld zuweisen
          EndIf
        EndIf
      EndIf
    Next
  Next

  'Nächster Stein auswählen
  SetColor 255,255,255
  If KeyHit(KEY_LEFT) And KeyDown(KEY_LEFT) Then
    SteinFrames = SteinFrames - 1
    If SteinFrames < 0 Then SteinFrames = 26
  EndIf
  'Verheriger Stein auswählen
  If KeyHit(KEY_RIGHT) And KeyDown(KEY_RIGHT) Then
    SteinFrames = SteinFrames + 1
    If SteinFrames >= 27 Then SteinFrames = 0
  EndIf
  'Stein am Mouseposition zeichnen
  DrawImage steine,MouseX()-16,MouseY()-16,SteinFrames

  Flip
Until KeyHit(KEY_ESCAPE)
End

#map_data
DefData 15,15 '* 15x15 Felder (X und Y größe)
DefData 3,1,1,4,1,1,1,3,1,1,1,4,1,1,3 '* Was auf der Position für ein Zustand sein soll
DefData 1,5,1,1,1,6,1,1,1,6,1,1,1,5,1
DefData 1,1,5,1,1,1,4,1,4,1,1,1,5,1,1
DefData 4,1,1,5,1,1,1,4,1,1,1,5,1,1,4
DefData 1,1,1,1,5,1,1,1,1,1,5,1,1,1,1
DefData 1,6,1,1,1,6,1,1,1,6,1,1,1,6,1
DefData 1,1,4,1,1,1,4,1,4,1,1,1,4,1,1
DefData 3,1,1,4,1,1,1,2,1,1,1,4,1,1,3
DefData 1,1,4,1,1,1,4,1,4,1,1,1,4,1,1
DefData 1,6,1,1,1,6,1,1,1,6,1,1,1,6,1
DefData 1,1,1,1,5,1,1,1,1,1,5,1,1,1,1
DefData 4,1,1,5,1,1,1,4,1,1,1,5,1,1,4
DefData 1,1,5,1,1,1,4,1,4,1,1,1,5,1,1
DefData 1,5,1,1,1,6,1,1,1,6,1,1,1,5,1
DefData 3,1,1,4,1,1,1,3,1,1,1,4,1,1,3


Ich habe die Tiles für die Felder in einem extra Image-Datei und die Steine für die Buchstaben auch.

Könntest Du vieleicht kucken, ob das so richtig ist?
Den rest werde ich schon alleine lösen.

Edit: Ich habe das mal hochgeladen, wenn man den Code so nicht gut lesen kann:
Download (690 kB)

Vielen Dank.

MfG
  • Zuletzt bearbeitet von blackmaster am Mi, Okt 29, 2008 21:59, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMi, Okt 29, 2008 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte nicht behaupten, irgendwas grundfalsches zu sehen. So lang es funktioniert, ist es richtig.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

blackmaster

BeitragMi, Okt 29, 2008 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich dachte man könnte es auch anders machen, wollte halt nur wissen, ob es so sinnvoll ist.

Aber es funktioniert.

Vielen Dank.

MfG

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group