class RockPaperScissors require_relative 'RPSrb/Version.rb' # == Make choices constant (2d list) # this 2d array contains all the options (in string format) the user can use CHOICES = [['r', 'rock'], ['p', 'paper'], ['s', 'scissors']] # == Define an entry to symbol hash # this is a "hash" that contains the keys and values for winning and losing NTRY_TO_SYM = { CHOICES[0][0] => :ROCK , CHOICES[0][1] => :ROCK , CHOICES[1][0] => :PAPER , CHOICES[1][1] => :PAPER , CHOICES[2][0] => :SCISSORS, CHOICES[2][1] => :SCISSORS } # === Define what our valid entries out # grab the keys of the hash VALID_ENTRIES = NTRY_TO_SYM.keys # == Define possible computer choices # grab the values of the hash COMPUTER_CHOICES = NTRY_TO_SYM.values # == Define winners 2d array # defines winners in 2d array/list format WINNERS = [ [:SCISSORS, :PAPER ], [:PAPER , :ROCK ], [:ROCK , :SCISSORS] ] # == Map array for losers # this flips the items in the `WINNERS` 2d array LOSERS = WINNERS.map { |winning_choice,losing_choice| [losing_choice,winning_choice] } class << self # == Define entry point for game # this function is private private def continue(str1,str2,str3) puts str1 print str2 gets puts str3 end end continue("\nYou are about to enter a rock-paper-scissors best of 3 match.", "\nPress the return/enter key to continue...", "") # == Define constructor for class def initialize @player_score = @computer_score = @ties = 0 end # == Define play game method # this method will be public # it will also constain most of the "play" functioonality for this game public def play(winning_score) while @player_score < winning_score && @computer_score < winning_score puts "\nPlayer score: #{@player_score}, " + "Computer score: #{@computer_score}, Ties: #{@ties}.\n" player = player_choice computer = COMPUTER_CHOICES.sample # chooses a random option puts "\nPlayer chooses #{player.to_s.downcase}." puts "Computer chooses #{computer.to_s.downcase}.\n" case player_outcome [player, computer] when :WIN printf "\n%s beats %s, player wins the round. \n\n" % [player.to_s.capitalize, computer.to_s.downcase] @player_score += 1 when :LOSE printf "\n%s beats %s, computer wins the round.\n\n" % [computer.to_s.capitalize, player.to_s.downcase] @computer_score += 1 else puts "\nTie, choose again\n" @ties += 1 end end printf "\nFinal score:\nplayer: %i, computer: %i; (ties: %i).\n\n" % [@player_score, @computer_score, @ties] case final_outcome(@player_score, @computer_score) when :WIN puts "Player wins!\n" when :LOSE puts "Computer wins!\n" end print "\n[press the enter/return key to exit game]" gets puts end # == Make player choice method # this method will be protected # this will sanity check the user's choice protected def player_choice loop do print "\nChoose: Rock (r), Paper (p), or Scissors (s): " choice = gets.chomp.downcase if NTRY_TO_SYM.key?(choice) return NTRY_TO_SYM[choice] elsif choice != VALID_ENTRIES puts "\nThat entry is invalid. Please re-enter.\n" else return nil end end end # == Define player outcome # this method is protected # this defines the round outcome of the game protected def player_outcome(plays) return :WIN if WINNERS.include?(plays) return :LOSE if LOSERS.include?(plays) return :TIE if !:WIN | !:LOSE end # == Define final outcome function # this method is protected # this will determine who wins the whole match in the end protected def final_outcome(pl, co) return :WIN if pl > co return :LOSE if pl < co end end require 'exec.rb'