- Day 21 - 選職業(4/n)
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/
Games::DrawCommand // 礦工抽牌行動GamesController
step model 用來儲存遊戲(每一步)紀錄phase,用來描述目前是哪個職業階段礦工 階段行動議員 階段行動建築 階段行動生產 階段行動交易 階段行動phase,用來描述目前是哪個職業階段step model 用來儲存遊戲(每一步)紀錄phase,用來描述目前是哪個職業階段目前的 game_data 紀錄的資料
為了知道目前是哪個職業階段,加入 phase 來儲存
rails new migration add_phase_to_games phase:integer
# db/migrate/20240922155101_add_phase_to_games.rb
class AddPhaseToGames < ActiveRecord::Migration[7.2]
  def change
    add_column :games, :phase, :integer, null: false, default: 0 # 0: unknown, 1: choose_role, 2: builder, 3: producer, 4: trader, 5: prospector, 6: councillor, 7: game_over
  end
end
game.rb 加上 enum 宣告# app/models/game.rb
class Game < ApplicationRecord
# ...
  
  enum :phase, {
    unknown: 0,
    choose_role: 1,
    builder: 2,
    producer: 3,
    trader: 4,
    prospector: 5,
    councillor: 6,
    game_over: 7
  }, suffix: true
# ...
end
start_new_game  class << self
    def start_new_game(seed: nil, game: nil)
      game ||= new(status: :playing, phase: :choose_role)
  # ...
為了計算下一位玩家是誰,定義以下方法
turn_over 告訴遊戲玩家行動結束phase_over 告訴遊戲 xx 階段結束round_over 告訴遊戲回合結束notify_turn_begins 通知玩家輪到你了turn_over 告訴遊戲玩家行動結束game_data 加上 waiting_players,儲存目前階段還沒輪過的玩家turn_over 時,如果
waiting_players 為空,表示階段結束 => 呼叫 phase_over
game.game_data[current_player_index] + 1 % PLAYER_SIZE => 呼叫 notify_turn_begins
phase_over 告訴遊戲 xx 階段結束有玩家擁有 12 棟建築」game_over
round_over
+2」=> 呼叫 notify_turn_begins
round_over 告訴遊戲回合結束+3」=> 呼叫 notify_turn_begins
notify_turn_begins 通知玩家輪到你了目前實作的的功能
turn_over
step model 用來儲存遊戲(每一步)紀錄phase,用來描述目前是哪個職業階段礦工 階段行動議員 階段行動建築 階段行動生產 階段行動交易 階段行動step model 用來儲存遊戲(每一步)紀錄以上不代表明天會做,如有雷同純屬巧合
SPT (Side Project Taiwan) 的宗旨是藉由Side Project開發來成就自我,透過持續學習和合作,共同推動技術和專業的發展。我們相信每一個參與者,無論是什麼專業,都能在這個社群中找到屬於自己的成長空間。
歡迎所有對Side Project開發有興趣的人加入我們,可以是有點子來找夥伴,也可以是來尋找有興趣的Side Project加入,邀請大家一同打造一個充滿活力且有意義的技術社群!
Discord頻道連結: https://sideproj.tw/dc