Memo Tutorial

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Rallimen

Sieger des 30-EUR-Wettbewerbs

Betreff: Memo Tutorial

BeitragDi, Jan 27, 2004 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will auch mal einen kleinen Beitrag hier posten,
hoffe das es einige auch gebrauchen können Very Happy
Code: [AUSKLAPPEN]
AppTitle "Memo Tutorial by Rallimen"
Graphics 800,600,16,2; kleiner Beispielcode für Memo-Spiel
SetBuffer BackBuffer()
SeedRnd MilliSecs() ;zufall einstellen
Const ESC = 1, Bildwiederholung = 60
Global  Mausklick,Maus_Pos_X,Maus_Pos_Y ; für Mausabfrage Function
Global  Offene_Tueren, Offene_Karte1, Offene_Karte2, PauseVariable
frameTimer  =   CreateTimer(Bildwiederholung); speedbremse einbauen

;erst mal ermitteln wo denn die Memo_Karten später gezeichnet werden sollen
  Dim Bildposition(15,1); in 0 die X-Position und in 1 die Y-Position speichern
  ;function zum berechnen aufrufen
  Bild_Positionen_ermitteln(); die Positionen berechnen und speichern

; jetzt werden die Bilder geladen, die nachher gebraucht werden für die Memo-Karten
  Dim Einzelbild(7) ;= 8 Bilder
  Bilderladen() ; und in der Function laden

; jetzt werden die Memorykarten erstellt
  ; für jede Karte brauchen wir verschiedene Variablen in denen sich das Programm merkt
  ; -welches Bild auf der Karte klebt
  ; -ob es Aktiv ist , also sichtbar oder nicht
 ; -Identifizierungscode  für gleiche Bilder
  ; -Zufallszahl zum Mischen
  ; so speichern wir diese
  Dim MemoryKarte(15,3)
  ;in 0 das aktuelle Bild ,     
  ;in 1 Bild aktiv = 1 oder 0         
  ;in 2 Partnerbild code 1-1 oder 4-4 ;
  ;in 3 zufalls Zahl zum mischen
   Karten_erstellen() ; diese function erstellt das Kartenwerk

;jetzt können wir die Karten mischen
Memo_mischen(); in dieser Function erledigen wir das

;#################################################################
While Not KeyDown(ESC) ; ############################Hauptschleife
  ;mausabfragen
   Maus_abfrage()

  ;alle MemoryKarten  malen
    Memo_malen()

  ; Rückseiten drübermalen
   Memo_rueckseiten_malen()

      ;jetzt kommt das eigendliche wichtigste
      ; 2 sachen
      ;    welche karte angeklickt wurde sollte gedreht werden
      ; und wenn 2 offen liegen dann
      ; der Vergleich ob diese richtig sind

  ; jetzt noch Pausevariablen setzten damit man auch sieht das es falsche Bilder waren, die angeklickt wurden
  ; werde das hier mal über die Bildwiederholungrate FPS machen ,hier 60 Bilder/Sek  wie es eingestellt ist in frametimer
  ; jedesmal wenn die Bilder verglichen wurden  und nicht richtig  waren,  setzen wir die PauseVariable = 60
  ; und solange wie diese nicht auf Null runtergezählt wurde, ca.1Sekunde, einfach das Programm laufen lassen ohne diese 2 Functionen
  ;auszuführen >>>Memo_Karte_umdrehen()  & Memo_Karten_vergleichen()<<<<
  If  PauseVariable > 0 Then ;solange diePauseVariable Aktiv ist keine karte umdrehen
      PauseVariable = PauseVariable -1; bei  jedem Durchlauf verkleinern
       If PauseVariable = 0 Then  ; wenn diese auf 0 ist drehen wir die Karten wieder um, die falsch waren
           MemoryKarte(Offene_Karte1,1) = 1 ; aktiviert die Karte
           MemoryKarte(Offene_Karte2,1) = 1 ; bzw
       End If
  Else ; wenn die PauseVariable = 0 ist öffnen und vergleichen wieder
      Memo_Karte_umdrehen() ;hier der Aufruf der Funktion zum drehen einer  Karte
      Memo_Karten_vergleichen(); das erklärt sich schon am Namen der Function
  End If
  ; wenn das im Vollbild ausgeführt, wird muß hier noch ein Mauszeiger gemalt werden!
  WaitTimer(frameTimer)
   Flip
   Cls
Wend;#################################   Hauptschleife ENDE
;##########################################################
End


Function Memo_Mischen() ; karten sortieren nach zufallzahl mit bubbleSort
   For z = 0 To 15
      For Bildzaehler = 0 To 15 -1;diese schleife schiebt das feld runter bis es
      ;-1 weil wir das letzte nicht mit dem allerletzten vertauschen können, da es nicht exestiert
            If  MemoryKarte(Bildzaehler,3) < MemoryKarte(Bildzaehler+1,3)
            tempZufall = MemoryKarte(Bildzaehler,3)                 ; hier die einzelnen
            MemoryKarte(Bildzaehler,3) = MemoryKarte(Bildzaehler+1,3);Werte Zufall tauschen
            MemoryKarte(Bildzaehler+1,3) =tempZufall; bilder mit tauschen
             
             tempBild = MemoryKarte(Bildzaehler,0)                 ; hier die einzelnen  Bilder
            MemoryKarte(Bildzaehler,0) = MemoryKarte(Bildzaehler+1,0);tauschen
            MemoryKarte(Bildzaehler+1,0) =tempBild
               
             tempIdent = MemoryKarte(Bildzaehler,2)            ;IdentNr tauschen   
            MemoryKarte(Bildzaehler,2) = MemoryKarte(Bildzaehler+1,2);tauschen
            MemoryKarte(Bildzaehler+1,2) =tempIdent
          EndIf
      Next
   Next
End Function

Function Karten_erstellen()
 
  ;in 0 das aktuelle Bild ,     
  ;in 1 Bild aktiv = 1 oder 0         
  ;in 2 Partnerbild code 1-1 oder 4-4 ;
  ;in 3 zufalls Zahl zum mischen

  For t= 0 To 7
    MemoryKarte(t,0)   = Einzelbild(t)  ; die Karte auf das Bild setzten
    MemoryKarte(t+8,0) = Einzelbild(t)  ; hier das gleiche bild nur eben versetzt

    MemoryKarte(t,1)   = 1 ;  die Karten aktivieren
    MemoryKarte(t+8,1) = 1 ; die Karten aktivieren

    MemoryKarte(t,2)   = t;  den gleichen Code zuweisen
    MemoryKarte(t+8,2) = t; wegen der späteren Übereinstimmung

    MemoryKarte(t,3)   = Rand (1,255) ;  die Zufallszahl
    MemoryKarte(t+8,3) = Rand (1,255) ;  die Zufallszahl
  Next
End Function

Function Bild_Positionen_ermitteln() ; 16 Stück (2 x 8 Karten) ;Spielfeld = 4 Breit und 4 hoch
   Bildzaehler = 0 ; eigendlich über da es beim Aufruf der Function die Variable Bildzaehler = 0 ist
   ; die Bilder sind 90 x 90 Pixel gross
   For y = 0 To 3 
      For x= 0 To 3
      ;Dim Bildposition(15,1); in 0 die X-Position und in 1 die Y-Position speichern

         ; was hier passiert
         ;beim ersten durchlauf der schleife ist x und y = 0 , da 0 * 95  ja 0 ist
         ; +90 habe ich gemacht um alle Bilder weiter auf das Feld zubekommen ,
         ;da sonst die Bilder direkt oben am Rand gemalt werden
         Bildposition (Bildzaehler,0) = x*95    +90 ; X-Position berechnen
         Bildposition (Bildzaehler,1) = y*95     +90  ;Y-Position berechnen
         Bildzaehler = Bildzaehler +1; für das nächste Bild Position ermitteln
      Next
   Next
   ;die positionen sind jetzt ermittelt und gespeichert

End Function

Function  Bilderladen()
  ; je nachdem wie die Bilder abgespeichert sind ist es wichtig das
  ;  in jedem Einzelbild(7) ein Bild von 90x90 Pix groß geladen wird
  ;################Beispielcode zum laden der Bilder
  ;For t= 0 To 7 ; hier sind die bilder in einer Datei
  ;Einzelbild(t)  = LoadAnimImage("dateiname.bmp",90,90,t,1)
  ;Next
  ;################


  ; hier erstell ich jetzt Bilder aus verschiedenen Farben
  ;damit der Code auch überall functioniert
  ;wenn ihr eure Blilder nutzt dann volgenden Code Löschen
  font = LoadFont("Arial",80,0,0,0)
  SetFont font
  For t= 0 To 7
    Color Rnd (10,230),Rnd (10,200),Rnd (10,200)
    Rect 0,0,90,90,1
    Color 0,0,0
    Text 45,45,Rand(1,99),1,1 ;eine Zufallszahl mittig draufmalen
    Einzelbild(t) = CreateImage (90,90)
    GrabImage Einzelbild(t) ,0,0; Grafik erstellen
  Next
  Cls
  ;aber nur bis hier löschen
End Function

Function Maus_abfrage()
   Mausklick  = MouseHit(1)
   Maus_Pos_X = MouseX()
   Maus_Pos_Y = MouseY()
End Function

Function Memo_malen()
  For z1 = 0 To 15
    DrawBlock MemoryKarte(z1,0),Bildposition(z1,0),Bildposition(z1,1)
  Next
End Function

Function Memo_rueckseiten_malen()
   ;Alle Rückseiten drübermalen mit Rect,( kann aber auch ein bild sein)
   ; Allerdings nur die die nicht aufgedeckt sind
   ;bzw die Karten die Aktiv oder nicht Aktiv sind
   Color 0,0,255 ; Farbe Blau einstellen, weil es mit Rect übermalt wird
   For z1 = 0 To 15
     ; diese malen wir aber nur wenn das Bild noch aktiv ist also noch im Spiel ist übermalt
     If  MemoryKarte(z1,1) = 1 Then Rect Bildposition(z1,0),Bildposition(z1,1),90,90,1; blaue kästchen drübermalen
   Next

End Function

Function Memo_Karte_umdrehen()
  If Mausklick = 1 Then ; also nur den code abarbeiten wenn die Maustaste gedrückt wurde
    For t = 0 To 15 ; wieder alle karten  abfragen ,
            ;   allerdings dürfen wir nur die umdrehen die noch nicht umgedreht sind
          ;   bzw die die Aktiv sind
     If MemoryKarte(t,1) = 1 Then ; wenn dies zutrifft ist  die Karte aktiv
      ;und wir fragen ob diese karte angeklickt wurde mit der Mausspitze mit
      ; und nehmen jetzt aber nicht das Bild sondern vergleichen auf 2 rechtecke
      ; das eine mit 90x90 Pixel und für die Maus 1 x 1 Pixeln
        If RectsOverlap (Bildposition (t,0),Bildposition (t,1),90,90,Maus_Pos_X,Maus_Pos_Y,1,1) Then
        ; wenn diese Karte geklickt wurde dann ändern wir den status der Karte und deaktivieren diese
        MemoryKarte(t,1) =0 ;jetzt wird diese nicht mehr gezeichnet und bleibt offen liegen
        Offene_Tueren = Offene_Tueren +1; und merken uns das wir eine geöfnet haben
        ;wir merken uns welche wir geöffnet haben um sie nachher zu vergleichen
        ;allerdings brauchen wir 2 Variablen    eine für die 1. die wir öffnen und eine für die 2.
        If  Offene_Tueren = 1 Then Offene_Karte1 = t ; hier steht jetzt die karten nummer der 1. Karte drinn die wir geöffnet haben
        If  Offene_Tueren = 2 Then Offene_Karte2 = t ; hier steht jetzt die karten nummer der 2. Karte drinn die wir geöffnet haben
        ;man kann diese Schleife jetzt verlassen da wir eine geöffnet haben
        ;oder auch durchlaufen lassen, er findet eh keine andere mehr an diesem Platz
        End If
     End If
     Next
  End If
End Function


Function   Memo_Karten_vergleichen()

  If Offene_Tueren = 2 Then ;vergleichen können wir nur wenn 2 Karten aufgedeckt
    ;hier sind die nummern der Karten gespeichert die geöffnet sind
   ;Offene_Karte1, Offene_Karte2
    ; hier werden die Karten veglichen
    If MemoryKarte(Offene_Karte1,2) = MemoryKarte(Offene_Karte2,2) Then
          ; super ein Paar gefunden, hier dann zählen oder Music spielen
    Else ; wenn nicht gleich dann die karten wieder Aktivieren

       ; diese Beiden Zeilen werden duch die PauseVariable ersetzt  und erst ausgeführt wenn die Pause beendet wurde
       ;da man sonst die 2. geöffnete Karte nicht angezeigt bekommt weil diese sofort wieder geschlossen wird
         ; MemoryKarte(Offene_Karte1,1) = 1
         ; MemoryKarte(Offene_Karte2,1) = 1
       PauseVariable = 60
      ;PlaySound Fehlerton
   End If
    ;wenn die Türen abgefragt worden Sind die Variable dann zurücksetzten
    Offene_Tueren  = 0               ; wichtig damit es gleich weitergeht

  End If
End Function

Mit vielen Erklärungen!!
Natürlich voll funktionsfähig , aber nicht ganz fertig was auch beabsichtigt ist ! Es kann nur einmal gespielt werden und muss dann neu gestartet werden!
Würde auch den Rahmen sprengen!
dann viel Spass und viel Erfolg!

Kopieren>>>>> Probieren!!!
[BB2D | BB3D | BB+]

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group