Active player rotates after hand played

This commit is contained in:
Jesse C. Fisher 2015-08-08 05:28:39 -07:00
parent ca423cae99
commit 23308abc97
3 changed files with 37 additions and 10 deletions

View File

@ -35,6 +35,10 @@ class GamesController < ApplicationController
card.save card.save
end end
# TODO: Ensure active player only changes when valid hand is played
@game.set_active_player 'next'
@game.save
# TODO: add current_hand logic # TODO: add current_hand logic
# @hand > @game.hand_to_beat # @hand > @game.hand_to_beat
redirect_to @game redirect_to @game

View File

@ -7,6 +7,11 @@ class Game < ActiveRecord::Base
accepts_nested_attributes_for :players accepts_nested_attributes_for :players
validates :title, presence: true validates :title, presence: true
# TODO: Simplify to a single attribute
alias_attribute :current_player_id, :control_player_id
alias_attribute :active_player_id, :control_player_id
alias_attribute :active_player, :control_player
def start def start
validate_startable validate_startable
return false unless startable? return false unless startable?
@ -81,6 +86,17 @@ class Game < ActiveRecord::Base
players.count >= 4 players.count >= 4
end end
def set_active_player(arg)
case arg
when 'next'
self.active_player_id = self.next_player_id
end
end
def next_player_id
player_ids[(player_ids.index(current_player_id) + 1 ) % player_ids.length]
end
# The player whose turn it is # The player whose turn it is
def control_player def control_player
self.players.find(self.control_player_id) self.players.find(self.control_player_id)

View File

@ -68,19 +68,26 @@ feature 'Play a hand', type: :feature do
# Given I am the current player # Given I am the current player
# When I play a hand # When I play a hand
# Then the next player becomes the current player # Then the next player becomes the current player
scenario 'current player rotates after a valid hand' do scenario 'active player rotates after a valid hand' do
skip 'to be implemented' @game = setup_game
game = setup_game login_as(@game.active_player.user, scope: :user)
login_as(game.current_player.user, scope: :user) @next_player_id = @game.next_player_id
@current_player_id = game.current_player.id @active_player_id = @game.active_player.id
@current_player_index = game.players.index(game.current_player) @active_player_index = @game.players.index(@game.active_player)
visit game_path game visit game_path @game
@card_to_play = game.current_player.player_cards.order(:value).first @card_to_play = @game.active_player.player_cards.order(:value).first
check @card_to_play.to_s check @card_to_play.to_s
click_button 'Play Hand' click_button 'Play Hand'
# reload the game object instance
@game.reload
expect(page).to have_content('Played ' + @card_to_play.to_s) expect(page).to have_content('Played ' + @card_to_play.to_s)
expect(game.current_player.id).to_not eq(@current_player_id)
expect(game.players.index(game.current_player)).to eq( (@current_player_id + 1) % 2) # render active player style
expect(page).to have_content(@game.players.find(@next_player_id).user.email + " My Turn")
# next player is now the active player
expect(@game.active_player_id).to_not eq(@active_player_id)
expect(@game.active_player_id).to eq(@next_player_id)
end end
# Scenario: Player can play a valid hand on their turn # Scenario: Player can play a valid hand on their turn