mirror of
https://gitlab.com/eql/EQL5.git
synced 2026-01-05 00:31:54 -08:00
QML sokoban example: add new mazes and their solutions
This commit is contained in:
parent
776110d14a
commit
75aa78deac
7 changed files with 4507 additions and 19 deletions
|
|
@ -1 +1,3 @@
|
|||
Please see http://www.cliki.net/CL-Sokoban for the original game.
|
||||
|
||||
See also note in "my-levels.lisp" (taken from "YASC_1_639_src.zip" on sourceforge.net).
|
||||
|
|
|
|||
4462
examples/M-modules/quick/sokoban/3rd-party/my-levels.lisp
vendored
Normal file
4462
examples/M-modules/quick/sokoban/3rd-party/my-levels.lisp
vendored
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,22 +1,28 @@
|
|||
(defpackage :cl-sokoban
|
||||
(:nicknames :sokoban)
|
||||
(:use :cl)
|
||||
(:export #:*mazes*
|
||||
#:*rules*
|
||||
#:*move-hook*
|
||||
#:maze #:maze-player #:maze-dimensions #:maze-text
|
||||
#:copy-maze
|
||||
#:simple-ui
|
||||
#:move
|
||||
#:defmaze))
|
||||
(:export
|
||||
#:*mazes*
|
||||
#:*rules*
|
||||
#:*move-hook*
|
||||
#:*solutions*
|
||||
#:maze
|
||||
#:maze-player
|
||||
#:maze-dimensions
|
||||
#:maze-text
|
||||
#:copy-maze
|
||||
#:simple-ui
|
||||
#:move
|
||||
#:defmaze))
|
||||
|
||||
(in-package :cl-sokoban)
|
||||
|
||||
(defvar *move-hook* nil)
|
||||
|
||||
(defvar *mazes* nil
|
||||
"A list of two-dimensional character arrays, describing Sokoban puzzles.")
|
||||
|
||||
(defvar *move-hook* nil)
|
||||
(defvar *solutions* nil)
|
||||
|
||||
(defvar *rules*
|
||||
'(("@ " " @")
|
||||
("@." " &")
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ Image {
|
|||
|
||||
SequentialAnimationExt {
|
||||
objectName: "wiggle_box"
|
||||
loops: 5
|
||||
loops: 3
|
||||
|
||||
RotationAnimation {
|
||||
target: box2
|
||||
|
|
|
|||
|
|
@ -26,6 +26,5 @@ Image {
|
|||
property: "rotation"
|
||||
from: 0; to: 360
|
||||
duration: 600
|
||||
loops: 5
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import "ext/"
|
|||
|
||||
Rectangle {
|
||||
id: root
|
||||
x: -54; y: -44
|
||||
width: 608; height: 512
|
||||
x: -77; y: -44
|
||||
width: 864; height: 512
|
||||
color: "lightsteelblue"
|
||||
|
||||
scale: 0.8
|
||||
|
|
@ -13,7 +13,7 @@ Rectangle {
|
|||
y: 516
|
||||
font.pixelSize: 15
|
||||
color: "white"
|
||||
text: "<b>N</b> ext | <b>P</b> revious | <b>R</b> estart"
|
||||
text: "<b>N</b> ext | <b>P</b> revious | <b>R</b> estart | <b>S</b> olve"
|
||||
}
|
||||
|
||||
// level change animations
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
(qrequire :quick)
|
||||
|
||||
(require :sokoban "3rd-party/sokoban")
|
||||
(require :levels "3rd-party/levels")
|
||||
(require :levels "3rd-party/my-levels")
|
||||
(require :qml-lisp "qml-lisp")
|
||||
|
||||
(defpackage :qsoko
|
||||
|
|
@ -35,6 +35,7 @@
|
|||
(defvar *level* 0)
|
||||
(defvar *maze* nil)
|
||||
(defvar *my-mazes* (mapcar 'sokoban:copy-maze sokoban:*mazes*))
|
||||
(defvar *solving* nil)
|
||||
|
||||
(setf qml:*quick-view* (qnew "QQuickView"))
|
||||
|
||||
|
|
@ -142,7 +143,8 @@
|
|||
*level*)
|
||||
|
||||
(defun key-pressed (object event)
|
||||
(when (zerop *running-animations*)
|
||||
(when (and (zerop *running-animations*)
|
||||
(not *solving*))
|
||||
(case (|key| event)
|
||||
(#.|Qt.Key_Up|
|
||||
(sokoban:move :north *maze*))
|
||||
|
|
@ -157,9 +159,24 @@
|
|||
(#.|Qt.Key_P|
|
||||
(change-level :previous))
|
||||
(#.|Qt.Key_R|
|
||||
(reset-maze))))
|
||||
(reset-maze))
|
||||
(#.|Qt.Key_S|
|
||||
(solve))))
|
||||
nil) ; event filter
|
||||
|
||||
(defun solve ()
|
||||
(let ((*solving* t))
|
||||
(reset-maze)
|
||||
(x:do-string (ch (nth *level* sokoban:*solutions*))
|
||||
(sokoban:move (case (char-downcase ch)
|
||||
(#\u :north)
|
||||
(#\d :south)
|
||||
(#\l :west)
|
||||
(#\r :east))
|
||||
*maze*)
|
||||
(x:while (plusp *running-animations*)
|
||||
(qsleep 0.05)))))
|
||||
|
||||
(defun place-items (type &optional reset)
|
||||
(let ((char (type-char type))
|
||||
(items (assoc* type *items*))
|
||||
|
|
@ -236,7 +253,8 @@
|
|||
(defun run ()
|
||||
(x:do-with *quick-view*
|
||||
(|setSource| (|fromLocalFile.QUrl| "qml/sokoban.qml"))
|
||||
(|resize| '(500 444))
|
||||
(|setMinimumSize| '(710 444))
|
||||
(|resize| (|minimumSize| *quick-view*))
|
||||
(|setColor| "#404040")
|
||||
(|show|))
|
||||
(qadd-event-filter nil |QEvent.KeyPress| 'key-pressed)
|
||||
|
|
@ -246,3 +264,4 @@
|
|||
(progn
|
||||
(run)
|
||||
(qlater (lambda () (in-package :qsoko))))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue