How to resolve the algorithm Bulls and cows step by step in the FutureBasic programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Bulls and cows step by step in the FutureBasic programming language

Table of Contents

Problem Statement

Bulls and Cows   is an old game played with pencil and paper that was later implemented using computers.

Create a four digit random number from the digits   1   to   9,   without duplication. The program should:

The score is computed as:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Bulls and cows step by step in the FutureBasic programming language

Source code in the futurebasic programming language

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

  

You may also check:How to resolve the algorithm Tic-tac-toe step by step in the ERRE programming language
You may also check:How to resolve the algorithm Range consolidation step by step in the 11l programming language
You may also check:How to resolve the algorithm Synchronous concurrency step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm Linear congruential generator step by step in the Pascal programming language
You may also check:How to resolve the algorithm ABC problem step by step in the APL programming language