Skip to content

Instantly share code, notes, and snippets.

@gerrit
Created November 18, 2011 11:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gerrit/1376192 to your computer and use it in GitHub Desktop.
Save gerrit/1376192 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# encoding: utf-8
# Developed using Ruby 1.9.3, should run under any version of Ruby 1.9
# Create a small command line game in Ruby that does the following:
#
#- Player 1 enters a letter. The program uses the google api to search for that
# letter and outputs the number of search results. - Player 2 adds a letter.
# The program displays the whole series of letters and outputs the number of
# search results. - This continues until the combined word doesn't yield any
# results. The player who entered the last letter loses the game
#
GOOGLE_API_KEY = 'AIzaSyDWaZ8-dqAPHXSeRrqBu2QXYt9zkwOA31w'
require 'cgi'
require 'open-uri'
require 'yaml'
class Hash
# Formats the hash as a URI query string (not including the “?”)
# HACK: only handles flat query strings, not nested hashes/arrays
# like ActiveSupport’s Object#to_query
def to_query
collect {|k,v| CGI.escape(k.to_s)+'='+CGI.escape(v.to_s) }.join('&')
end
end
# Find +term+ using the Google “Ajax” Web Search API
# HACK: The web search API is deprecated! This should probably migrate
# to using the Custom Search API (http://code.google.com/apis/websearch/docs/)
# This requires more setup before in setting up a search context etc.
# so we use the deprecated API for now
def google_search term
# search_endpoint = 'https://www.googleapis.com/customsearch/v1'
search_endpoint = 'https://ajax.googleapis.com/ajax/services/search/web'
uri = URI.parse search_endpoint
uri.query = {v: '1.0', key: GOOGLE_API_KEY, q: term}.to_query
# exploiting the fact that YAML is a super-set of JSON here
YAML.load(uri.read)
end
# Returns the results of a google search
def google_result_count term
# google gives us a string like "85,800,000"
count = google_search(term)['responseData']['cursor']['resultCount']
count.gsub(',','').to_i rescue 0
end
# Prompt the named player for a letter on the console
def prompt player_name
print "#{player_name}, please enter a letter: "
input = gets.chomp
if input =~ /^[A-Za-zÆæÅåØøÄäÖöÜüß]$/
input
else
puts "“#{input}” isn’t a single letter, please try again."
prompt player_name
end
end
if __FILE__ == $PROGRAM_NAME
trap("INT") { abort "(Cancelled)" }
term = ''
loop do
["Player 1", "Player 2"].each do |name|
term << prompt(name)
count = google_result_count(term)
if count > 0
puts "#{count} results for “#{term}”"
else
puts "No results for “#{term}”. You lose, #{name}!"
exit
end
end
end
end
➔ ./magame
Player 1, please enter a letter: R
464000000 results for “R”
Player 2, please enter a letter: a
68000000 results for “Ra”
Player 1, please enter a letter: ro
“ro” isn’t a single letter, please try again.
Player 1, please enter a letter: r
50200000 results for “Rar”
Player 2, please enter a letter: o
6100000 results for “Raro”
Player 1, please enter a letter: t
1980 results for “Rarot”
Player 2, please enter a letter: o
n1360 results for “Raroto”
Player 1, please enter a letter: n
“nn” isn’t a single letter, please try again.
Player 1, please enter a letter: n
342 results for “Raroton”
Player 2, please enter a letter: g
531 results for “Rarotong”
Player 1, please enter a letter: a
244000 results for “Rarotonga”
Player 2, please enter a letter:
“ ” isn’t a single letter, please try again.
Player 2, please enter a letter: i
2270 results for “Rarotongai”
Player 1, please enter a letter: s
3360 results for “Rarotongais”
Player 2, please enter a letter: v
No results for “Rarotongaisv”. You lose, Player 2!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment