blob: 1b927b9f1fc26cce4db5b79b7d0daae700545b1a [file] [log] [blame]
package rockpaperscissors
// RockPaperScissors describes the interface for playing a game of
// Rock-Paper-Scissors. (http://en.wikipedia.org/wiki/Rock-paper-scissors)
// There are three different roles in the game:
//
// 1. Judge: A judge enforces the rules of the game and decides who the
// winner is. At the end of the game, the judge reports the final score
// to all the score keepers.
// 2. Player: A player can ask a judge to start a new game, it can challenge
// another player, and it can play a game.
// 3. ScoreKeeper: A score keeper receives the final score for a game after it
// ended.
type RockPaperScissors interface {
Judge
Player
ScoreKeeper
}
type Judge interface {
// CreateGame creates a new game with the given game options and returns a game
// identifier that can be used by the players to join the game.
CreateGame(Opts GameOptions) (GameID, error)
// Play lets a player join an existing game and play.
Play(ID GameID) stream<PlayerAction,JudgeAction> (PlayResult, error)
}
// A GameID is used to uniquely identify a game within one Judge.
type GameID struct {
ID string
}
// GameOptions specifies the parameters of a game.
type GameOptions struct {
NumRounds int32 // The number of rounds that a player must win to win the game.
GameType GameTypeTag // The type of game to play: Classic or LizardSpock.
}
type GameTypeTag byte
const (
Classic = GameTypeTag(0) // Rock-Paper-Scissors
LizardSpock = GameTypeTag(1) // Rock-Paper-Scissors-Lizard-Spock
)
type PlayerAction struct {
Move string // The move that the player wants to make.
Quit bool // Whether the player wants to quit the game.
}
type JudgeAction struct {
PlayerNum int32 // The player's number.
OpponentName string // The name of the opponent.
MoveOptions []string // A list of allowed moves that the player must choose from. Not always present.
RoundResult Round // The result of the previous round. Not always present.
Score ScoreCard // The result of the game. Not always present.
}
// Round represents the state of a round.
type Round struct {
Moves [2]string // Each player's move.
Comment string // A text comment from judge about the round.
Winner WinnerTag // Who won the round.
StartTimeNS int64 // The time at which the round started.
EndTimeNS int64 // The time at which the round ended.
}
// WinnerTag is a type used to indicate whether a round or a game was a draw,
// was won by player 1 or was won by player 2.
type WinnerTag byte
const (
Draw = WinnerTag(0)
Player1 = WinnerTag(1)
Player2 = WinnerTag(2)
)
// PlayResult is the value returned by the Play method. It indicates the outcome of the game.
type PlayResult struct {
YouWon bool // True if the player receiving the result won the game.
}
// Player can receive challenges from other players.
type Player interface {
// Challenge is used by other players to challenge this player to a game. If
// the challenge is accepted, the method returns nil.
Challenge(Address string, ID GameID, Opts GameOptions) error
}
// ScoreKeeper receives the outcome of games from Judges.
type ScoreKeeper interface {
Record(Score ScoreCard) error
}
type ScoreCard struct {
Opts GameOptions // The game options.
Judge string // The name of the judge.
Players []string // The name of the players.
Rounds []Round // The outcome of each round.
StartTimeNS int64 // The time at which the game started.
EndTimeNS int64 // The time at which the game ended.
Winner WinnerTag // Who won the game.
}