minesweeper: adding XYZZY hint like the original.

windows-high-dpi
John Benediktsson 2018-02-24 08:15:56 -08:00
parent b8ce63491f
commit ade235e25a
1 changed files with 44 additions and 8 deletions

View File

@ -1,12 +1,13 @@
! Copyright (C) 2017 John Benediktsson ! Copyright (C) 2017 John Benediktsson
! See http://factorcode.org/license.txt for BSD license ! See http://factorcode.org/license.txt for BSD license
USING: accessors arrays assocs calendar colors.constants USING: accessors arrays assocs calendar circular
combinators combinators.short-circuit destructors formatting fry colors.constants combinators combinators.short-circuit
images.loader kernel locals math math.order math.parser destructors formatting fry images.loader kernel locals math
namespaces opengl opengl.textures random sequences timers ui math.order math.parser namespaces opengl opengl.textures random
ui.commands ui.gadgets ui.gadgets.toolbar ui.gadgets.tracks sequences timers ui ui.commands ui.gadgets ui.gadgets.toolbar
ui.gadgets.worlds ui.gestures ui.pens.solid ui.render words ; ui.gadgets.tracks ui.gadgets.worlds ui.gestures ui.pens.solid
ui.render words ;
IN: minesweeper IN: minesweeper
@ -114,7 +115,7 @@ DEFER: click-cell-at
} case >>state drop t } case >>state drop t
] [ f ] if* ; ] [ f ] if* ;
TUPLE: grid-gadget < gadget cells timer textures start end ; TUPLE: grid-gadget < gadget cells timer textures start end hint? ;
:: <grid-gadget> ( rows cols mines -- gadget ) :: <grid-gadget> ( rows cols mines -- gadget )
grid-gadget new grid-gadget new
@ -122,7 +123,8 @@ TUPLE: grid-gadget < gadget cells timer textures start end ;
mines place-mines update-counts >>cells mines place-mines update-counts >>cells
H{ } clone >>textures H{ } clone >>textures
dup '[ _ relayout-1 ] f 1 seconds <timer> >>timer dup '[ _ relayout-1 ] f 1 seconds <timer> >>timer
COLOR: gray <solid> >>interior ; COLOR: gray <solid> >>interior
"12345" <circular> >>hint? ;
M: grid-gadget graft* M: grid-gadget graft*
[ timer>> start-timer ] [ call-next-method ] bi ; [ timer>> start-timer ] [ call-next-method ] bi ;
@ -170,6 +172,18 @@ M: grid-gadget pref-dim*
textures>> [ load-image { 0 0 } <texture> ] cache textures>> [ load-image { 0 0 } <texture> ] cache
[ dim>> [ 2 /i ] map ] [ draw-scaled-texture ] bi ; [ dim>> [ 2 /i ] map ] [ draw-scaled-texture ] bi ;
:: draw-hint ( gadget -- )
gadget hint?>> t eq? [
gadget hand-rel first2 :> ( w h )
h 58 >= [
h 58 - w [ 32 /i ] bi@ :> ( row col )
gadget cells>> row col cell-at [
mined?>> COLOR: black COLOR: white ? gl-color
{ 0 0 } { 1 1 } gl-fill-rect
] when*
] when
] when ;
:: draw-mines ( n gadget -- ) :: draw-mines ( n gadget -- )
gadget cells>> won? 0 n ? "%03d" sprintf [ gadget cells>> won? 0 n ? "%03d" sprintf [
26 * 3 + 6 2array [ 26 * 3 + 6 2array [
@ -210,6 +224,7 @@ M: grid-gadget pref-dim*
M: grid-gadget draw-gadget* M: grid-gadget draw-gadget*
{ {
[ draw-hint ]
[ cells>> #mines-remaining ] [ cells>> #mines-remaining ]
[ draw-mines ] [ draw-mines ]
[ draw-smiley ] [ draw-smiley ]
@ -250,6 +265,23 @@ M: grid-gadget draw-gadget*
] unless ] unless
] when gadget relayout-1 ; ] when gadget relayout-1 ;
:: on-x ( gadget -- )
gadget hint?>> t eq? [
CHAR: x gadget hint?>> circular-push
] unless ;
:: on-y ( gadget -- )
gadget hint?>> t eq? [
CHAR: y gadget hint?>> circular-push
gadget hint?>> "xyzzy" sequence=
[ t gadget hint?<< ] when
] unless ;
:: on-z ( gadget -- )
gadget hint?>> t eq? [
CHAR: z gadget hint?>> circular-push
] unless ;
: new-game ( gadget rows cols mines -- ) : new-game ( gadget rows cols mines -- )
[ make-cells ] dip place-mines update-counts >>cells [ make-cells ] dip place-mines update-counts >>cells
f >>start f >>end relayout-window ; f >>start f >>end relayout-window ;
@ -272,6 +304,10 @@ grid-gadget "gestures" [
{ T{ button-up { # 1 } } [ on-click ] } { T{ button-up { # 1 } } [ on-click ] }
{ T{ button-up { # 3 } } [ on-mark ] } { T{ button-up { # 3 } } [ on-mark ] }
{ T{ key-down { sym " " } } [ on-mark ] } { T{ key-down { sym " " } } [ on-mark ] }
{ T{ key-down { sym "x" } } [ on-x ] }
{ T{ key-down { sym "y" } } [ on-y ] }
{ T{ key-down { sym "z" } } [ on-z ] }
{ motion [ relayout-1 ] }
} assoc-union } assoc-union
] change-word-prop ] change-word-prop