iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
  1. Day 22 - 建立 Step model 用來儲存遊戲(每一步)紀錄
    Current Sprint: 3. 遊戲基本流程完成
    repo: https://github.com/side-project-at-SPT/ithome-ironman-2024-san-juan
    swagger docs: https://side-project-at-spt.github.io/ithome-ironman-2024-san-juan/

前情提要

為了計算下一位玩家是誰,定義以下方法

  1. turn_over 告訴遊戲玩家行動結束
  2. phase_over 告訴遊戲 xx 階段結束
  3. round_over 告訴遊戲回合結束
  4. notify_turn_begins 通知玩家輪到你了

sprint 3 遊戲基本流程完成

  • 建築卡片資料
  • ✅ 增加遊戲狀態 phase,用來描述目前是哪個職業階段
  • 選職業:開始職業階段
  • 行動結束,更換目前玩家
  • 執行 礦工 階段行動
  • ⛳ 建立 step model 用來儲存遊戲(每一步)紀錄
  • 🚧 回合開始
  • 建築卡片功能實作
  • 執行 議員 階段行動
  • 執行 建築 階段行動
  • 執行 生產 階段行動
  • 執行 交易 階段行動
  • 遊戲結束

今天要做

  • ⛳ 建立 step model 用來儲存遊戲(每一步)紀錄

建立 step model

rails g model step game:belongs_to game_data:json description steps:integer reason:integer
# db/migrate/20240923173105_create_game_steps.rb

class CreateGameSteps < ActiveRecord::Migration[7.2]
  def change
    create_table :game_steps do |t|
      t.belongs_to :game, null: false, foreign_key: true
      t.json :game_data, null: false, default: {}
      t.string :description
      t.integer :steps, null: false
      t.integer :reason, null: false, default: 0
      # 0: unknown, 1: game_init, 2: choose_role, 3: builder_action, 4: producer_action,
      # 5: trader_action, 6: prospector_action, 7: councillor_action, 8: game_over
      # 9: round_begin, 10: round_end,
      # 11: phase_begin, 12: phase_end
      # 13: player_turn_begin, 14: player_turn_end

      t.timestamps
      t.index [ :game_id, :steps ], unique: true
    end
  end
end
# app/models/game_step.rb

class GameStep < ApplicationRecord
  belongs_to :game

  enum :reason, {
    unknown: 0,
    game_init: 1,
    choose_role: 2,
    builder_action: 3,
    producer_action: 4,
    trader_action: 5,
    prospector_action: 6,
    councillor_action: 7,
    game_over: 8,
    round_begin: 9,
    round_end: 10,
    phase_begin: 11,
    phase_end: 12,
    player_turn_begin: 13,
    player_turn_end: 14
  }, prefix: true
end

定義 generate_game_steps 用來建立 game_step

# app/models/game.rb

class Game < ApplicationRecord
# ...
  has_many :game_steps

  def generate_game_steps(reason: 0, description: "")
    steps = game_steps.last&.steps || -1
    game_steps.create(game_data: game_data, steps: steps + 1, reason: reason, description: description)
  end
# ...
end

在各個重要狀態改變時機,呼叫 generate_game_steps

  • choose_role: choose_role
  • notify_next_turn_begins: player_turn_begin
  • phase_over: phase_end
  • prospector_draw: prospector_action
  • start_new_round: round_begin
  • turn_over: player_turn_end

之後可以在方法內呼叫 websocket broadcast
達到前端播放動畫的效果

收工

明天要做什麼

  • 🆕 串接 websocket

以上不代表明天會做,如有雷同純屬巧合


工商服務

SPT (Side Project Taiwan) 的宗旨是藉由Side Project開發來成就自我,透過持續學習和合作,共同推動技術和專業的發展。我們相信每一個參與者,無論是什麼專業,都能在這個社群中找到屬於自己的成長空間。

歡迎所有對Side Project開發有興趣的人加入我們,可以是有點子來找夥伴,也可以是來尋找有興趣的Side Project加入,邀請大家一同打造一個充滿活力且有意義的技術社群!

Discord頻道連結: https://sideproj.tw/dc


上一篇
Day 21 - 選職業(4/n)
下一篇
Day 23 - 串接 websocket (use ActionCable)
系列文
透過實作網頁遊戲練習網站工程師的基本素養,以 San Juan(聖胡安) 為例。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言