2011-03-24 65 views
1

我工作在Rails Web應用程序的小模擬的棋盤遊戲Agricola一個記分卡。阿格里科拉棋盤遊戲分數卡建模Rails中

的問題是:什麼/如何是最好的(閱讀:正確)的方式在Rails的評分卡模型?

目前,我有一個ScoreCard模型,其中列是計入最終分數的'類別'。這就像一句:

class ScoreCard < ActiveRecord::Base 
    validates :field_tile, 
      :pasture, 
      :grain, 
      :vegetable, 
      :sheep, 
      :wild_boar, 
      :cattle, 
      :unused_space, 
      :fenced_stable, 
      :clay_room, 
      :stone_room, 
      :family_member, 
      :victory_point, 
      :bonus_point, 
      :numericality => true 
end 

計分機制描述in this game manual(參見第8頁上的「計分」部分)。下面是從手動片段:

領域:所有領域瓦片上 玩家的農場進行評分, 不管他們是否是 當前休耕或播種。有0或1場的玩家 失1分。所述第一得分之後的每個 字段1點, 高達5個或 多個字段的最大的4個點。球員得分-1/1/2/3/4 點0-1/2/3/4/5 +字段。

牧場:分數是 圍欄區域(「牧場」),而不是爲 數的農家空間是 圍欄(「牧場空間」)的。個別牧場的大小 是 無關。沒有牧場的玩家 失去1分。每個牧場分數1個 點,最多的4點 4個或更多的牧場。玩家對0/1/2/3/4 +牧場的得分爲 -1/1/2/3/4點。

由於每個「類別」(牧場,穀物等)具有不同的評分機構,我定義返回的每個「類別」最終得分一些私有方法:

private 
    def calculate_field_tiles_score 
    case field_tile 
     when 0..1 then -1 
     when 2..4 then field_tile - 1 
     else 4 
    end 
    end 

    def calculate_pasture_score 
    # return proper score 
    end 

我也有一個(公)calculate方法,其中計算最終得分模式:

def calculate 
    calculate_field_tiles_score + 
    calculate_pasture_score + 
    # ... other scores 
end 

這是一個好辦法?我不確定建模的正確方式是什麼,但它不「感覺正確」。

回答

2

我會去的線沿線的東西:

class Scorer 
    def initialize(farmyard); @farmyard=farmyard; end 
end 

class FieldTilesScorer < Scorer 
    def score 
    case @farmyard.field_tile 
     #etc 
    end 
    end 
end 

class PasturesScorer < Scorer 
    def score 
    #return proper score 
    end 
end 

等。然後,當我想得分農場,我會怎麼做:

[FieldTilesScorer, PastureScorer, ...]. 
    map{|s| s.new(@farmyard).score}. 
    inject(0){|m,r| m+r} 

你建模每個類別作爲自己的階級通過這種方式,並可以很容易地在農家加上狀態的任意組合依賴規則。

+0

我不太明白你的第二段代碼(帶有'map'和'inject'的代碼片段)。你能簡單解釋一下嗎? – ryanprayogo 2011-03-24 20:25:30

+0

「地圖」將每位得分人都稱爲「@ farmyard」,從而生成個性化得分列表。 'inject'遍歷該分數列表,並通過調用具有先前結果的塊(從0開始)和列表中的當前項目給出總分數來對它們進行求和。 – oconnor0 2011-03-24 21:57:28

+0

是的,就是這樣。以每位得分者給出的分數爲準,然後添加它們。很簡單,真的:-) – regularfry 2011-03-25 10:38:09