Dim Frage

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

speer

Betreff: Dim Frage

BeitragSo, Dez 06, 2009 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
benötige ein Dim Feld und komme damit irgendwie mit der Erklärung nicht klar.

Als Beispiel:

dim zahl(6,5)

Kann man doch folgendermaßen lesen:

Zeile 0: 0, 1, 2, 3, 4, 5, 6
Zeile 1: 0, 1, 2, 3, 4, 5, 6
Zeile 2: 0, 1, 2, 3, 4, 5, 6
Zeile 3: 0, 1, 2, 3, 4, 5, 6
Zeile 4: 0, 1, 2, 3, 4, 5, 6
Zeile 5: 0, 1, 2, 3, 4, 5, 6

Also kann ich quasi folgendermaßen auf Zeile 5, Spalte 0 darauf zugreifen zahl(0,5) oder?

Xeres

Moderator

BeitragSo, Dez 06, 2009 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, genauso ist es Wink

dim zahl(6,5)
x: 0-6 und y: 0-5
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)
 

speer

BeitragSo, Dez 06, 2009 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke.
Dann ist irgendwas faul in meinem Programm Sad
 

BBPro2

BeitragSo, Dez 06, 2009 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
poste doch mal dein programm, vlt können wir dir dann noch weiter helfen

Dice of Darkness

BeitragMo, Dez 07, 2009 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Xeres: Das stimmt glaub ich nicht ganz. Du hast geschrieben: Für x von 0 bis 6 und für y von 0 bis 5. Ich würde sagen, bei einem 6x5 - Array wäre das entweder: x = 1-6 und y = 1-5 oder: x = 0-5 und y = 0-4.

Kleinigkeit, aber ich wollts nur erwähnen Wink

MfG Dice of Darkness
Gratis Spiele, Musik, Tools

Xeres

Moderator

BeitragMo, Dez 07, 2009 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du dim zahl(5) angibst, bekommst du 6 "Plätze": 0,1,2,3,4,5
beginnend immer bei 0 und endet bei deiner Angabe.
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)

Dice of Darkness

BeitragMo, Dez 07, 2009 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ehrlich? ok, dann nehm ich alles zurück... ich dachte immer, er fängt bei 1 an zu zählen...

naja, in zukunft sollte ich sowas wohl besser erst testen und dann behaupten Embarassed ich hab auch schon ne weile nix mehr programmiert in bb...


mfg Dice
Gratis Spiele, Musik, Tools
 

speer

BeitragMi, Dez 09, 2009 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
finde den Fehler einfach nicht. Es kommt immer ein Array out of Index.

Hier mal den Code:
Code: [AUSKLAPPEN]


; Vier Gewinnt

Global breite = 800
Global hoehe  = 600
Global x1     = 100
Global x11    = 650
Global y1     = 100
Global y11    = 280
Global trenner= 5
Global stein_x= 40
Global stein_y= 40
Global steine = 0
Global win    = 0
Global pos    = 0
Global Player = 1
Global a     = 6
Global b      = 5
Dim spiel(a,b)
Dim hoehe1(b)

Graphics breite, hoehe
SetBuffer BackBuffer()

Cls
zeichneSpielfeld()
Stein(255,0,0,pos)

Repeat
; Hauptschleife


linksrechts() 

Flip


Until KeyHit(1)


Function Stein(FarbeA, FarbeB, FarbeC, xpos)
      ; Farbe des Spielsteines setzen
         Color FarbeA, FarbeB, FarbeC
         
      ; Setze Stein an die Spalte definiert durch xpos
         tempa1 = (x1 * xpos) + x1
         Oval tempa1+8, y1-stein_y, stein_x-10, stein_y-10, 1
         

End Function



Function linksrechts()


      If KeyHit(203)
            
            If pos >= 0
               Stein(0,0,0,pos)
               If pos <> 0 Then pos = pos - 1
                  If Player = 1
                        Stein(255,0,0,pos)
                     Else
                        Stein(0,255,0,pos)
                  EndIf
               
               
            EndIf   
      EndIf
      
      If KeyHit(205)
      
            If pos < 6
               Stein(0,0,0,pos)
                  pos = pos + 1
                  If Player = 1
                        Stein(255,0,0,pos)
                     Else
                        Stein(0,255,0,pos)
                  EndIf
                  

            EndIf
      EndIf
      
      If KeyHit(28)
         temp = 0
         For anzahl = b To 0 Step - 1            
            If spiel(pos,anzahl) = 0 Or spiel(pos,anzahl) = 0 And temp = 0
               temp = 1   
               spiel(pos,anzahl) = Player         
                              
                steinSetzen(pos,anzahl)
               
            EndIf   

         Next
         

      ;For xxx = 0 To a Step +1
      ;   For yyy = 0 To b Step +1
      ;   Print spiel(a,b)
      ;   Next
      ;Next

      End If
      
End Function

Function steinSetzen(xpos,zeile)

         tempa1 = (x1 * xpos) + x1
         ;tempy1 = ((zeile/stein_y)+y11)
         ;tempy1 = y1 * zeile + y11

         
         If Player = 1
          Stein(255,0,0,xpos)
             Player=2
         Else
            Stein(0,255,0,xpos)
            Player=1
         EndIf
         Oval tempa1+trenner, hoehe1(zeile-1)+trenner, stein_x, stein_y, 1
         ;Oval tampa1+trenner, 100, stein_x, stein_y, 1

linksrechts()
End Function



Function zeichneSpielfeld()

   Color 64,64,255
   Rect x1, y1, x11, y11, 1

tempx1 = x1
tempy1 = y1
i = 0
j = 0
   Color 128, 128, 128

      Repeat
         Oval tempx1+trenner, tempy1+trenner, stein_x, stein_y, 1   
         tempx1 = (x1 * i) + x1
         i = i + 1
         steine = steine + 1

         If steine Mod 8 = 0
            tempy1 = tempy1 + trenner + stein_y
            hoehe1(j)=tempy1
            j=j+1
            tempx1 = x1
            i = 0
         EndIf
      Until steine = 48
End Function


Bitte um Nachsicht wegen dem Code. Bin noch Anfänger Smile
Wer meinen Denkfehler findet, bitte keine Lösung posten sondern nur einen Hinweis.
Bin noch am lernen Smile

Speer
 

Lion

BeitragMi, Dez 09, 2009 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
wo kommt der fehler denn bitte? Ich hab den nämlich nicht...
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb
AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x
 

speer

BeitragMi, Dez 09, 2009 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
er kommt wenn ein Stein gesetzt wird (Enter drücken).
Das Problem scheint hier zu liegen:

Code: [AUSKLAPPEN]
For anzahl = b To 0 Step - 1           
            If spiel(pos,anzahl) = 0 Or spiel(pos,anzahl) = 0 And temp = 0
               temp = 1   
               spiel(pos,anzahl) = Player         
                             
                steinSetzen(pos,anzahl)
               
            EndIf

Allerdings tritt der Fehler erst an der obersten Reihe auf.

Tankbuster

BeitragMi, Dez 09, 2009 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir kommt zwar auch ein Fehler, aber in dieser Zeile:

Zitat:
Oval tempa1+trenner, hoehe1(zeile-1)+trenner, stein_x, stein_y, 1

Weil es da hoehe1(zeile-1) nicht gibt. Ist auch klar, denn ganz oben ist zeile-1=-1 und es gibt kein Dimfeld, dass von -1 aus geht.
Twitter
Download Jewel Snake!
Windows|Android

mpmxyz

BeitragMi, Dez 09, 2009 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler ist in Zeile 123:
Code: [AUSKLAPPEN]
   Oval tempa1+trenner, hoehe1(zeile-1)+trenner, stein_x, stein_y, 1

Wenn zeile=0 ist, dann versuchst du, auf das Feld -1 zuzugreifen. -> Fehler

Wenn du doch schon in dem Array "spiel" speicherst, wieso zeichnest du nicht alle Spielsteine mit Hilfe dieser Informationen?

Dann hast du auch kein Problem mit disem Fehler.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

speer

BeitragMi, Dez 09, 2009 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jungs, ihr seit Klasse ! Wink Very Happy

Doch eine Frage noch, wie habt ihr so schnell herausgefunden in welcher Zeile der Fehler auftrat? Bei mir kommt lediglich eine Messagebox mit dem Fehler. Also ohne weitere Hinweise. Habt ihr vielleicht eine spezielle IDE?


Speer Smile

Tankbuster

BeitragMi, Dez 09, 2009 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst in deiner IDE oben auf "Program" und dann auf "Debug Enabled?" klicken Wink
Dann geht der Debugmodus an, und wenn mal ein Mav kommen sollte, ect, zeigt dir der debugger immer die Zeile an.
Natürlich sollte man den Debugger zum kompilieren besser ausschalten...
Twitter
Download Jewel Snake!
Windows|Android

Xeres

Moderator

BeitragMi, Dez 09, 2009 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
spiel(pos,anzahl) = 0 Or spiel(pos,anzahl) = 0
Zwei mal das gleiche...? Das kannst du kürzen.
Und gewöhne dir gleich an Flip(0) und waittimer zu benutzen, siehe -> Hurra, 100 % Auslastung
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)
 

speer

BeitragDo, Dez 10, 2009 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
benötige bei einem Problem nochmals Eure Hilfe bzw. ein Tip.

Habe ein Dim (6,5). Das Spiel heißt vier gewinnt. Nun sollte das Programm überprüfen ob von einem Spieler 4 Stein neben, über oder schräg liegen.
Habe das Dim gewählt weil ich dort die Steine für die Spieler abspeichere. So steht die 0 für ein leeres, die 1 für Spieler 1 und die 2 für Spieler 2 Stein.

Hab jetzt mal über eine verschachtelte for schleife und 4 unschönen if Bedingungen die Steine waagrecht und senkrecht hinbekommen. Grüble nun seit mehreren Stunden darüber und mir fällt einfach nichts ein. Wahrscheinlich liegt auch das Problem daran, dass ich ein Neuling in der Programmierung bin Smile

Gibt es vielleicht einen eleganteren Lösungsweg? Hat mir vielleicht jemand einen Ansatz?

Speer

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 10, 2009 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Grobbeispiel, was du noch an dein Projekt anpassen könntest:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer FrontBuffer()


Local S$="100110110001101011110001011110001010011"

Local C%,V%

For C=1 To Len(S)
   If Mid(S,C,1)="1" Then V=V+1 Else V=0
   If V=>4 Then Print "Es wurden 4 '1'en in Folge gefunden"
Next

WaitKey
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

speer

BeitragDo, Dez 10, 2009 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
komme nicht weiter, entweder kapiere ich es nicht oder ich hab irgendwo einen Denkfehler drin:
Hier mal der Code:

Code: [AUSKLAPPEN]
Function checkStein()

temp1 = 0
zaehler = 0
For i = 0 To b
   For j = 0 To a    
      temp1=spiel(j,i)
;      Print temp1
      If temp1 <> 1 Or temp1 <> 2 Then temp1 = 0 And zaehler = 0
      If temp1 = 1 Then zaehler = temp1 +1
      If temp1 = 2 Then zaehler = temp1 +2
      If zaehler = 4 Then Color 255,0,0: Print "Spieler 1 hat gewonnen"   
                If zaehler = 8 Then Color 0,0,255: Print "Spieler 2 hat gewonnen"   
      j = j + 1   
   Next
   i = i + 1
Next

End Function

Nun sollten die beiden Schleifen durch das DIM (6,5) durchgehen.
In der ersten Schleife setze ich auf y = 0.
Die innere Schleife läuft x ab und startet bei 0. Nach das Ende erreicht ist, erhöht sich y um 1 und startet erneut bei x = 0.
Ist das mit der if Bedingung eigentlich so ok oder könnte/liese sich das auch anders lösen?

Sorry wenn ich nerve aber hab mir dieses vorgehen gestern abend lange überlegt und heute versucht umzusetzen. Leider ohne Erfolg und das würde frustrieren... aber nur ohne Eure Tips Smile
Nochmals ein dickes Danke an alle helfenden Hände Smile

Speer
 

n-Halbleiter

BeitragDo, Dez 10, 2009 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst deine Zählvariable am Ende der For-Next-Schleife nicht erhöhen, das wird automatisch gemacht. Ich wundere mich nur, dass es keinen Fehler gibt, da ja früher oder später die Zählvariablen über die Arraygrenzen hinausgehen. War da irgendetwas zum Thema Debugger?
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)

Midimaster

BeitragDo, Dez 10, 2009 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, das Schöne an 4 gewinnt, ist doch, dass ein neuer Stein nicht die gesamte Spielsituation ändert (wie beim Schach), sondern nur dort ein Gewinnen möglich ist, wo der neue Stein zu liegen kam.

Daher würde ich vorschlagen, ausgehend von dem neuen Stein in 4 Richtung zu suchen:

1.
abnehmendes X bis man zu einem Gegner oder leeren Feld kommen würde, von da aus wieder nach rechts, bis entweder 4 eigene steine oder ein leeres Feld oder ein gegnerstein kommt.

2.
war das erfolglos, dann das gleiche in y-richtung.




3.
dann das Ganze in die diagonale:

Gleichzeitg abnehmendes X und abnehmendes y, bis man zu einem Gegner oder leeren Feld kommen würde, von da aus wieder nach rechts unten, bis entweder 4 eigene steine oder ein leeres Feld oder ein Gegnerstein kommt.

4.
Gleichzeitg abnehmendes X und ZUnehmendes y, bis man zu einem Gegner oder leeren Feld kommen würde, von da aus wieder nach rechts OBEN, bis entweder 4 eigene steine oder ein leeres Feld oder ein Gegnerstein kommt.


Nicht vergessen, darf man dabei, dass auch der Rand kommen könnte! Sowas löst man immer mit einem Trick. Dann muss man hier nichts spezielles programmieren:

Du braucht eine Matrix von x=6 und Y=5? Dann mach eine mit X=8 und Y=6 ->Dim Feld(8,6)
Code: [AUSKLAPPEN]

9 0 0 0 0 0 0 9
9 0 0 0 0 0 0 9
9 0 0 0 0 0 0 9
9 0 0 0 0 0 0 9
9 0 0 0 0 0 0 9
9 0 0 0 0 0 0 9
9 9 9 9 9 9 9 9


die Neuner auf Spalten Feld(0,n) und Feld(0,7) sind der Rand, die Steine werden also bei den Spalten Feld(1,n) bis Feld(6,n) eingeworfen. Und fallen dann bis zur Y-Reihe 5 durch. Die Feld(n,6)-Reihe ist wieder Rand.
Code: [AUSKLAPPEN]

Function TesteWaagrecht%(locX%,locY%)
    Local locSpieler%, StartPunkt%, EndPunkt%

     locSpieler=Feld(locX,locY)   
     'Startpunkt suchen:
     For I=AktX To 1 Step -1
         If Feld(i-1,locY)<>locspieler Then Exit
    Next
    StartPunkt=i

     'von da aus nach rechts:
     For I=StartPunkt To 6
         If Feld(i,locY)<>locspieler Then Exit
    Next
    EndPunkt=i
     
    If (EndPunkt-StartPunkt)< 4 Then
         Return False
    Else
         DEBUGLOG "Gewonnen"
         Return True
    Endif
End Function


Kriegst Du die anderen 3 Routinen selber hin?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group