iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
  1. 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

sprint 3 遊戲基本流程完成

  • 🆕 建立 step model 用來儲存遊戲(每一步)紀錄
  • 🆕 增加遊戲狀態 phase,用來描述目前是哪個職業階段
  • 建築卡片資料
  • 建築卡片功能實作
  • 選職業:開始職業階段
    • 🆕 更新目前玩家
    • 選完職業,更新遊戲狀態
      • 更新 controller
      • 更新測試,產生 swagger
    • 判斷有沒有什麼動作可以由系統接續自動執行
  • 執行 礦工 階段行動
  • 執行 議員 階段行動
  • 執行 建築 階段行動
  • 執行 生產 階段行動
  • 執行 交易 階段行動
  • 行動結束,更換目前玩家
  • 回合開始
  • 遊戲結束

今天要做

  • 增加遊戲狀態 phase,用來描述目前是哪個職業階段
  • 更新目前玩家
  • 建立 step model 用來儲存遊戲(每一步)紀錄

增加遊戲狀態 phase,用來描述目前是哪個職業階段

目前的 game_data 紀錄的資料

  • players
  • current_player_index
  • trading_house_order
  • supply_pile
  • roles

為了知道目前是哪個職業階段,加入 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)
  # ...

更新目前玩家

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

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

turn_over 告訴遊戲玩家行動結束

  1. game_data 加上 waiting_players,儲存目前階段還沒輪過的玩家
  2. 執行 turn_over 時,如果
    1. waiting_players 為空,表示階段結束 => 呼叫 phase_over
    2. 否則,輪到下一位玩家 game.game_data[current_player_index] + 1 % PLAYER_SIZE => 呼叫 notify_turn_begins

phase_over 告訴遊戲 xx 階段結束

  1. 檢查是否滿足遊戲結束條件 「有玩家擁有 12 棟建築
  2. 若有 => game_over
  3. 若沒有,檢查是否每位玩家都選過職業了
  4. 若有 => round_over
  5. 否則 => 計算下一位玩家 => 當前玩家的下一位玩家是本階段起始玩家 => 所以下一位玩家 要 「+2」=> 呼叫 notify_turn_begins

round_over 告訴遊戲回合結束

  1. 重置可供選擇的職業卡
  2. 重置玩家所選的職業
  3. 🚧 檢查玩家手牌
  4. 計算下一位玩家 => 當前玩家的下兩位玩家是本回合起始玩家 => 所以下一位玩家 要 「+3」=> 呼叫 notify_turn_begins

notify_turn_begins 通知玩家輪到你了

目前實作的的功能

  1. 如果是 選職業階段
    1. 如果是 bot => 隨機選
    2. 如果是 human => 等他選
  2. 如果是 職業階段 => 跳過 => call turn_over

TODO

  • 建築卡片功能實作
  • 建立 step model 用來儲存遊戲(每一步)紀錄
  • 增加遊戲狀態 phase,用來描述目前是哪個職業階段
  • 選職業:開始職業階段
    • 更新目前玩家
    • 選完職業,更新遊戲狀態
      • 更新 controller
      • 更新測試,產生 swagger
    • 判斷有沒有什麼動作可以由系統接續自動執行
  • 執行 礦工 階段行動
  • 執行 議員 階段行動
  • 執行 建築 階段行動
  • 執行 生產 階段行動
  • 執行 交易 階段行動
  • 行動結束,更換目前玩家
  • 🚧 回合開始
  • 遊戲結束

明天要做什麼

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

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


工商服務

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

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

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


上一篇
Day 20 - 選職業(3/n)
下一篇
Day 22 - 建立 Step model 用來儲存遊戲(每一步)紀錄
系列文
透過實作網頁遊戲練習網站工程師的基本素養,以 San Juan(聖胡安) 為例。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言