天亮了 昨晚是平安夜
海馬的自爆攻擊
讓整座迷霧森林火勢開始蔓延開來
就在大家絕望之際
呱呱趁著一隻海馬要撞到樹幹之前
用舌頭捲住了他
海馬被纏在軟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
有了角色之後
要使用昨天做好的發牌器
對應不同板子的 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, 但是他比較需要長線
在這邊謝謝隊友跟隊長揪我參戰
我的隊友們真的都很優秀
雖然發牌做完了
但還有嚴峻的 view 端要處理
之所以用嚴峻形容
是因為 hotwire 在半年之後的雷有點多
我還需要一點時間補齊
因為他幫你非同步顯示資料
所以目前透過devise註冊後afte_sign_up_path導頁後不會轉跳
git repository 請容我明天調整一下再上傳
給hotwire一些評論
中文好像還沒有大大寫文
一開始導入vue是想說要透過vue跟dom來實作牌的非同步
後來看hotwire還沒人提及 所以先來踩踩來
上上週覺得這遲早要研究的所以剛好藉這個機會試試看
但如果問建議我還是覺得先不要...
這個只是會造成跟你合作的人的困擾
況且連整devise都有問題了(也或許是我的問題)
我的意思是說
這東西概念或出發點或許很好
但夥伴如果不熟悉甚至有雷
你只是會讓前端夥伴踩雷
就算像這次動物園派對一樣全端
還是不太建議在production產品上用
remote true或是vue react乖乖用
或是等成熟一點
但發牌那邊我還是會試著處理看看
嚴格來說選這題目對我來說太難了...
有點變成駭客松了
壓力太大還不能睡覺
但做出來給桌遊社群跟技術社群參考希望也是能給點借鏡
總之萬分感謝 非常感謝各位參賽者唷
感謝森上梅友錢
毛毛跟阿虎就要跟大家說後會有期囉