EC_BullsandCows

Works with: Euphoria version 4.0.3, 4.0.0 RC1 and later

Bulls and Cows is an old game played with pencil and paper that was later implemented on computer. The task is for the program to create a four digit random number from the digits 0 to 9, without duplication. The program should ask for guesses to this number, reject guesses that are malformed, then 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.

include std/sequence.e  
include std/console.e  
 
atom bulls = 0, cows = 0 
sequence bulls_string, cows_string 
 
sequence goal_num --computer's secret number digits 
sequence goal_check --marked as bull/cow indexes 
 
sequence guess_num --player's guess digits 
sequence guess_check --marked as bull/cow indexes 
 
integer tries = 0 --track number of tries to guess the number  
sequence tries_string -- for printing singular or plural of 'try' 
 
sequence numbers 
numbers = shuffle("0123456789") 
goal_num = numbers[1..4] 
 
procedure getInputAndProcess(integer stage = 1)  --stage = 1 sets default value for the 
						 --parameter if it isn't specified  
   
    goal_check = "0000"  --set these to unscanned (0) since the scanning will  
			 --start over.   
    guess_check = "0000" --these too, or they will contain old marks  
    tries += 1 
    bulls = 0 
    cows = 0 
     
    if stage <= 1 then --if this process was run for the first time or with no parameters, 
		       --then print instructions 
	puts(1,"The program has thought of a four digit number using only digits 0 to 9.\n") 
	puts(1,"Type your guess and press enter.\n")  
    end if  
 
    while 1 do --do this loop until we get a valid guess then exit 
	guess_num = gets(0) 
	-- filter out all characters except "0123456789" 
	guess_num = filter(guess_num, "in", {'0', '9'}, "[]") 
	if length(guess_num) != 4  then  
	    --if the input string is not exactly 4 digits, the input won't be used.  
	    puts(1,"\nYou didn't type 4 digits.\n") 
	    puts(1,"Try typing a new 4 digit number with only numbers 0 through 9.\n")  
	else  
	    exit 
	end if  
    end while  
     
    if compare(goal_num, guess_num) = 0 then 
	bulls = 4 
    else 
	--check for bulls  
	for i = 1 to 4 do  
	    if goal_num[i] = guess_num[i] then  
		goal_check[i] = '1' 
		guess_check[i] = '1' 
		bulls += 1  
	    end if  
	end for  
	--check for cows, but not slots marked as bulls or cows already.  
	goal_num += 0 
	guess_num += 0 
	for i = 1 to 4 do --loop through each guessed digit  
	    if guess_check[i] = '1' then --if the guessed digit we're comparing right now  
					 --has been marked as bull or cow already  
		continue --skip to the next guess digit without comparing this  
			 --guess digit to the other goal digits  
	    end if  
   
	    for j = 1 to 4 do --go through each goal digit,  
			      --comparing the first guessed digit,  
			      --and then the other guessed digits 2 through 4  
   
		if goal_check[j] = '1' then 
		    --if the goal digit we're comparing to right now has  
		    --been marked as a bull or cow already  
		    continue --skip to the next goal digit  
		end if  
 
		if guess_num[i] = goal_num[j] then 
		    --if the guessed digit is the same as  
		    --the goal one, it won't be a bull, so it's a cow  
		    cows += 1 --score one more cow  
		    goal_check[j] = '1' --mark this digit as a found cow in the sequence 
					--stores '0's or '1's as flags  
		    exit 
		    --skip to the next guess digit, so that this digit  
		    --won't try to check for matches(cow) with other goal digits  
		end if  
   
	    end for --this guess digit was compared to one goal digit , try comparing this 
		    --guess digit with the next goal digit  
	end for --this guess digit was compared with all goal digits, compare the next guess  
		--digit to all the goal digits 
    end if 
 
    if bulls = 1 then --uses singular noun when there is score of 1, else plural  
	bulls_string = "bull"  
    else  
	bulls_string = "bulls"  
    end if  
   
    if cows = 1 then --the same kind of thing as above block  
	cows_string = "cow"  
    else  
	cows_string = "cows"  
    end if  
   
   
end procedure  
--run the procedure  
getInputAndProcess(1) 
 
while 1 do 
    if bulls < 4 then --if less than 4 bulls were found, the player hasn't won 
	printf(1, "\nGuess #%d : You guessed %s. You found %d %s, %d %s. Type new guess.\n",  
	      {tries, guess_num, bulls, bulls_string, cows, cows_string} )  
	getInputAndProcess(2)  
    else --else they have won and the procedure ends  
	if tries = 1 then -- decide whether to use singular or plural of 'try' 
	    tries_string = "try" 
	else 
	    tries_string = "tries" 
	end if 
	printf(1, "\nThe number was %s. You guessed %s in %d %s.\n",  
	      {goal_num, goal_num, tries, tries_string})  
	any_key()--wait for keypress before closing console window.   
	exit 
    end if  
end while 
 

Output :

The program has thought of a four digit number using only digits 0 to 9. 
Type your guess and press enter. 
12345 
You didn't type 4 digits. 
Try typing a new 4 digit number with only numbers 0 through 9. 
abcd 
You didn't type 4 digits. 
Try typing a new 4 digit number with only numbers 0 through 9. 
012 
You didn't type 4 digits. 
Try typing a new 4 digit number with only numbers 0 through 9. 
0123 
Guess #1 : You guessed 0123. You found 0 bulls, 2 cows. Type new guess. 
1234 
Guess #2 : You guessed 1234. You found 0 bulls, 3 cows. Type new guess. 
5642 
Guess #3 : You guessed 5642. You found 1 bull, 1 cow. Type new guess. 
2347 
Guess #4 : You guessed 2347. You found 1 bull, 2 cows. Type new guess. 
4382 
Guess #5 : You guessed 4382. You found 3 bulls, 0 cows. Type new guess. 
4392 
The number was 4392. You guessed 4392 in 6 tries. 
Press Any Key to continue... 

This page has a chart to allow you to solve any number in a minimum amount of tries.

Not Categorized, Please Help

Search



Quick Links

User menu

Not signed in.

Misc Menu