Sehr schön umgesetzt! Sind aber noch paar Bugs drin. Es fehlte zum Bsp.
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