minesweeper: adding XYZZY hint like the original.
							parent
							
								
									b8ce63491f
								
							
						
					
					
						commit
						ade235e25a
					
				| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
! Copyright (C) 2017 John Benediktsson
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license
 | 
			
		||||
 | 
			
		||||
USING: accessors arrays assocs calendar colors.constants
 | 
			
		||||
combinators combinators.short-circuit destructors formatting fry
 | 
			
		||||
images.loader kernel locals math math.order math.parser
 | 
			
		||||
namespaces opengl opengl.textures random sequences timers ui
 | 
			
		||||
ui.commands ui.gadgets ui.gadgets.toolbar ui.gadgets.tracks
 | 
			
		||||
ui.gadgets.worlds ui.gestures ui.pens.solid ui.render words ;
 | 
			
		||||
USING: accessors arrays assocs calendar circular
 | 
			
		||||
colors.constants combinators combinators.short-circuit
 | 
			
		||||
destructors formatting fry images.loader kernel locals math
 | 
			
		||||
math.order math.parser namespaces opengl opengl.textures random
 | 
			
		||||
sequences timers ui ui.commands ui.gadgets ui.gadgets.toolbar
 | 
			
		||||
ui.gadgets.tracks ui.gadgets.worlds ui.gestures ui.pens.solid
 | 
			
		||||
ui.render words ;
 | 
			
		||||
 | 
			
		||||
IN: minesweeper
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +115,7 @@ DEFER: click-cell-at
 | 
			
		|||
        } case >>state drop t
 | 
			
		||||
    ] [ 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 new
 | 
			
		||||
| 
						 | 
				
			
			@ -122,7 +123,8 @@ TUPLE: grid-gadget < gadget cells timer textures start end ;
 | 
			
		|||
        mines place-mines update-counts >>cells
 | 
			
		||||
        H{ } clone >>textures
 | 
			
		||||
        dup '[ _ relayout-1 ] f 1 seconds <timer> >>timer
 | 
			
		||||
        COLOR: gray <solid> >>interior ;
 | 
			
		||||
        COLOR: gray <solid> >>interior
 | 
			
		||||
        "12345" <circular> >>hint? ;
 | 
			
		||||
 | 
			
		||||
M: grid-gadget graft*
 | 
			
		||||
    [ timer>> start-timer ] [ call-next-method ] bi ;
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +172,18 @@ M: grid-gadget pref-dim*
 | 
			
		|||
    textures>> [ load-image { 0 0 } <texture> ] cache
 | 
			
		||||
    [ 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 -- )
 | 
			
		||||
    gadget cells>> won? 0 n ? "%03d" sprintf [
 | 
			
		||||
        26 * 3 + 6 2array [
 | 
			
		||||
| 
						 | 
				
			
			@ -210,6 +224,7 @@ M: grid-gadget pref-dim*
 | 
			
		|||
 | 
			
		||||
M: grid-gadget draw-gadget*
 | 
			
		||||
    {
 | 
			
		||||
        [ draw-hint ]
 | 
			
		||||
        [ cells>> #mines-remaining ]
 | 
			
		||||
        [ draw-mines ]
 | 
			
		||||
        [ draw-smiley ]
 | 
			
		||||
| 
						 | 
				
			
			@ -250,6 +265,23 @@ M: grid-gadget draw-gadget*
 | 
			
		|||
        ] unless
 | 
			
		||||
    ] 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 -- )
 | 
			
		||||
    [ make-cells ] dip place-mines update-counts >>cells
 | 
			
		||||
    f >>start f >>end relayout-window ;
 | 
			
		||||
| 
						 | 
				
			
			@ -272,6 +304,10 @@ grid-gadget "gestures" [
 | 
			
		|||
        { T{ button-up { # 1 } } [ on-click ] }
 | 
			
		||||
        { T{ button-up { # 3 } } [ 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
 | 
			
		||||
] change-word-prop
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue