iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
SideProject30

placeholder系列 第 16

30天打造線上多人桌遊網站-Day 16-玩家建立,加入房間

  • 分享至 

  • xImage
  •  

0. 前情提要

  1. 接下來這幾天會朝著完成第一次 happy path 邁進

    1. done 玩家建立房間
    2. done 玩家加入房間
    3. todo 系統配置遊戲
    4. todo 玩家選擇行動
    5. todo (三次打牌失敗)
    6. todo 遊戲結束

1. 玩家建立房間

移除之前建立的 GameRoom,並重新建立一次

rails d scaffold GameRoom
rails g scaffold GameRoom name game_data:json

db 推倒重新來吧

rails db:drop
rails db:prepare

2. 玩家加入房間

在遊戲房間旁新增可以加入房間的連結

# app/views/game_rooms/_game_room.html.erb

+ <p>
+   <button type="button" data-action="hello#join_the_room" data-hello-room_id-param="<%= game_room.id %>" class="rounded-lg my-10 py-3 px-5 bg-blue-400 text-white">join the room</button>
+ </p>

# app/views/game_rooms/index.html.erb

+ <div data-controller="hello">
+   <div id="game_rooms" class="min-w-full">
+     <%= render @game_rooms %>
+   </div>
+   <p class="font-bold text-2xl" data-hello-target="title"></p>
+   <button type="button" data-action="hello#ping_the_room" class="rounded-lg py-3 px-5 bg-emerald-600 text-white">ping to the room</button>
  </div>
// app/javascript/controllers/hello_controller.js

join_the_room({ params: { roomId } }) {
  this.channel.joinGame({
    nickname: "Paul",
    roomId,
  });
}

channel 加上對應方法

// app/javascript/channels/chat_room_channels.js

joinGame(messageBody) {
  this.perform("join_game", messageBody);
}
# app/channels/chat_room_channel.rb

def join_game(data)
  game_room =  GameRoom.find_by id: data['roomId']

  return unless game_room

  if uuid.in? game_room.game_data['players']
    broadcast("#{uuid} has already joined room #{game_room.name}")
  else
    game_room.game_data['players'] << uuid
    game_room.save

    broadcast("#{uuid} has joined room #{game_room.name}")
  end
end

建立遊戲時將 game_data 初始化

# app/controllers/game_rooms_controller.rb

# POST /game_rooms or /game_rooms.json
def create
- @game_room = GameRoom.new(game_room_params)
+ @game_room = GameRoom.new(game_room_params) { _1.game_data = {players: []} }

問題

這時 玩家 還沒有建立模型,因此只要 websocket 重連,就會得到不同的 uuid

所以會新增以下 issues 要處理

  1. 建立玩家 ActiveRecord Model
  2. update identified_by :uuid to current_user.id
  3. re-render GameRoom when player joined the room

3. 結語

上述三個問題若沒處理,目前還是可以推進進度

因此明天先衝刺看能不能做到遊戲結束 /images/emoticon/emoticon29.gif

  1. todo 系統配置遊戲
  2. todo 玩家選擇行動
  3. todo (三次打牌失敗)
  4. todo 遊戲結束

Demo url -> https://ironman2023-hanabi.zeabur.app/


上一篇
30天打造線上多人桌遊網站-Day 15-找出第一版的 happy path
下一篇
30天打造線上多人桌遊網站-Day 17-開始遊戲-3次失敗-遊戲結束
系列文
placeholder20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言