Created
June 23, 2012 11:52
-
-
Save simonstastny/2978010 to your computer and use it in GitHub Desktop.
MasterMind game: computer-vs-computer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# MasterMind Ruby implementation | |
# by Simon Stastny | |
# June 23, 2012 | |
#GAME SETUP | |
ALPHABET = "12345678" | |
SIZE = 4 | |
COLORS = 6 | |
USED_ALPHABET = ALPHABET.slice(0..COLORS-1) | |
#GAME RULES IMPLEMENTATION | |
def white_pegs (solution, proposed) | |
pegs = 0 | |
SIZE.times {|c| if solution[c] == proposed[c]; pegs+=1; end } | |
return pegs | |
end | |
def black_pegs (solution, proposed) | |
pegs = 0 | |
USED_ALPHABET.split("").collect { |x| pegs += [proposed.scan(x).length,solution.scan(x).length].min } | |
return pegs - white_pegs(solution, proposed) | |
end | |
def is_correct? | |
return $wpegs == SIZE | |
end | |
def is_guess_valid?(guess) | |
return guess.size == SIZE && guess.split("").all? { |x| USED_ALPHABET.scan(x).size > 0 } | |
end | |
#GENERATING SOLUTIONS | |
def generate | |
(0...SIZE).map{ USED_ALPHABET.split("").to_a[rand(USED_ALPHABET.size)] }.join | |
end | |
#GUESSING | |
#PC | |
def let_computer_guess | |
proposed = generate | |
while not is_guess_possible? proposed | |
proposed = generate | |
end | |
return proposed | |
end | |
def is_guess_possible?(guess) | |
if $black_map.has_key?(guess) | |
return false | |
end | |
if $black_map.size > 0 | |
return $black_map.all? { |k,v| black_pegs(guess, k) == v } && $white_map.all? { |k,v| white_pegs(guess, k) == v } | |
else | |
return true | |
end | |
end | |
#HUMAN | |
def let_player_guess | |
puts "---------------" | |
puts "Yout next guess:" | |
proposed = gets.chomp | |
while not is_guess_valid? proposed | |
puts "Invalid answer. Answer again:" | |
proposed = gets.chomp | |
end | |
return proposed | |
end | |
def get_white_score | |
puts "Tell how many white pegs: " | |
gets.chomp.to_i | |
end | |
def get_black_score | |
puts "Tell how many black pegs: " | |
gets.chomp.to_i | |
end | |
def play | |
proposed = $get_guess.call | |
puts "---------------" | |
puts "guess: " + proposed | |
$wpegs = $score_white.call($solution,proposed) | |
$bpegs = $score_black.call($solution,proposed) | |
$black_map.store(proposed, $bpegs) | |
$white_map.store(proposed, $wpegs) | |
puts "white pegs: " + $wpegs.to_s | |
puts "black pegs: " + $bpegs.to_s | |
puts "\n\n" | |
if is_correct? | |
puts "Solution is " + proposed + "." | |
end | |
return proposed | |
end | |
#GAME ------------------------------------------------------------ | |
$black_map = {} | |
$white_map = {} | |
puts "Welcome to MasterMind" | |
puts "---------------\n" | |
puts "\nWho is solver today? (HUMAN or PC) " | |
$solver = gets.chomp | |
puts "\nWho is code maker today? (HUMAN or PC)? " | |
$maker = gets.chomp | |
puts "\n\n\n" | |
if $maker == "PC" | |
$solution = generate | |
end | |
i = 0 | |
$get_guess = lambda { if $solver == "PC"; return let_computer_guess; else return let_player_guess; end} | |
$score_white = lambda { |solution,proposed| if $maker == "HUMAN"; return get_white_score; else return white_pegs(solution,proposed); end} | |
$score_black = lambda { |solution,proposed| if $maker == "HUMAN"; return get_black_score; else return black_pegs(solution,proposed); end} | |
#GAME LOOP | |
loop do | |
i+=1; | |
puts "Round " + i.to_s | |
play | |
break if is_correct? | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment