include "NSLog.incl" str15 guess, goal short x, y cgRect wndrect begin enum 1 _window _bullLabel _cowLabel _horzLine _vertLine _newGameBtn _alert = 101 end enum void local fn showStr( string as str15 ) short r x = 20 for r = 1 to string[0] print %(x,y)chr$( string[r] ); x += 39 next end fn void local fn NewGame str15 ch goal = "" : guess = "" :y = 20 window _window,,wndRect text ,,fn colorRed cls fn showStr( "????" ) do ch = chr$(rnd(9) or _"0") if instr$(0, goal, ch) == 0 then goal += ch until goal[0] == 4 nslog(@"%u",val&(goal)) //unrem for testing y += 48 end fn local fn SetWindowFrame CGRect r = fn WindowContentRect( _window ) r.size.height += 32 r.origin.y -= 32 window _window,,r if ( r.origin.y < 150 ) alert _alert,, @"Too many guesses!",, @"Give up", YES fn newGame end if end fn local fn play( ch as str15 ) short r, bulls = 0, cows = 0 if instr$(0, guess, ch) then exit fn guess += ch text,,fn colorDarkGray fn showStr( guess ) if guess[0] < 4 then exit fn for r = 1 to 4 if goal[r] == guess[r] then bulls++ : continue if instr$(0, goal, chr$(guess[r]) ) then cows++ next select case bulls == 4 text ,,fn colorRed print %(x + 31, y)("W I N!") y = 20 : fn showStr( goal ) case else : print %(x + 35, y)bulls;" "; cows y += 32 : guess = "" end select fn SetWindowFrame end fn void local fn BuildWindow subclass window _window, @"Bulls and cows", (0,0,311,114), NSWindowStyleMaskTitled + NSWindowStyleMaskClosable wndrect = = fn WindowContentRect( _window ) textlabel _bullLabel, @"🐂", (198,59,38,40) textlabel _cowLabel, @"🐄", (255,59,38,40) ControlSetFontWithName( _bullLabel, NULL, 30 ) ControlSetFontWithName( _cowLabel, NULL, 30 ) box _horzLine,, (12,50,287,5), NSBoxSeparator box _vertLine,, (180,12,5,90), NSBoxSeparator ViewSetAutoresizingMask( _vertLine, NSViewHeightSizable ) button _newGameBtn,,, @"New Game", (198,13,100,32) ViewSetAutoresizingMask( _newGameBtn, NSViewMaxYMargin ) text @"menlo bold",24,,fn ColorWindowBackground end fn void local fn DoDialog( evt as long, tag as long ) select ( evt ) case _windowKeyDown //: stop short ch = intval( fn EventCharacters ) if ch then fn play( chr$( ch or _"0" ) ):DialogEventSetBool(YES) case _btnClick : fn NewGame case _windowWillClose : end end select end fn on dialog fn DoDialog fn buildWindow fn newGame HandleEvents