QML sokoban example: add new mazes and their solutions

This commit is contained in:
polos 2017-03-14 13:14:01 +01:00
parent 776110d14a
commit 75aa78deac
7 changed files with 4507 additions and 19 deletions

View file

@ -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).

File diff suppressed because it is too large Load diff

View file

@ -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*
'(("@ " " @")
("@." " &")

View file

@ -22,7 +22,7 @@ Image {
SequentialAnimationExt {
objectName: "wiggle_box"
loops: 5
loops: 3
RotationAnimation {
target: box2

View file

@ -26,6 +26,5 @@ Image {
property: "rotation"
from: 0; to: 360
duration: 600
loops: 5
}
}

View file

@ -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

View file

@ -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))))