天亮了 昨晚是平安夜
海马的自爆攻击
让整座迷雾森林火势开始蔓延开来
就在大家绝望之际
呱呱趁着一只海马要撞到树干之前
用舌头卷住了他
海马被缠在软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乖乖用
或是等成熟一点
但发牌那边我还是会试着处理看看
严格来说选这题目对我来说太难了...
有点变成骇客松了
压力太大还不能睡觉
但做出来给桌游社群跟技术社群参考希望也是能给点借镜
总之万分感谢 非常感谢各位参赛者唷
感谢森上梅友钱
毛毛跟阿虎就要跟大家说後会有期罗
<<: 【Day 30】Google Apps Script - 延伸篇 -系列回顾与学习资源整理
我们昨天聊过了到底如何做机器学习,且也知道机器学习的核心概念是取得所谓的最佳 function,回...
身为并发(concurrency)小能手的 Go 的重要特色 有了 channel 好像几乎不需要...
GraphQL (Hasura)系列,忘记介绍最一开始从前端连线到GraphQL (Hasura)一...
根据研究指出,重用程序码可以节省42–81%的时间,并提高生产力 40%。易於共享UI元件的Desi...
9/25: 隔一天才发现因为前一天字数不够,草稿发文不成功所以断赛了QQ 还是把昨天测试的结果放上来...