2011-03-24 70 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