Created
November 18, 2011 11:10
-
-
Save gerrit/1376192 to your computer and use it in GitHub Desktop.
This file contains 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
#!/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 |
This file contains 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
➔ ./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