[第三十只羊] 迷雾森林终章 决斗,抽牌

天亮了 昨晚是平安夜

关於迷雾森林故事

金色山脉

海马的自爆攻击
让整座迷雾森林火势开始蔓延开来
就在大家绝望之际
呱呱趁着一只海马要撞到树干之前
用舌头卷住了他
海马被缠在软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
有点变成骇客松了
压力太大还不能睡觉
但做出来给桌游社群跟技术社群参考希望也是能给点借镜
总之万分感谢 非常感谢各位参赛者唷
感谢森上梅友钱
毛毛跟阿虎就要跟大家说後会有期罗


<<:  【Day 30】Google Apps Script - 延伸篇 -系列回顾与学习资源整理

>>:  Day 30: 遗漏的章节

Day-03 Regression & Gradient Descent 介绍

我们昨天聊过了到底如何做机器学习,且也知道机器学习的核心概念是取得所谓的最佳 function,回...

【Day 23】Go 基础小笔记 IV:goroutine、channel

身为并发(concurrency)小能手的 Go 的重要特色 有了 channel 好像几乎不需要...

[Day 22] - 『转职工作的Lessons learned』 - GraphQL (Hasura) - Apollo Client

GraphQL (Hasura)系列,忘记介绍最一开始从前端连线到GraphQL (Hasura)一...

玩转 Storybook: Day 30 总结 & 学习资源

根据研究指出,重用程序码可以节省42–81%的时间,并提高生产力 40%。易於共享UI元件的Desi...

[DAY9]制作容器(八)

9/25: 隔一天才发现因为前一天字数不够,草稿发文不成功所以断赛了QQ 还是把昨天测试的结果放上来...