deck's auf (Kinderspiel in der Art von Memory)

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
zoidberg
Beiträge: 219
Registriert: 06.12.2004 23:15
Computerausstattung: Acer 6530
Mit Ubuntu 9.04 64 Bit als Hauptsystem und
Windows Vista 32Bit Home Premium zum spielen.
Wohnort: GM
Kontaktdaten:

deck's auf (Kinderspiel in der Art von Memory)

Beitrag von zoidberg »

Hallo!

Endlich habe ich auch ein Spiel fertiggestellt.

Es gibt eine Linux und eine Windowsvariante. Wer Mac oder Amiga nutzt kann ja mal probieren den Quellcode selbst zu komplilieren.

Über Feedback würde ich mich freuen. Die Version ist eine Quasi Final Version. Ich wollte noch einen Introbildschirm vorschalten, und eine Highscoreliste einfügen. Ebenfalls werde ich die Schriftart mal irgendwann austauschen.

Geplant sind auch noch ein Computergegner und verschiedene Kartensets. Das folgt aber später sobald ich die Muße finde mich daranzubegeben.

Erste Tests haben ergeben das das Delay nach dem aufdecken der zweiten Karte zu lang ist. Das ist aber so von mir gewollt. Das Spiel habe ich für meinen 3-jährigen Sohn gemacht. Er braucht ja etwas Zeit zum Einprägen und er klickt noch nicht so genau. Sein Rekord ist 22 Versuche. Meist brauch er aber so um die 27.

Ihr könnt es unter http://www.stfm.de runterladen.

Viel Spaß!

Gruß, Steffen
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag von DataMiner »

:allright: Sehr schön gemacht, läuft bei mir (unter Win xp pro) einwandfrei.
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo zoidberg,

Schön gemacht. :allright: Ich hab zu meiner Schande beim ersten Testen 18 Versuche benötigt und es auch beim zweiten und dritten Mal nicht besser geschafft. Ich werde das auf jeden Fall meinen Mädels zu Hause mal installieren...

Ach ja, macht das Spiel keine Geräusche? Ein kleines Geräusch beim finden einer Kombination und bei einem Fehler wäre ganz nett. Und bei jedem Umdrehen so ein Geräusch wie es eine Spielkarte macht, wenn man Sie vom Tisch nimmt (*switch*). Natürlich muss man das abschalten können (Taste M oder so).

Grüsse,

Volker
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

Sehr schön umgesetzt! Sind aber noch paar Bugs drin. Es fehlte zum Bsp.
vor DrawText ein StartDrawing() Habs mal für PB4 angepasst:

Code: Alles auswählen

;"deck's auf" Variante des bekannten Spiels Memory (Leider ist der Name Memory geschützt)
;Es ist gar nicht leicht dafür einen anderen sinnvollen Namen zu finden. Vorschläge nehme ich gern an.
;Das Spiel habe ich für meinen Sohn Nico geschrieben. Ihr dürft es gerne zum ausprobieren für den Eigenbedarf
;verändern. Die Grafiken habe ich selbst erstellt. Wer sie wo anders einsetzen möchte sollte mich vorher
;fragen. Ich möchte hier gar nicht so viel Rechtszeug vorgeben, aber ich möchte keine Pornovarianten
;oder so davon finden. Wundert euch nicht über diesen wirren Code, ich bin Anfänger. Wundert euch nicht
;über sinnlose Variablen. Die sind für einen geplanten Computergegner.
;Viel Spaß damit! Ich habe PB 3.94 benutzt unter Linux. Geht aber auch unter Windows.
; Gruß, Steffen 

;-prozeduren
Procedure variablen()
Global mausueber.b
Global counter
Global yposmaus
Global xposmaus
Global movex
Global movey
Global aufgedeckt.b
Global sichtbar.b
Global sichtbarx
Global sichtbary
Global erstekarte.b
Global zweitekarte.b
Global ersteposition.b
Global versuche.b
Global versuches.s
Global startzeit
Global gesamtzeit
Global zeit
Global zeits.s
Global gameplay.b
startzeit = ElapsedMilliseconds()
versuche = 0
gameplay = 1
movey.l = 10
movex.l = 10
mauszeiger.b
c = 1
computerzug1.b
computerzug2.b
Global scorep.b
Global scoreps.s
scorec.b
Global datei.s
Global klick1.b
Global klick2.b
Global Dim bild.b(20)
Global Dim status.b(20)
Global Dim bildanzahl.b(10)
Global Dim daistes1.b(20)
Global Dim daistes2.b(20)
Global NewList compintelligenz.b()
runde.b
Level.b
Level = 1
;-Data Bloecke hier hinein
DataSection
;bilddaten:
;Data.s "anker","insel","schiff","truhe","pirat","kanone","flaschenpost","flagge","messer","hai","karte","hintergrund","kreuz","kreuz2","neustart","ende"
anker: IncludeBinary "anker.jpg"
insel: IncludeBinary "insel.jpg"
schiff: IncludeBinary "schiff.jpg"
truhe: IncludeBinary "truhe.jpg"
pirat: IncludeBinary "pirat.jpg"
kanone: IncludeBinary "kanone.jpg"
flaschenpost: IncludeBinary "flaschenpost.jpg"
flagge: IncludeBinary "flagge.jpg"
messer: IncludeBinary "messer.jpg"
hai: IncludeBinary "hai.jpg"
karte: IncludeBinary "karte.jpg"
hintergrund: IncludeBinary "hintergrund.jpg"
kreuz: IncludeBinary "kreuz.png"
kreuz2: IncludeBinary "kreuz2.png"
neustart: IncludeBinary "neustart.jpg"
ende: IncludeBinary "ende.jpg"
EndDataSection
EndProcedure


Procedure vollbild()
;Initialisieren des Vollbildes und der Peripherie
If InitSprite() = 0                                               ; spritefunktionen initialisieren
  MessageRequester("Fehler","Konnte dx nicht finden",0)           ; falls es nicht klappt meldung zeigen
EndIf                                                             ; ende der prüfung
If InitKeyboard()=0                                               ; keyboard initialisieren
  MessageRequester("Fehler","Konnte dx nicht finden",0)           ; falls es nicht klappt meldung zeigen
EndIf 
If InitMouse()=0                                               ; keyboard initialisieren
  MessageRequester("Fehler","Konnte dx nicht finden",0)           ; falls es nicht klappt meldung zeigen
EndIf                                                             ; ende der prüfung

OpenWindow(0, 0, 0, 800, 600, "", #WS_OVERLAPPEDWINDOW )
If OpenWindowedScreen(WindowID(0), 0, 0, 800,600, 0,0, 0) = 0                         ; vollbild öffnen
  MessageRequester("Fehler","Konnte kein Vollbild erstellen ",0)  ; falls es nicht klappt
EndIf
EndProcedure


Procedure bilderladen()
;Restore bilddaten
; For q.b = 1 To 16
;   Read datei.s
;   ;datei = "?"+datei
;   If CatchSprite(q,datei) = 0
;     MessageRequester("Bild Problem","Mist",0)
;     End
;   EndIf
; Next q
UseJPEGImageDecoder()
CatchSprite(1,?anker)
CatchSprite(2,?insel)
CatchSprite(3,?schiff)
CatchSprite(4,?truhe)
CatchSprite(5,?pirat)
CatchSprite(6,?kanone)
CatchSprite(7,?flaschenpost)
CatchSprite(8,?flagge)
CatchSprite(9,?messer)
CatchSprite(10,?hai)
CatchSprite(11,?karte)
CatchSprite(12,?hintergrund)
CatchSprite(15,?neustart)
CatchSprite(16,?Ende)
UsePNGImageDecoder()
CatchSprite(13,?kreuz)
CatchSprite(14,?kreuz2)

EndProcedure


Procedure kartenmischen()     ;Karten mischen und verteilen
For q = 1 To 20
  Repeat
    c = Random(9)+1
  Until bildanzahl(c) < 2
  bildanzahl(c) +1
  bild(q) = c
  If daistes1(c)=0
    Debug daistes1(c) = q
  Else
    Debug daistes2(c) = q
  EndIf
  status(q) = 1
Next q
EndProcedure


Procedure mausabfrage()
  mausueber = 0
  movex = 70
  movey = 50
  counter = 0
  For q = 1 To 4
    For w = 1 To 5
      counter = counter +1
      If xposmaus > movex And xposmaus < movex+100 And yposmaus > movey And yposmaus < movey+100
        mausueber = counter
        
      EndIf
      movex=movex +110
    Next w
    movex = 70
    movey = movey +110
  Next q
EndProcedure
Procedure karteaufdecken()

  movex = 70
  movey = 50
  counter = 0
  For q = 1 To 4
    For w = 1 To 5
      counter = counter + 1
      If counter = mausueber
        DisplaySprite(bild(counter),movex,movey)
        sichtbar = counter
        sichtbarx = movex
        sichtbary = movey
        
        If aufgedeckt > 0
          zweitekarte = bild(sichtbar)
          StartDrawing(ScreenOutput())
          DrawingMode(1)
          
          If erstekarte = zweitekarte
            DrawText(70,570, "Super!")
            status(zweitekarte)=0
            scorep = scorep + 1
          Else
            DrawText(70,570, "Das war nix!")
          EndIf
          StopDrawing()
        Else
          erstekarte = bild(sichtbar)
          ersteposition = sichtbar
        EndIf
      EndIf
      movex=movex +110
    Next w
    movex = 70
    movey = movey +110
  Next q
  aufgedeckt = aufgedeckt + 1
  If aufgedeckt >1
    aufgedeckt = 0
    sichtbar = 0
    sichtbarx = 0
    sichtbary = 0
    erstekarte = 99
    zweitekarte = 98
    ersteposition = 0
    versuche = versuche +1
  EndIf
 EndProcedure
      
variablen()
vollbild()
bilderladen()
kartenmischen()
scorep = 10
    
;----------------------------
;-Hauptschleife des Programms
;----------------------------
Repeat
Select gameplay
Case 1      ;Wenn das Spiel beendet wurde (also alle Karten aufgedeckt wurden).
 FlipBuffers()         ; Den Buffer wechseln
ClearScreen(0)    ; Bildschirm saeubern
ExamineKeyboard()     ; Tastatur aktivieren
ExamineMouse()        ; Maus aktivieren
DisplaySprite(12,0,0) ; Hintergrundbild anzeigen
DisplaySprite(15,50,150)
DisplaySprite(16,450,150)
  If MouseButton(1) And mousestatus = 0
    mousestatus = 1
  EndIf 
    If yposmaus > 150 And yposmaus < 450 And xposmaus > 50 And xposmaus < 350
      mauszeiger = 14
      If MouseButton(1) And mousestatus = 1
        versuche = 0
        scorep = 0
        aufgedeckt = 0
        sichtbar = 0
        sichtbarx = 0
        sichtbary = 0
        erstekarte = 99
        zweitekarte = 98
        ersteposition = 0
        variablen ()
        kartenmischen()
        Delay (100)
        MouseLocate(270,300)
        gameplay = 2
      EndIf
    Else
      mauszeiger = 13
    EndIf
  
    If yposmaus > 150 And yposmaus < 450  And xposmaus > 450 And xposmaus < 750
      mauszeiger = 14
      If MouseButton(1) And mousestatus = 1
        End
      EndIf
    EndIf
Case 2    ;Normales Gameplay
  movex = 70          ; Die jeweils links liegende Karte ist 70 Pixel vom Rand entfernt
  movey = 50          ; Von oben ist die erste Reihe 50 Pixel entfernt.
FlipBuffers()         ; Den Buffer wechseln
ClearScreen(0)    ; Bildschirm saeubern
ExamineKeyboard()     ; Tastatur aktivieren
ExamineMouse()        ; Maus aktivieren
DisplaySprite(12,0,0) ; Hintergrundbild anzeigen
counters = 0           ; Zähler auf Null setzen
For q = 1 To 4      ; vier Karten uebereinander 
    For w = 1 To 5    ; und fuenf Karten nebeneinander anordnen
      counters = counters +1
      If status(bild(counters))=1
      DisplaySprite(11,movex,movey)  ; vorerst ueberall die Kartenrueckseite zeigen (Sprite Nr. 1)
      EndIf
      movex=movex +110  ; der Abstand der Karten 110 Pixel = 100 fuer die Karte und 10 Pixel fuer den Zwischenraum

    Next w
    movex = 70
    movey = movey +110
  Next q
  If aufgedeckt > 0   ; Es wird geprüft ob schon eine Karte aufgedeckt ist
    DisplaySprite(bild(sichtbar),sichtbarx,sichtbary)   ;Die bereits aufgedeckte Karte wird angezeigt.
  EndIf
  mausabfrage()           ; Die Prozedur Mausabfrage wird ausgeführt.
  If status(bild(mausueber))=1  ;Zunächst wird geprüft ob das Bild über dem die Maus gerade wäre noch sichtbar ist.
    If mausueber<>0         ; Wenn der Mauszeiger sich über einer Karte befindet die angezeigt wird
      mauszeiger = 14       ; wird der Zeiger als Pfeil angezeigt
    Else 
      mauszeiger = 13       ; an sonsten wird er als Kreuz dargestellt
    EndIf
  Else
    mauszeiger = 13         ; So wird der Zeiger auch auf der Position einer Karte als Kreuz gezeigt wenn die Karte nicht mehr zu sehen ist.
  EndIf
  If MouseButton(1) And mousestatus = 0
    mousestatus = 1
  EndIf
  If MouseButton(1) And mousestatus = 1 And ersteposition <> mausueber And status(bild(mausueber)) > 0
    karteaufdecken()
    FlipBuffers()

    If aufgedeckt = 0     ;Wenn die Zweite Karte aufgedeckt wird
      Delay(2000)         ;Bleiben beide eine Weile zum besseren Einprägen sichtbar
    Else    
      Delay(20)           ;Ansonsten gibt es keine spürbare Verzögerung
    EndIf
  EndIf
EndSelect
StartDrawing(ScreenOutput())
DrawingMode(1)
  gesamtzeit=ElapsedMilliseconds()
  zeit=(gesamtzeit-startzeit)/1000
  If scorep < 10
    zeits=Str(zeit)
  Else
    gameplay=1
  EndIf
  DrawText(70,550, "Abgelaufene Sekunden: "+zeits)
  versuches=Str(versuche)
  DrawText(300,550, "Versuche: "+versuches)
StopDrawing()
yposmaus = MouseY()+13  ; Die Mausposition + 13 Pixel fuer die mitte des Kreuzes wird gesichert
xposmaus = MouseX()+13  ; hier ist es auch wie eine Zeile drueber.
TransparentSpriteColor(mauszeiger, $FF00FF)
  DisplayTransparentSprite(mauszeiger,MouseX(),MouseY())
If KeyboardPushed(#PB_Key_Escape)                 ; escape taste gedrückt
  End                                             ; dann programmende
EndIf; ende der prüfung
If WindowEvent() = #PB_Event_CloseWindow
  End
EndIf

ForEver
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
zoidberg
Beiträge: 219
Registriert: 06.12.2004 23:15
Computerausstattung: Acer 6530
Mit Ubuntu 9.04 64 Bit als Hauptsystem und
Windows Vista 32Bit Home Premium zum spielen.
Wohnort: GM
Kontaktdaten:

Beitrag von zoidberg »

Hallo!

Freut mich, daß es euch gefällt. Das mit den Tönen ist eine schöne Idee. Ich muss mal sehen wo ich die am besten herbekomme. Vielleicht kann ich sie ja auch selbst aufnehmen. Die Grafiken habe ich ja auch selbst gemacht.

Was das StartDrawing() angeht, das habe ich gar nicht bemerkt das es irgendwo fehlt. An welcher Stelle war das genau?

Ich habe in der Linuxversion festgestellt, daß es auf dem Laptop meiner Frau nicht geht. Mag es sein das ich bestimmte Voraussetzungen erfüllen muß? So wie Direct X unter Windows zum Beispiel bei Linux SDL oder so benötigt wird? Was mir auch aufgefallen ist, ist das unter Linux keine Fehlermeldung kommt, sondern nur ein schwarzer Bildschirm der sich auch nicht beenden läßt außer durch "strg,alt und backspace".

Schön das es sich auch mit Version 4 kompilieren läßt. So kann jeder interessierte ein wenig experimentieren.

Als nächstes wollte ich mich mal an Schiffeversenken oder Mau Mau versuchen. Hat jemand noch Ideen welche einfachen Spiele eine schöne Aufgabe zum erlernen von Purebasic sind? Vier gewinnt ist mir KI mäßig noch zu anspruchsvoll.

Der Titel "deck's auf" gefällt mir auch noch nicht so recht. Deshalb erscheint er auch nicht im Spiel.

Sobald ich auch unter Linux den Pfad der exe vernünftig weitergeben kann werde ich die Grafiken auch wieder aus der exe rausnehmen. Ich habe mir auch ausgedacht man könnte einen Zusatz machen bei dem man eigene Bilder auswählen kann, und dann einen Quadratischen Ausschnitt daraus wählt. Diese eigenen Bilder könnte man dann als Kartenthema auswählen. Das ist mir aber noch zu schwer.

Vielen Dank für euer Feedback!

Gruß, Steffen
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Es funktioniert hier mit OpenSuSE 10.0 wunderbar.
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
zoidberg
Beiträge: 219
Registriert: 06.12.2004 23:15
Computerausstattung: Acer 6530
Mit Ubuntu 9.04 64 Bit als Hauptsystem und
Windows Vista 32Bit Home Premium zum spielen.
Wohnort: GM
Kontaktdaten:

Beitrag von zoidberg »

So, ich hab das StartDrawing jetzt auch noch eingesetzt. Vielen Dank für den Tip. Außerdem habe ich die Linuxversion jetzt auch mit 16Bit Farbtiefe hochgeladen, da es in der Windowsversion damit Probleme gab.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

@zoidberg

Klasse gemacht!
Das Spiel ist richtig nett umgesetzt, vor allem die Grafik ist
sehr schön gezeichnet - ich würde so was nie hinbekommen.

Also nochmals Glückwunsch

Gruß

FGK
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag von onny »

wow, ist echt super! schicks doch an gamestar, da gibts ne Rubrik Leserspiele. Leider funktioniert Alt+Tab und wieder zurück ins SPiel bei mir nicht... Auch eine Highscroe wäre schön!

Super! Weiter so!
gruß oNNy
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

onny hat geschrieben:Leider funktioniert Alt+Tab und wieder zurück ins SPiel bei mir nicht...
Das ist bei der Verwendung der PB-Engine so üblich...
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Antworten