Bulls and Cows


Task

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

The program should:

   ask for guesses to this number
   reject guesses that are malformed
   print the score for the guess


The score is computed as:

 The player wins if the guess is the same as the randomly chosen number, and the program ends.
 A score of one bull is accumulated for each digit in the guess that equals the corresponding digit in the randomly chosen initial number.
 A score of one cow is accumulated for each digit in the guess that also appears in the randomly chosen number, but in the wrong position.


Related tasks

   Bulls and cows/Player
   Guess the number
   Guess the number/With Feedback
   Mastermind


 
'by rbytes, January 2017
OPTION BASE 1
P("  B U L L S   A N D    C O W S")!l
P("A secret 4-digit number has been created, with")
P("no repeats and no zeros. You must guess the number.")
P("After each guess, you will be shown how many of your")
P("digits are correct and in the matching location (bulls),")
P("and how many are correct but in a different location (cows).")
p("See how many tries it takes you to get the right answer.")
' generate a 4-digit number with no repeats
guesses  =   0
1 WHILE LEN(sec$) <4
  c$ =CHR$( INTEG(RND(1) *9) +49)
  IF INSTR(sec$, c$)=-1 THEN sec$&=c$
ENDWHILE!l
2 PRINT "Your guess: "
INPUT "FOUR DIGITS": guess$!l
IF guess$="" THEN       ' check if entry is null
  P("Please enter something!")!l
  GOTO 2
ENDIF
P(guess$)!l
IF LEN(guess$)<>4 THEN  ' check if entry is exactly 4 characters
  P("Please enter exactly 4 digits.")!l
  GOTO 2
ENDIF
FOR t=1 TO 4            ' check if all characters are digits 1 - 9
  IF INSTR("123456789",MID$(guess$,t,1))=-1 THEN
    P("You have entered at least one illegal character")!l
    GOTO 2
  ENDIF
NEXT t
rep = check(guess$)     ' check if any digits are repeated
IF check.chk THEN
  P("Please enter a number with no repeated digits.")!l
  GOTO 2
ENDIF
 
guesses+=1
r$=score$(guess$,sec$)
P(r$)!l
 
IF guess$=sec$ THEN
  P("W I N N E R ! ! !")!l
  IF guesses>1 THEN gs$="guesses!" ELSE gs$="guess!"
  P("You won after "&guesses&" "&gs$)
  P("Thanks for playing!")!l
  PAUSE 2
  P("A G A I N  with a new secret number")!l
  guesses=0
END IF
GOTO 1
END '   _____________________________________________________________
 
DEF P(p$)              ' function to print a string
  PRINT p$
END DEF
 
DEF L()                ' function to print an empty line
  PRINT
END DEF
 
DEF check(i$)          ' check=0 if digit is not repeated, else=1
  chk=0
  FOR i =1 TO 3
    FOR j =i +1 TO 4
      IF MID$( i$, i, 1)=MID$( i$, j, 1) THEN chk =1
    NEXT j
  NEXT i
END DEF
 
DEF score$(a$,b$)      ' calculate the numbers of bulls & cows.
  bulls=0!cows=0
  FOR i = 1 TO 4
    c$ = MID$( a$, i, 1)
    IF MID$( b$, i, 1)=c$ THEN
      bulls+=1
    ELSE
      IF INSTR( b$, c$) <>-1 AND INSTR( b$, c$) <>i THEN
        cows+=1
      END IF
    END IF
  NEXT i
  r$ ="Bulls: "&STR$( bulls)& ", "& "Cows: " &STR$( cows)
  RETURN r$
END DEF
END
 