iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
Software Development

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

[第三十隻羊] 迷霧森林終章 決鬥,抽牌

天亮了 昨晚是平安夜

關於迷霧森林故事

金色山脈

海馬的自爆攻擊
讓整座迷霧森林火勢開始蔓延開來
就在大家絕望之際
呱呱趁著一隻海馬要撞到樹幹之前
用舌頭捲住了他
海馬被纏在軟Q的呱呱口中
沒有碰撞就沒有爆炸
兔兔見狀馬上輕輕觸摸了一下藍色花型水晶

圖片來源
帶著弓箭
在箭頭有草繩綁著呱呱剛抓住的海馬屏氣凝神地等待著
天空中的Rocket月亮
見狀開始大口吸了一大口氣
大量海馬金粉被Rocket吸入體內之後
Rocket月亮在天空中越來越大顆
蹦尬~爆炸在天空中
散落成千億顆沙塵掉落在迷霧森林之中
火勢就被這些Rocket月亮變成的沙撲滅
整片森林少了火光與月光
頓時變成一片漆黑
就在這個時刻
兔兔放箭
瞬間變暗的時間差
讓在明處的Lulu閃避不及
Lulu大喊著:好討厭的感覺

直接被海馬撞擊爆炸在天空之中
迷霧森林也因此變成了沙丘

甜甜發光金粉依然散佈在沙丘之上

..完

備註
狼人殺故事中場來源:

動物園派對

好,我們來處理壓軸,抽牌
我們先用rake task幫忙建立固定角色
角色目前分成角色名稱、角色id(role_id)、所屬陣營
技能部分日後實作再回頭來加

/app/lib/tasks/default_role.rake

namespace :default_role do
  desc "Create villager role template"
  task generate_villager: :environment do
    Village.create(title:'村民', role: 0, party: 0)
    Village.create(title:'預言家', role: 1, party: 0)
    Village.create(title:'女巫', role: 2, party: 0)
    Village.create(title:'獵人', role: 3, party: 0)
    Village.create(title:'守衛', role: 4, party: 0)
    Village.create(title:'狼王', role: 5, party: 1)
    Village.create(title:'小狼', role: 6, party: 1)
  end
end

接下來執行

$ bundle exec rake default_role:generate_villager 

這麼一來我們就有標準板子的遊戲角色了
我們到rails console看看有沒有儲存成功

$ rails console
[1] pry(main)> Village.all

https://ithelp.ithome.com.tw/upload/images/20211015/20131155znVLuk6jnX.png
有了角色之後
要使用昨天做好的發牌器
對應不同板子的 enum 值生成不同張數的遊戲角色

/app/services/card_dealer.rb

# frozen_string_literal: true

class CardDealer
  def initialize(board_id)
    @board_id = board_id
  end

  def create
    villagers = []
    villager = Village.find_by(role: 0)
    seer = Village.find_by(role: 1)
    witch = Village.find_by(role: 2)
    hunter = Village.find_by(role: 3)
    savior = Village.find_by(role: 4)
    wolfking = Village.find_by(role: 5)
    wolf = Village.find_by(role: 6)
    case @board_id
    when 0
      # board is standard version for 12 player
      # villagersx4, seerx1, witchx1, hunterx1, saviorx1, wolfx3, wolfkingx1

      4.times do
        villagers << villager
      end
      villagers << seer
      villagers << witch
      villagers << hunter
      villagers << wolfking
      villagers << savior
      3.times do
        villagers << wolf
      end
      villagers
    end
  end
end

接下來我們前幾天做好的房間內 UI
針對室長的身份才會在右上角出現的開始遊戲按鈕

當室長按下開始遊戲按鈕之後
發牌,重新洗牌之後再分配給每個座位的玩家
所以我們需要先把前台按鈕改成表單發送
先到routes加入開始遊戲路徑

/routues
  resources :rooms do
    put :start
  end

然好修改房間內頁

/app/views/rooms/show.erb

<div class="rounded-lg shadow bg-base-200 drawer h-30">
  <div class="w-full navbar bg-base-300">
    <div class="flex-1 px-2 mx-2">
      <span>
            動物園派對
          </span>
    </div>
    <div class="flex-none hidden lg:block">
      <ul class="menu horizontal">
        <li>
          <% if @is_mayor_player %>
            <%= simple_form_for @room, url: "/rooms/#{@room.id}/start", method: :put, dom_id:(@room.id) do |f| %>
                <%=  f.submit '開始遊戲', class: 'btn btn-primary float-right mr-10'  %>
            <% end %>
            <% end %>
        </li>
      </ul>
    </div>
  </div>
</div>
...

再到rooms_controller中
新增這個action並開始透過我們昨天做好的services發牌
因為他們之間的關聯是has_many:through的關係
所以可以直接塞進去

/app/controller/rooms_controller
  def start
    @room = Room.find( params[:room_id])
    villager_of_cards = CardDealer.new(Room.boards[@room.board]).run
    random_cards = villager_of_cards.sample(12)
    
    @room.seats.each do |seat|
      random_cards.each do |card|
        seat.villages << card
      end
    end
  end

今日阿虎選幣

$ftt 最後選ftt, 但是他比較需要長線

心得

在這邊謝謝隊友跟隊長揪我參戰
我的隊友們真的都很優秀
https://ithelp.ithome.com.tw/upload/images/20211015/20131155e7dkOh7Pcl.png
雖然發牌做完了
但還有嚴峻的 view 端要處理
之所以用嚴峻形容
是因為 hotwire 在半年之後的雷有點多
我還需要一點時間補齊
因為他幫你非同步顯示資料
所以目前透過devise註冊後afte_sign_up_path導頁後不會轉跳
git repository 請容我明天調整一下再上傳
給hotwire一些評論
中文好像還沒有大大寫文
一開始導入vue是想說要透過vue跟dom來實作牌的非同步
後來看hotwire還沒人提及 所以先來踩踩來
上上週覺得這遲早要研究的所以剛好藉這個機會試試看
但如果問建議我還是覺得先不要...
這個只是會造成跟你合作的人的困擾
況且連整devise都有問題了(也或許是我的問題)
我的意思是說
這東西概念或出發點或許很好
但夥伴如果不熟悉甚至有雷
你只是會讓前端夥伴踩雷
就算像這次動物園派對一樣全端
還是不太建議在production產品上用
remote true或是vue react乖乖用
或是等成熟一點
但發牌那邊我還是會試著處理看看
嚴格來說選這題目對我來說太難了...
https://ithelp.ithome.com.tw/upload/images/20211015/20131155hMDzCaedsB.png
有點變成駭客松了
壓力太大還不能睡覺
但做出來給桌遊社群跟技術社群參考希望也是能給點借鏡
總之萬分感謝 非常感謝各位參賽者唷
感謝森上梅友錢
毛毛跟阿虎就要跟大家說後會有期囉


上一篇
[第二十九隻羊] 迷霧森林交響樂章 發牌邏輯
系列文
透過迷霧,看破一切~~ZOOPARTY 動物園派對桌遊設計30

尚未有邦友留言

立即登入留言