iT邦幫忙

2021 iThome 鐵人賽

DAY 15
1
Software Development

透過迷霧,看破一切~~ZOOPARTY 動物園派對桌遊設計系列 第 15

[第十五隻羊] 迷霧森林舞會IX 玩家加入房間

  • 分享至 

  • xImage
  •  

天亮了 昨晚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,許多小幣都在做三角收斂,對應四種三角收斂末端表態來判斷走勢,但依然要記得小心誘多與大盤持續看空

天黑請閉眼


上一篇
[第十四隻羊] 迷霧森林舞會VII 開完房間後走進房間
下一篇
[第十六隻羊] 迷霧森林舞會X 熱線妳和我 hotwire 導入
系列文
透過迷霧,看破一切~~ZOOPARTY 動物園派對桌遊設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言