Skip to content

Instantly share code, notes, and snippets.

@simonstastny
Created June 23, 2012 11:52
Show Gist options
  • Save simonstastny/2978010 to your computer and use it in GitHub Desktop.
Save simonstastny/2978010 to your computer and use it in GitHub Desktop.
MasterMind game: computer-vs-computer
# 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