天亮了 昨晚1號玩家被殺死了
洛神:昨晚1號玩家被殺死了,1號玩家發動角色技能,請問要帶走的對象是?
1號:6號
洛神:6號淘汰,請至淘汰區
2號:1號是獵人他帶了6號,但是6號的身份未知,然後我講一下為什麼我做不成狼,剛兩個預言家很明顯9號講的比較有力度,如果我是狼的話我就直接站邊9號就好了,幹嘛還要讓大家有多一個質疑我的..
另一邊正在觀看直播的森林裡突然間,水池上螢幕出現了許多黑白相間的雜訊打斷了2號玩家的對話
聲音也變得斷斷續續的
鴨嘴獸泰迪察覺不對勁
見狀立刻跳進水池內
圖片來源
待續..
我們這15天已經已經可以成功建立房間並指派創建房間的使用者為室長
我們今天要再調整一下這個架構
昨天那個架構的問題會在
使用者離開之後還要脫掉室長的頭銜
室長在這個架構情境下
應該要跟著房間裡的座位:seat`` 而不是使用者
:user 但是這桌遊情境除了室長之外 我們還有玩家遊戲中的身份牌 所以我們既然一開始規劃就有把資料庫中的
:seat從
:room```中拆分出來
角色身份就理應要跟著座位
這樣還有另一個好處是當如果因為一些斷線情形
使用者身份沒有徹底清除的話
綁在座位的角色身份也不會造成加入別的房間而造成判別錯誤
也就是這個房間的這個座位職責有多重身份與其他房間無關
所以很抱歉我昨天沒想清楚
因為傳統上角色會跟使用者綁定是為了類似全站的角色認定或是會員關係管理
這次這個情境的角色與職責只會存在於房間內部的座位上
既然如此
我們把 rolify跟user關聯拆掉重新做一次
先把db還原到上一個階段
$ bundle exec rake db:rollback
rollback之後就可以把昨天加的 migration 刪掉2021092907xxxx_rolify_create_roles.rb
然後刪除後再建一次
這次針對 :seat
這個資料庫做角色設定
$ rails d rolify Role User
$ rails g rolify Role Seat
上面指令會幫忙生成這些檔案
invoke active_record
create app/models/role.rb
invoke test_unit
create test/models/role_test.rb
create test/fixtures/roles.yml
insert app/models/role.rb
create db/migrate/20210930072913_rolify_create_roles.rb
在 seat.rb 中加上 rolify
class Seat < ApplicationRecord
rolify
belongs_to :room
...
在 room.rb 中加上 resourcify
class Room < ApplicationRecord
resourcify
has_many :seats, dependent: :destroy
...
這樣我們便可以待會就可以將有玩家的座位指定身份了
在使用者有登入或是註冊的情況下
使用者可以從房間列表中進入房間
首先
我們將原本的assign_seat_to_mayor(@room)
改成
assign_seat_to_user(@room)
def create
@room = Room.new(room_params)
if @room.validate(room_params)
@room.board = Room.boards[room_params[:board]]
@room.save
if @room.seats.count == 0 && @room.roles.pluck(:name).exclude?('mayor')
create_seats(@room.id, @room.number_of_gamer)
assign_seat_to_user(@room)
redirect_to room_path(@room), notice: '房間建立成功'
else
redirect_to new_room_path, notice: '發生錯誤 請重新建立房間'
end
else
render :new
end
end
def show
assign_seat_to_user(@room)
end
def assign_seat_to_user(room)
empty_seats = Seat.empty_seat_collection(room)
occupied_seats = Seat.occupied_seat_collection(room)
current_user.update(room_id: current_user.id)
if empty_seats.count > 0 && occupied_seats.pluck(:user_id).exclude?(current_user.id)
seat = empty_seats.sample
seat.update(user_id: current_user.id)
seat.add_role :mayor, room unless @room.roles.pluck(:name).include?('mayor')
else
# have no seat, stay this room as visitor
end
end
def purify_user_before_left_room(room)
occupied_seats = Seat.occupied_seat_collection(room)
# clear user rolify in the room and re-assign mayor role
clear_the_seat = occupied_seats.select{|s| s.user_id = current_user.id}
clear_the_seat.update(user_id: nil) unless clear_the_seat.blank?
clear_the_seat.remove_role :mayor if clear_the_seat.has_role? :mayor
current_user.update(room_id: nil)
# clear seat from occupied to empty
if empty_seats <= 0
# hide the empty room
else
# assign new mayor
seat = occupied_seats.sample
seat.add_role :mayor, room
end
end
如此一來 當使用者進入房間時
有座位就可以加入房間變成玩家
沒有的話就會是觀戰模式
這個事$HEGIC,許多小幣都在做三角收斂,對應四種三角收斂末端表態來判斷走勢,但依然要記得小心誘多與大盤持續看空
天黑請閉眼