Last active
February 15, 2022 19:40
-
-
Save robmiller/3ce85e8a2d1e33bd517da3e111c1e48d to your computer and use it in GitHub Desktop.
Revisions
-
robmiller revised this gist
Jan 10, 2022 . 1 changed file with 91 additions and 73 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -16,28 +16,33 @@ # Author: Rob Miller <r@robm.me.uk> def play formatter = ColourFormatter cheat = false while arg = ARGV.pop case arg when "--i-am-a-cheat" cheat = true when "--no-colour" formatter = MonoFormatter end end game = Game.new(formatter: formatter) if cheat puts "You cheat! The answer is… #{game.instance_variable_get(:@word)}" puts end puts formatter.legend puts until game.over? print "Guess #{game.current_guess}: " response = game.guess(gets.chomp) if response.valid? puts response.format puts "\e[9m#{game.wrong_letters.join(" ")}\e[0m" puts else @@ -53,67 +58,15 @@ def play end end class Game def initialize(formatter: ColourFormatter) @words = DATA.each_line.map(&:strip) @word = @words.sample @guesses = [] @guessed = false @formatter = formatter end def over? @@ -142,14 +95,14 @@ def guess(guess) guess = guess.to_s[0...5].downcase.strip unless @words.include? guess return Response.new([], valid: false, formatter: @formatter) end @guesses << guess if guess == word @guessed = true return Response.new(guess.chars.map { |char| [char, "correct"] }, valid: true, formatter: @formatter) end letters = guess.chars.each_with_index.map do |c, n| @@ -162,7 +115,7 @@ def guess(guess) end end Response.new(letters, valid: true, formatter: @formatter) end def answer @@ -176,18 +129,83 @@ def answer end class Response def initialize(letters, valid: true, formatter:) @letters = letters @valid = valid @formatter = formatter end def valid? @valid end def format @formatter.new(letters).format end attr_reader :letters end class ColourFormatter def initialize(clue) @clue = clue end def format @clue.map do |letter, answer| case answer when "correct" "\e[1;97;42m#{letter.upcase}\e[0m" when "partial" "\e[1;97;43m#{letter.upcase}\e[0m" when "wrong" letter end end.join(" ") end class << self def legend <<~LEGEND How to play \e[1;97;42mA\e[0m = correct (right letter, right place) \e[1;97;43mA\e[0m = partially correct (right letter, wrong place) A = incorrect LEGEND end end end class MonoFormatter def initialize(clue) @clue = clue end def format @clue.map do |letter, answer| case answer when "correct" "\e[7m#{letter.upcase}\e[0m" when "partial" "\e[1;4m#{letter.upcase}\e[0m" when "wrong" "\e[9m#{letter.upcase}\e[0m" end end.join(" ") end class << self def legend <<~LEGEND \e[7mA\e[0m = correct (right letter, right place) \e[1;4mA\e[0m = partially correct (right letter, wrong place) \e[9mA\e[0m = incorrect LEGEND end end end play __END__ -
robmiller revised this gist
Jan 9, 2022 . 1 changed file with 54 additions and 3 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -18,10 +18,20 @@ def play game = Game.new $colours = true while arg = ARGV.pop case arg when "--cheat" puts game.instance_variable_get(:@word) puts when "--no-colour" $colours = false end end puts legend until game.over? print "Guess #{game.current_guess}: " response = game.guess(gets.chomp) @@ -44,6 +54,14 @@ def play end def format(clue) if $colour colour_format(clue) else mono_format(clue) end end def colour_format(clue) clue.map do |letter, answer| case answer when "correct" @@ -56,6 +74,39 @@ def format(clue) end.join(" ") end def mono_format(clue) clue.map do |letter, answer| case answer when "correct" "\e[7m#{letter.upcase}\e[0m" when "partial" "\e[1;4m#{letter.upcase}\e[0m" when "wrong" "\e[9m#{letter.upcase}\e[0m" end end.join(" ") end def legend legend = "" legend << "How to play\n" if $colour legend << "\e[1;97;42mA\e[0m = correct (right letter, right place)\n" legend << "\e[1;97;43mA\e[0m = partially correct (right letter, wrong place)\n" legend << "A = incorrect\n" else legend << "\e[7mA\e[0m = correct (right letter, right place)\n" legend << "\e[1;4mA\e[0m = partially correct (right letter, wrong place)\n" legend << "\e[9mA\e[0m = incorrect\n" end legend << "\n" legend end class Game def initialize @words = DATA.each_line.map(&:strip) @@ -98,7 +149,7 @@ def guess(guess) if guess == word @guessed = true return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true) end letters = guess.chars.each_with_index.map do |c, n| -
robmiller revised this gist
Jan 8, 2022 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -98,7 +98,7 @@ def guess(guess) if guess == word @guessed = true return Response.new(guess.chars.map { |char| [char, "correct"] }, valid: true) end letters = guess.chars.each_with_index.map do |c, n| -
robmiller revised this gist
Jan 7, 2022 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -66,7 +66,7 @@ def initialize end def over? num_guesses >= 6 || guessed? end def guessed? -
robmiller revised this gist
Jan 7, 2022 . 1 changed file with 11 additions and 9 deletions.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -23,7 +23,7 @@ def play end until game.over? print "Guess #{game.current_guess}: " response = game.guess(gets.chomp) if response.valid? clue = format(response.letters) @@ -58,23 +58,27 @@ def format(clue) class Game def initialize @words = DATA.each_line.map(&:strip) @word = @words.sample @guesses = [] @guessed = false end def over? num_guesses >= 5 || guessed? end def guessed? @guessed end def num_guesses @guesses.length end def current_guess num_guesses + 1 end def wrong_letters @@ -92,8 +96,6 @@ def guess(guess) @guesses << guess if guess == word @guessed = true return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true) -
robmiller created this gist
Jan 3, 2022 .There are no files selected for viewing