You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
8 years ago
|
# By alan snape
|
||
|
# All rights reserved.
|
||
|
|
||
|
class RockPaperScissors
|
||
|
|
||
|
# Exceptions this class can raise:
|
||
|
class NoSuchStrategyError < StandardError; end
|
||
|
|
||
|
# check strategy is legal or not
|
||
|
def self.checkStrategy(stg)
|
||
|
if 'P' != stg && 'R' != stg && 'S' != stg then
|
||
|
raise NoSuchStrategyError, 'Strategy must be one of R,P,S'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# a single round game
|
||
|
def self.winner(player1, player2)
|
||
|
stg1, stg2 = player1[1], player2[1]
|
||
|
self.checkStrategy(stg1)
|
||
|
self.checkStrategy(stg2)
|
||
|
if stg1 == stg2 then
|
||
|
return player1
|
||
|
elsif 'P' == stg1 && 'S' == stg2 then
|
||
|
return player2
|
||
|
elsif 'S' == stg1 && 'P' == stg2 then
|
||
|
return player1
|
||
|
else
|
||
|
return stg1 < stg2 ? player1 : player2
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# if there is a sub game then returns the winner of it
|
||
|
# else return this player himself
|
||
|
def self.tournament_match(game)
|
||
|
if game[0].kind_of?(Array) then
|
||
|
return self.tournament_winner(game)
|
||
|
else
|
||
|
return game
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# tournament game rounds
|
||
|
def self.tournament_winner(tournament)
|
||
|
player1 = self.tournament_match(tournament[0])
|
||
|
player2 = self.tournament_match(tournament[1])
|
||
|
return self.winner(player1, player2)
|
||
|
end
|
||
|
|
||
|
end
|