class RockPaperScissors require_relative 'RPSrb/Version.rb' # make choices constant (2d list) CHOICES = [['r', 'rock'], ['p', 'paper'], ['s', 'scissors']] # define an entry to symbol dictionary 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 VALID_ENTRIES = NTRY_TO_SYM.keys # define possible computer choices COMPUTER_CHOICES = NTRY_TO_SYM.values # define winners 2d array WINNERS = [ [:SCISSORS, :PAPER ], [:PAPER , :ROCK ], [:ROCK , :SCISSORS] ] # map array for losers LOSERS = WINNERS.map { |winning_choice,losing_choice| [losing_choice,winning_choice] } class << self # define entry point for game protected 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 protected def initialize @player_score = @computer_score = @ties = 0 end # define play game method 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 private 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 private 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 private def final_outcome(pl, co) return :WIN if pl > co return :LOSE if pl < co end end require 'exec.rb'