èšèšã§äœæããã¢ãã«ãšå®è£ ã«äœ¿ãããã°ã©ã ã®å¯Ÿå¿ã¥ããã§ãããŸããã ãã®å¯Ÿå¿ã¥ããåæã«ãããŠãªã³ã°ã¹ã³ã¢ã®ã¢ãã«ã®äœæãé²ããŸãããã
[scoresheet01] ãèŠããšããã¬ãŒã ã®è¡šç€ºã¯ãã²ãŒã ã®é²è¡ç¶æ³ã«ãã£ãŠå€ãã£ãŠããŸãã
-
ãŸã ãã¬ãŒããŠããªããã¬ãŒã
-
1æç®ã®æçãåŸ ã£ãŠãããã¬ãŒã ïŒçŸåšã®ãã¬ãŒã€ãŒã®çŸåšã®ãã¬ãŒã ã®1æç®ã®åïŒ
-
2æç®ã®æçãåŸ ã£ãŠãããã¬ãŒã ïŒçŸåšã®ãã¬ãŒã€ãŒã®çŸåšã®ãã¬ãŒã ã®2æç®ã®åïŒ
-
2æç®ãæçãããŠç²åŸãã³æ°ã確å®ãããã¬ãŒã ïŒ1,2æç®ã®ãã³æ°ãšããŒã¿ã«ã¹ã³ã¢ã衚瀺ãããŠããïŒ
-
ã¹ãã©ã€ã¯ã®ããŒãã¹ã確å®ããªããã¬ãŒã ïŒã¹ãã©ã€ã¯ã®èšé²ã ãã§ããŒã¿ã«ã¹ã³ã¢ã¯è¡šç€ºãããŠããªãïŒ
-
ã¹ãã¢ã®ããŒãã¹ã確å®ããªããã¬ãŒã ïŒ1æç®ãšã¹ãã¢ã®èšé²ã ãã§ããŒã¿ã«ã¹ã³ã¢ã¯è¡šç€ºãããŠããªãïŒ
-
ã¹ãã¢ãŸãã¯ã¹ãã©ã€ã¯ã®ããŒãã¹ã確å®ãããã¬ãŒã ïŒ1,2æç®ã®ãã³æ°ãšããŒã¿ã«ã¹ã³ã¢ã衚瀺ãããŠããïŒ
ããããã«ã€ããŠãããå°ã詳ããèŠãŠã¿ãŸãããã
ãŸã ãã¬ãŒããŠãªããã¬ãŒã ã¯ããã¬ãŒã ã®æåã®ç¶æ ã§ãïŒ ãŸã ãã¬ãŒããŠããªããã¬ãŒã ïŒã ãã®ãã¬ãŒã ã¯ããã³æ°ã®å ¥åãåŸ ã£ãŠããŸããã
çŸåšãã¬ãŒäžã®ãã¬ãŒã ã§ããŸã 1æç®ãæçãããŠããªãç¶æ ã®ãã¬ãŒã ã§ãïŒ 1æç®ã®æçãåŸ ã£ãŠãããã¬ãŒã ïŒã 次ã«ãã³æ°ãåãåããšããã®ãã¬ãŒã ã®1æç®ã«èšé²ãããŸãã
çŸåšãã¬ãŒäžã®ãã¬ãŒã ã§ã1æç®ãã¹ãã©ã€ã¯ã§ãªãã£ããšãã«2æç®ãåŸ ã£ãŠããç¶æ ã®ãã¬ãŒã ã§ãïŒ 2æç®ã®æçãåŸ ã£ãŠãããã¬ãŒã ïŒã 次ã«ãã³æ°ãåãåããšããã®ãã¬ãŒã ã®2æç®ã«èšé²ãããŸãã
çŸåšãã¬ãŒäžã®ãã¬ãŒã ã®åã®ãã¬ãŒã ãã¹ãã¢ã§ãçŸåšã®ãã¬ãŒã ã1æç®ã®æçãåŸ ã£ãŠãããšããåã®ãã¬ãŒã ã¯ã¹ãã¢ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ç¶æ ã§ãïŒ ã¹ãã¢ã®ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ãã¬ãŒã ïŒã 次ã«ãã³æ°ãåãåããšãçŸåšã®ãã¬ãŒã ã®1æç®ã«èšé²ããããšãšãã«ãåã®ãã¬ãŒã ã®ã¹ãã¢ããŒãã¹ã確å®ããŸãã
ã¹ãã©ã€ã¯ããŒãã¹ã®ç¢ºå®åŸ ã¡ã«ã¯2éãã®å ŽåããããŸãã
1ã€ç®ã¯ãçŸåšãã¬ãŒäžã®ãã¬ãŒã ã®åã®ãã¬ãŒã ãã¹ãã©ã€ã¯ã§ãçŸåšã®ãã¬ãŒã ã2æç®ã®æçãåŸ ã£ãŠãããšãã§ãã ãã®ãšããåã®ãã¬ãŒã ã¯ã¹ãã©ã€ã¯ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ç¶æ ã§ãïŒ ã¹ãã©ã€ã¯ã®ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ãã¬ãŒã ïŒæ¬¡ãã¹ãã©ã€ã¯ã§ãªãïŒ ïŒã 次ã«ãã³æ°ãåãåããšãçŸåšã®ãã¬ãŒã ã®2æç®ã«èšé²ããããšãšãã«ãåã®ãã¬ãŒã ã®ã¹ãã©ã€ã¯ããŒãã¹ã確å®ããŸãã
2ã€ç®ã¯ãçŸåšãã¬ãŒäžã®ãã¬ãŒã ã1æç®ã®æçãåŸ ã£ãŠããŠãåã®ãã¬ãŒã ãšåã®åã®ãã¬ãŒã ããšãã«ã¹ãã©ã€ã¯ã§ãã£ããšãïŒããã«ã®ãšãïŒãšãã§ãã ãã®ãšããåã®åã®ãã¬ãŒã ã¯ã¹ãã©ã€ã¯ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ç¶æ ã§ãïŒ ã¹ãã©ã€ã¯ã®ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ãã¬ãŒã ïŒæ¬¡ãã¹ãã©ã€ã¯ïŒ ïŒã 次ã«ãã³æ°ãåãåããšãçŸåšã®ãã¬ãŒã ã®1æç®ã«èšé²ããããšãšãã«ãåã®åã®ãã¬ãŒã ã®ã¹ãã©ã€ã¯ããŒãã¹ã確å®ããŸãã
çŸåšã®ãã¬ãŒã ãã¹ãã¢ãã¹ãã©ã€ã¯ã«ãªããªãã£ããšãããã®ãã¬ãŒã ã¯ããŒãã¹ã®ç¢ºå®åŸ ã¡ã«ãªããããã®æ®µéã§ãã®ãã¬ãŒã ã®ããŒã¿ã«ïŒããŒãã¹ãªãã®ç²åŸãã³æ°ïŒã確å®ããŸãã
ã¹ãã¢ããŒãã¹ã®ç¢ºå®åŸ ã¡ããŸãã¯ã¹ãã©ã€ã¯ããŒãã¹ã®ç¢ºå®åŸ ã¡ã®ãã¬ãŒã ã¯ãåŸã®ãã¬ãŒã ã®æçã«ãã£ãŠããŒãã¹ã確å®ãããšããã¬ãŒã ã®ããŒã¿ã«ã確å®ããŸãã ãã®ãšãã確å®åŸ ã¡ã®ãã¬ãŒã ã§ã¯ããã®ãã¬ãŒã ã®ç²åŸãã³æ°ãšç¢ºå®ããããŒãã¹ã®åèšããã®ãã¬ãŒã ã®ããŒã¿ã«ã§ãã
ãã¬ãŒã ã®ããŒã¿ã«ãæ±ãããããšããã以åã®ãã¬ãŒã ãŸã§ã®ãã®ã¹ã®ããŒã¿ã«ãã«ãã®ãã¬ãŒã ã®ããŒã¿ã«ãå ç®ããŠãã®ã¹ã®ããŒã¿ã«ãæŽæ°ããŸãããããŠãæŽæ°ããã®ã¹ã®ããŒã¿ã«ããã¬ãŒã ã®äžéšã«èšé²ãããŸãïŒ 2æç®ãæçããŠããã³æ°ã確å®ãããã¬ãŒã ïŒã®ã¹ã®ããŒã¿ã«ãæ±ããããŠããïŒ ïŒã ãã®ãšãã確å®åŸ ã¡ã«ãªã£ãŠãããã¬ãŒã ãã®ã¹ã®ããŒã¿ã«ãæŽæ°ããããã®æ®µéã®ã²ãŒã ã®ããŒã¿ã«ãæŽæ°ãããŸãã
ãã¬ãŒã ã®ç¶æ ãæ€èšããçµæããã¬ãŒã ã¯ã²ãŒã ã®ç¶æ³ã«ãã£ãŠå€ããè€æ°ã®ç¶æ ãæã€ããšãããããŸããã ãŸãããã¬ãŒã ã衚瀺ã§ããæ å ±ããç¶æ ã«ãã£ãŠç°ãªãããšãããããŸããã ãã®ããšããã¢ãã«å³ã䜿ã£ãŠè¡šããŠã¿ãŸãããã ç¶æ ãšãã®æšç§»ïŒç¶æ é·ç§»ãšåŒã³ãŸãïŒãè¡šãã«ã¯ãã¹ããŒããã·ã³å³ã䜿ããŸãã
ãFrameãã¯ã©ã¹ã®ç¶æ ãè¡šãå³ãæãããã®ã§ããFrameãã¯ã©ã¹ã«å³ãè¿œå ããŸãããã
-
ãFrameãã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ãè¿œå ãã
-
æ§é ããªãŒãããFrameãã¯ã©ã¹ãéžæããå³ã¯ãªãã¯ããŠãããã¢ããã¡ãã¥ãŒã衚瀺ããïŒ ãFrame]ã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ãè¿œå ãã ïŒã
-
ãå³ã®è¿œå ïŒã¹ããŒããã·ã³å³ãã§ã¹ããŒããã·ã³å³ãè¿œå ãããã
-
-
ã¹ããŒããã·ã³å³ã«ååãã€ãã
-
è¿œå ããã¹ããŒããã·ã³å³ã®ããããã£ãŒã®ãããŒã¹ããéãã
-
ååãç·šéããŠãFrameã¯ã©ã¹ã®ã¹ããŒããã·ã³å³ããšããã
-
ãã€ã¢ã°ã©ã ãšãã£ã¿ã®ã¿ã€ãã«ãã¿ãã«ãåæ ãããã
-
ã¹ããŒããã·ã³å³ã«ããã¬ãŒã ã®ç¶æ ãšç¶æ é·ç§»ãè¿œå ããŸãããã
-
ãFrameãã¯ã©ã¹ã®æåã®ç¶æ ãäœæããïŒ ãFrameãã¯ã©ã¹ã®ã¹ããŒããã·ã³å³ã«æåã®ç¶æ ãè¿œå ãã ïŒã
-
ãã¬ãããããéå§ç䌌ç¶æ ããéžæããã¹ããŒããã·ã³å³ã«è¿œå ããã
-
ãã¬ãããããç¶æ ããéžæããã¹ããŒããã·ã³å³ã«è¿œå ããã
-
ããŸã ãã¬ãŒããŠããªããç¶æ ããRESERVEDããšããååã«ããã
-
ãã¬ãããããé·ç§»ããéžæããŠããéå§ç䌌ç¶æ ããããRESERVEDããžé·ç§»ãåŒãã
-
-
æåã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ããïŒ ãFrameãã¯ã©ã¹ã®ã¹ããŒããã·ã³å³ã«1æç®ã®åã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ãã ïŒã
-
ã1æç®ã®æçãåŸ ã£ãŠãããç¶æ ãBEFORE_1STããè¿œå ããã
-
ãRESERVEDããããBEFORE_1STããžç¶æ é·ç§»ãåŒããã€ãã³ããSETUPããå²ãåœãŠãã
-
-
1æç®ã®åŸã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ããïŒ ãFrameãã¯ã©ã¹ã®ã¹ããŒããã·ã³å³ã«1æç®ã®åŸã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ãã ïŒã1æç®ã®åŸã¯ãåãåã£ããã³æ°ã«ãã£ãŠé·ç§»å ã¯2éãããïŒã¹ãã©ã€ã¯ãåŠãïŒã®ã§ãéžæç䌌ç¶æ ãã䜿ã£ãŠé·ç§»å ãåããã
-
ã2æç®ã®æçãåŸ ã£ãŠãããç¶æ ããBEFORE_2NDããšããŠè¿œå ããã
-
ãã¹ãã¢ã®ããŒãã¹ã®ç¢ºå®åŸ ã¡ããšãã¹ãã©ã€ã¯ã®ããŒãã¹ã®ç¢ºå®åŸ ã¡ãããPENDINGããšããŠè¿œå ããã
-
ãéžæç䌌ç¶æ ããè¿œå ããã
-
ãã³æ°ãåãåãã€ãã³ããPINSãïŒãã©ã¡ãŒã¿ãŒãšããŠãã³æ° pins ãæã€ïŒããBEFORE_1STããããéžæç䌌ç¶æ ããžã®é·ç§»ã«å²ãåœãŠããã¢ã¯ã·ã§ã³ãšããŠãã€ãã³ãã§åãåã£ããã³æ°ã1æç®ã®ãã³æ°ã«ä¿åããã
-
-
éžæç䌌ç¶æ ããã®é·ç§»ãè¿œå ããã
-
1æç®ã®ãã³æ°ãã¹ãã©ã€ã¯ã§ããã°ãPENDINGããžé·ç§»ããããã®ãšã2æç®ã®ãã³æ°ã¯ã0ãã«ããã
-
1æç®ã®ãã³æ°ãã¹ãã©ã¯ã§ãªããã°ãBEFORE_2NDããžé·ç§»ããã
-
-
2æç®ã®åŸã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ããïŒ ãFrameãã¯ã©ã¹ã®ã¹ããŒããã·ã³å³ã«2æç®ã®åŸã®ç¶æ é·ç§»ãšã€ãã³ããè¿œå ãã ïŒã2æç®ã®åŸã¯ãåãåã£ããã³æ°ã«ãã£ãŠé·ç§»å ã¯2éãããïŒã¹ãã¢ãåŠãïŒã®ã§ãéžæç䌌ç¶æ ãã䜿ã£ãŠé·ç§»å ãåããã
-
ãç²åŸãã³æ°ãšããŒãã¹ã確å®ãããç¶æ ãè¡šããFIXEDããšããŠè¿œå ããã
-
2æç®ã®åŸã®åŠçã®éžæã®ããã«ãéžæç䌌ç¶æ ããè¿œå ããã
-
ãBEFORE_2NDãã§ã€ãã³ããPINSããåãåããšãéžæç䌌ç¶æ ãžé·ç§»ãããã¢ã¯ã·ã§ã³ãšããŠãåãåã£ããã³æ°ã2æç®ã®ãã³æ°ã«ä¿åããã
-
-
éžæç䌌ç¶æ ããã®é·ç§»ãè¿œå ããã
-
2æç®ã®ãã³æ°ãã¹ãã¢ã§ããã°ãPENDINGããžé·ç§»ããã
-
2æç®ã®ãã³æ°ãã¹ãã¢ã§ãªããã°ãFIXEDããžé·ç§»ããã
-
-
ãPENDINGãããã®é·ç§»ãè¿œå ããã
-
ãPENDINGãäžã®ãã¬ãŒã ã§ãã€ãã³ããDETERMINEããåãåã£ããããŒã¿ã«ã確å®ãããšãããFIXEDããžé·ç§»ããã
-
ããã§ããã¬ãŒã ã®ã¹ããŒããã·ã³å³ãäœæã§ããŸããã
ã¹ããŒããã·ã³å³ã§ç¶æ é·ç§»ã®ããã«è¿œå ããã¢ã¯ã·ã§ã³ãã¬ãŒãæ¡ä»¶çšã®åŠçããFrameãã¯ã©ã¹ã®ã¡ãœããã«è¿œå ããŠãããŸãããïŒ ã¹ããŒããã·ã³å³ã«åãããŠãFrameãã¯ã©ã¹ãæŽæ°ãã ïŒã
ãã¬ãŒã ã®ã¯ã©ã¹ãšã¹ããŒããã·ã³å³ãäœæã§ããã®ã§ãRubyã®ããã°ã©ã ã«å€æããŠã¿ãŸãããã ã[_model_to_code_design]ãã§æ±ºããã«ãŒã«ã«ãããã£ãŠãã¢ãã«ããã³ãŒããžå€æããŸãã
ãŸããããã°ã©ã ã®åæåãšã¢ã¯ã·ã§ã³ã®éšåã¯ã ãRubyãscore.rb(1) ã®ããã«ãªãã§ãããã
# frozen_string_literal: true
require 'securerandom'
# Frameã¯1ãã¬ãŒã åã®ãã³æ°ãããŒãã¹ãèšé²ãã
class Frame
attr_reader :frame_no
attr_accessor :first, :second, :spare_bonus, :strike_bonus, :total, :state
def initialize(frame_no)
@frame_no = frame_no
@first = 0
@second = 0
@spare_bonus = 0
@strike_bonus = 0
@total = 0
@state = :RESERVED # (1)
end
def action(event, pins=0)
case @state # (2)
when :RESERVED
case event
when :SETUP # (3)
@state = :BEFORE_1ST
else
puts "invalid event: #{event} is ignored."
end
when :BEFORE_1ST
before_1st_porc(event, pins) # (4)
when :BEFORE_2ND
before_2nd_proc(event, pins) # (5)
when :PENDING
case event
when :DETERMINE # (6)
@state = :FIXED
end
when :FIXED
puts 'fixed.'
end
end
end
-
ãã¬ãŒã ã®åæç¶æ ã¯ãRESERVEDããšãããç¶æ ã¯Rubyã®ã·ã³ãã«ã䜿ã£ãŠè¡šçŸããã
-
ç¶æ ã«å¿ããŠåŠçãåããã
-
ãRESERVEDãç¶æ ã§ã¯ãSETUPãã€ãã³ããåãåãããBEFORE_1STãç¶æ ãžé·ç§»ãããä»ã®ã€ãã³ããæ¥ããç¡èŠããã
-
ãBEFORE_1STãç¶æ ã§ã¯ãPINSãã€ãã³ããåŸ ã€ã詳现ãªåŠçã¯ãbefore_1st_porcãã¡ãœããã«èšèŒããã
-
ãBEFORE_2NDãç¶æ ã§ã¯ãPINSãã€ãã³ããåŸ ã€ã詳现ãªåŠçã¯ãbefore_2nd_porcãã¡ãœããã«èšèŒããã
-
ãPENDINGãç¶æ ã§ã¯ãDETERMINEãã€ãã³ããåãåãããFIXEDãç¶æ ãžé·ç§»ããã
ã¬ãŒãæ¡ä»¶ãã¢ã¯ã·ã§ã³ã®ã¡ãœããã¯ã ãRubyãscore.rb(2) ã®ããã«ãªãã§ãããã
# frozen_string_literal: true
require 'securerandom'
# Frameã¯1ãã¬ãŒã åã®ãã³æ°ãããŒãã¹ãèšé²ãã
class Frame
# initializeãactionã®å®çŸ©ãããã«ãã
def frame_score # (1)
@first + @second + @spare_bonus + @strike_bonus
end
def strike? # (2)
@first == 10
end
def spare?
@first < 10 && (@first + @second) == 10
end
def miss?
@first < 10 && @second.zero && @state == :FIXED
end
def gutter?
@first.zero
end
def fixed? # (3)
@state == :FIXED
end
def to_s # (4)
total = if @state == :FIXED
@total
else
' .'
end
format '|%2d|%3s|%3s|%5s|%11d|%11d|%12d|%11s|',
@frame_no, @first, @second, total, frame_score,
@spare_bonus, @strike_bonus, @state
end
private # (5)
def before_1st_porc(evt, pins) # (6)
case evt
when :PINS
puts "invalid pins: #{pins}" if pins.negative? || pins > 10
@first = pins
@state = if strike?
@second = 0
:PENDING
else
:BEFORE_2ND
end
else
puts "invalid event: #{evt} on #{@state}."
end
end
def before_2nd_proc(evt, pins) # (7)
case evt
when :PINS
puts "invalid pins: #{pins}" if pins.negative? || pins > (10 - @first)
@second = pins
@state = if spare?
:PENDING
else
:FIXED
end
else
puts "invalid event: #{evt} on #{@state}."
end
end
end
-
ãã¬ãŒã ã®ã¹ã³ã¢ãèšç®ããã¡ãœãã
-
ã¹ãã©ã€ã¯ãã©ããå€å®ããã¬ãŒãæ¡ä»¶çšã®ã¡ãœããã
-
ãã¬ãŒã ã®ã¹ã³ã¢ã確å®ããã調ã¹ãã¡ãœããã
-
ãFrameãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãæåååããã¡ãœãããåŒã³åºãæç¹ã®ãFrameãã¯ã©ã¹ãä¿æããã€ã³ã¹ã¿ã³å€æ°ã®å€ãåºåããã®ã«äœ¿ãã
-
ãã以éã®ã¡ãœããã¯ãã©ã€ããŒãã
-
ã1æç®ã®æçãåŸ ã£ãŠãããç¶æ ãæ åœããã¡ãœãããã€ãã³ããPINSããåãåãã1æç®ã®ãã³æ°ã«ä¿åããããã®åŸã¹ãã©ã€ã¯ãã©ãã調ã¹ã次ã®ç¶æ ãžé·ç§»ããã
-
ã2æç®ã®æçãåŸ ã£ãŠãããç¶æ ãæ åœããã¡ãœãããã€ãã³ããPINSããåãåãã2æç®ã®ãã³æ°ã«ä¿åããããã®åŸã¹ãã¢ãã©ãã調ã¹ã次ã®ç¶æ ãžé·ç§»ããã
ãã¯ã©ãã·ãã¯ã¹ã³ã¢ãªã³ã°ãã®å Žåã第10ãã¬ãŒã ãä»ã®ãã¬ãŒã ãšã¯ç°ãªã£ãŠããŸãã ãµãŒãã¹ãã¬ãŒã ãšããèãæ¹ããããã¹ãã©ã€ã¯ãã¹ãã¢ã®å Žåã«è¿œå ã§æçã§ããŸãã
ãã®ãµãŒãã¹ãã¬ãŒã ã®æ±ãæ¹ã«ã«ã€ããŠæŽçããŠãããŸãããã
第10ãã¬ãŒã ãã¹ãã©ã€ã¯ã§ãã¹ãã¢ããªãå ŽåããµãŒãã¹ãã¬ãŒã ã¯æäŸãããŸããã 第9ãã¬ãŒã ãŸã§ã®éåžžã®ãã¬ãŒã ãšåæ§ã1æç®ãš2æç®ãèšé²ããã ãã§ãïŒ ç¬¬10ãã¬ãŒã ãã¹ãã©ã€ã¯ãã¹ãã¢ããªãå Žå ïŒã
第10ãã¬ãŒã ã®2æç®ã§ã¹ãã¢ã«ãªã£ãå Žåã1æç®ãš2æç®ãéåžžã®ãã¬ãŒã ãšåæ§ã«èšé²ããã®ã¡ããã1æè¿œå ãããŸãã ãããã第10ãã¬ãŒã ã«å ããŠã第11ãã¬ãŒã ã®1æç®ãè¿œå ããããšã¿ãªããŸãã ã€ãŸããã²ãŒã ã¹ã³ã¢ã®ããŒã¿ãã 第10ãã¬ãŒã ãã¹ãã¢ã®å ŽåïŒç¬¬11ãã¬ãŒã ã®2æç®ã¯ãªãïŒ ãã®ããã«æ§æããŸãã
ã¹ã³ã¢ããã®ããã«æ§æããŠãããšã第10ãã¬ãŒã ã®å Žåããéåžžãã¬ãŒã ã®çµã¿åããã«ãã£ãŠããŒãã¹ãèšç®ã§ããŸãã ã²ãŒã çµäºæã®ç¬¬10ãã¬ãŒã ã®ã¹ã³ã¢ïŒãã³æ°ã«ä»¥åŸã®æçã«ããããŒãã¹ãå ããã¹ã³ã¢ïŒãååŸãããšããããã²ãŒã ã®ã¹ã³ã¢ã§ãã
第10ãã¬ãŒã ã®1æç®ãã¹ãã©ã€ã¯ã®å Žåã第10ãã¬ãŒã ãã¹ãã©ã€ã¯ãšããäžã§ããã2æè¿œå ãããŸãã ãããã第10ãã¬ãŒã ã«å ããŠã第11ãã¬ãŒã ã®1æç®ãš2æç®ãè¿œå ããããšã¿ãªããŸãã ã€ãŸããã²ãŒã ã¹ã³ã¢ã®ããŒã¿ãã 第10ãã¬ãŒã ã®1æç®ãã¹ãã©ã€ã¯ã®å Žå ãã®ããã«æ§æããŸãã ã ããã第11ãã¬ãŒã ã®1æç®ãã¹ãã©ã€ã¯ã®å Žåã¯ãåã2æè¿œå ã§ã次ã®ã2æç®ãã¹ãã©ã€ã¯ã®å Žåãã®èãæ¹ã䜿ããŸãã
ã¹ã³ã¢ããã®ããã«æ§æããŠãããšã第10ãã¬ãŒã ã®å Žåããéåžžãã¬ãŒã ã®çµã¿åããã«ãã£ãŠããŒãã¹ãèšç®ã§ããŸãã ã²ãŒã çµäºæã®10ãã¬ãŒã ã®ã¹ã³ã¢ïŒãã³æ°ã«ä»¥åŸã®æçã«ããããŒãã¹ãå ããã¹ã³ã¢ïŒãååŸãããšããããã²ãŒã ã®ã¹ã³ã¢ã§ãã
第10ãã¬ãŒã ã®2æç®ãã¹ãã©ã€ã¯ã®å Žåã第10ãã¬ãŒã ã第11ãã¬ãŒã ãã¹ãã©ã€ã¯ãšããäžã§ããã1æè¿œå ãããŸãã ãããã第10ãã¬ãŒã ã第11ãã¬ãŒã ã«å ããŠã第12ãã¬ãŒã ç®ã®1æç®ãè¿œå ããããšã¿ãªããŸãã ã€ãŸããã²ãŒã ã¹ã³ã¢ã®ããŒã¿ãã 第10ãã¬ãŒã ã®2æç®ãã¹ãã©ã€ã¯ã®å Žå ãã®ããã«æ§æããŸãã ãã®ããã«æ§æããã°ãéåžžã®ãã¬ãŒã ã§ããã«ããšã£ããšãã®èšç®æ¹æ³ïŒã¹ãã©ã€ã¯ãç¶ãããšãã¯ããã«æ¬¡ã®ãã¬ãŒã ã®1æç®ã2æç®ãšããŠå ç®ãããïŒã®ãŸãŸã§ç¬¬10ãã¬ãŒã ã®ããŒãã¹ãèšç®ã§ããŸãã
ã¹ã³ã¢ããã®ããã«æ§æããŠãããšã第10ãã¬ãŒã ã®å Žåããéåžžãã¬ãŒã ã®çµã¿åããã«ãã£ãŠããŒãã¹ãèšç®ã§ããŸãã ã²ãŒã çµäºæã®10ãã¬ãŒã ã®ã¹ã³ã¢ïŒãã³æ°ã«ä»¥åŸã®æçã«ããããŒãã¹ãå ããã¹ã³ã¢ïŒãååŸãããšããããã²ãŒã ã®ã¹ã³ã¢ã§ãã
ãµãŒãã¹ãã¬ãŒã ã®æ±ãæ¹ãæ€èšããçµæã工倫ããã°éåžžã®ãã¬ãŒã ãšåãããã«æ±ããããšãããããŸããã ããã§ã¯ããã¬ãŒã ã®éãŸãã§ããã¹ã³ã¢ã«ã€ããŠãã©ã®ãããªåŠçãããã°ããã®ãæ€èšããŸãããã
ãFrameãã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ãè¿œå ããã®ãšåãæé ã§ããScoreãã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ãè¿œå ããŸãïŒ ãScoreãã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ãè¿œå ãã ïŒã
ã¹ããŒããã·ã³å³ã«ãæ€èšããçµæã䜿ã£ãŠãã¹ã³ã¢ã®ç¶æ ãšç¶æ é·ç§»ãè¿œå ããŸãããã
-
ãScoreãã¯ã©ã¹ã®ç¶æ ãè¿œå ããïŒ ã¹ããŒããã·ã³å³ã«ãScoreãã¯ã©ã¹ã®ç¶æ ãè¿œå ãã ïŒã
-
ãã¬ãããããéå§ç䌌ç¶æ ããã¹ããŒããã·ã³å³ã«è¿œå ããã
-
ãã¬ãããããç¶æ ããéžæããã¹ããŒããã·ã³å³ã«è¿œå ããã
-
ã1æç®åŸ ã¡ãã®ç¶æ ãšããŠç¶æ åããWAIT_FOR_1STãã«èšå®ããã
-
ã2æç®åŸ ã¡ãã®ç¶æ ãšããŠç¶æ åããWAIT_FOR_2NDãã«èšå®ããã
-
ãã²ãŒã ã®çµäºãã®ç¶æ ãšããŠç¶æ åããFINISHEDãã«èšå®ããã
-
ãã¬ãããããçµäºç䌌ç¶æ ããã¹ããŒããã·ã³å³ã«è¿œå ããã
-
-
ãScoreãã¯ã©ã¹ã®ã€ãã³ããšã¢ã¯ã·ã§ã³ãäœæããïŒ ã¹ããŒããã·ã³å³ã«ãScoreãã¯ã©ã¹ã®ã€ãã³ããšã¢ã¯ã·ã§ã³ãè¿œå ãã ïŒã
-
ãWAIT_FOR_1STãããã®é·ç§»ã«ã¯ãã¹ãã©ã€ã¯ã®å Žåãã¹ãã©ã€ã¯ã§ãªãå Žåãã²ãŒã ãçµäºã®å Žåãããã®ã§ããéžæç䌌ç¶æ ããè¿œå ããã
-
ãWAIT_FOR_1STããããéžæç䌌ç¶æ ããžã®é·ç§»ã§ã¯ããã³æ°ãåãåãã®ãåŸ ã£ãŠãããåãåã£ããšãã«ã¯ãçŸåšã«ãã¬ãŒã ãžãã³æ°ã®ã€ãã³ããéãããã®åŸã1æç®ã®åŸã®ã¹ãã¢ãšã¹ãã©ã€ã¯ã®ããŒãã¹ãèšç®ããã®ã¹ã®ããŒã¿ã«ãæŽæ°ããã
-
ãéžæç䌌ç¶æ ããããWAIT_FOR_1STããžã®é·ç§»ã®ã¬ãŒãæ¡ä»¶ã¯ãã¹ãã©ã€ã¯ã§ãããããšããã®ãšãã¯ã¢ã¯ã·ã§ã³ãšããŠã次ã®ãã¬ãŒã ãžé²ããã
-
ãéžæç䌌ç¶æ ããããWAIT_FOR_2NDããžã®é·ç§»ã®ã¬ãŒãæ¡ä»¶ã¯ãã¹ãã©ã€ã¯ã§ãªãïŒãã€ã²ãŒã çµäºã§ã¯ãªãïŒãããšã
-
ãéžæç䌌ç¶æ ããããFINISHEDããžã®é·ç§»ã®ã¬ãŒãæ¡ä»¶ã¯ãã²ãŒã çµäºã§ãããã§ããããšã
-
-
ãWAIT_FOR_2NDãããã®é·ç§»ã«ã¯ãã²ãŒã çµäºã®å Žåãšããã§ãªãå Žåãããã®ã§ããéžæç䌌ç¶æ ããè¿œå ããã
-
ãWAIT_FOR_1STããããéžæç䌌ç¶æ ããžã®é·ç§»ã§ã¯ããã³æ°ãåãåãã®ãåŸ ã£ãŠãããåãåã£ããšãã«ã¯ãçŸåšã«ãã¬ãŒã ãžãã³æ°ã®ã€ãã³ããéãããããŠã2æç®ã®åŸã®ã¹ãã¢ãšã¹ãã©ã€ã¯ã®ããŒãã¹ãèšç®ããã®ã¹ã®ããŒã¿ã«ãæŽæ°ããã
-
ãéžæç䌌ç¶æ ããããWAIT_FOR_1STããžã®é·ç§»ã®ã¬ãŒãæ¡ä»¶ã¯ãã²ãŒã çµäºã§ã¯ãªããããšããã®ãšãã¯ã¢ã¯ã·ã§ã³ãšããŠã次ã®ãã¬ãŒã ãžé²ããã
-
ãéžæç䌌ç¶æ ããããFINISHEDããžã®é·ç§»ã®ã¬ãŒãæ¡ä»¶ã¯ãã²ãŒã çµäºã§ãããã§ããããšãã²ãŒã çµäºã¯ã10ãã¬ãŒã ç®ã®ç¶æ ããFIXEDãã«ãªã£ãããšã§å€å®ã§ããïŒãã®ãããªã¡ãœãããçšæããïŒã
-
第10ãã¬ãŒã ã®å Žåã«ããµãŒãã¹ãã¬ãŒã ã®ããã«è¿œå ã®ãã¬ãŒã ãçšæããããšã§ãéåžžãã¬ãŒã ãšåãããã«ãã³æ°ãããŒãã¹ãæ±ããããã«ãªããŸããã
ã¯ã©ã¹å³ã«ãã®çµæãåæ ããŸãããã
-
ãFrameãã¯ã©ã¹åŽã®é¢é£ç«¯ã®å€é床ãã10ãããã12ãã«å€æŽããã
-
ããã¯ãéåžžã®ãã¬ãŒã ãè¿œå ããæ¹æ³ã§ãµãŒãã¹ãã¬ãŒã ãåŠçããããã®è¿œå ã
-
-
é¢é£ã«ããŒããã€ããŠèª¬æãã€ããŠããã
-
ãã¬ããããããŒããéžæããã¯ã©ã¹å³ã«è¿œå ããã
-
ããŒãã«ãFrameåŽã®å€é床ã¯ããµãŒãã¹ãã¬ãŒã çšã«å¿ èŠãªãã¬ãŒã åã ãè¿œå ããŠããããšãã説æãè¿œå ããã
-
ããŒãããé¢é£ã®ç·ã«åãã£ãŠã¢ã³ã«ãŒãåŒãã
-
ãã¬ããããããŒãã®ã¢ã³ã«ãŒãéžæããããŒãã«ããŠã¹ã«ãŒãœã«ã移åããŠéæ ã衚瀺ãããã®ãåŸ ã€ã
-
ããŠã¹ã®ãã¿ã³ãæŒãããŸãŸãããŠã¹ã«ãŒãœã«ããã©ãã°ããé¢é£ã®ç·ã«è¿ã¥ãéæ ã衚瀺ãããã®ãåŸ ã€ã
-
-
ãScoreãã¯ã©ã¹ã«ã¹ããŒããã·ã³å³ã§äœæããã¡ãœãããè¿œå ããŠããã
-
ã次ã®ãã¬ãŒã ãžé²ããã¡ãœãããgo_next_frameããè¿œå ããã
-
ãã²ãŒã çµäºãå€å®ãããã¡ãœãããfinished?ããè¿œå ããã
-
ã1æç®ã®åŸã®ã¹ãã¢ã®ããŒãã¹ãèšç®ãããã¡ãœãããcalc_spare_bonus_after_1stããè¿œå ããã
-
ã1æç®ã®åŸã®ã¹ãã©ã€ã¯ã®ããŒãã¹ãèšç®ãããã¡ãœãããcalc_strike_bonus_after_1stããè¿œå ããã
-
ã2æç®ã®åŸã®ã¹ãã©ã€ã¯ã®ããŒãã¹ãèšç®ãããã¡ãœãããcalc_strike_bonus_after_2stããè¿œå ããã
-
ãã®ã¹ã®ããŒã¿ã«ãæŽæ°ãããã¡ãœãããupdate_totalããè¿œå ããã
-
ã¹ã³ã¢ãèšé²ããã¡ãœããïŒã¹ããŒããã·ã³å³ã®åŠçãæ åœããïŒã¡ãœãããscoringããè¿œå ããã
-
ã¹ããŒããã·ã³å³ã®ç¶æ ããšã®åŠçãæ åœããã¡ãœãããwait_for_1st_procããšãwait_for_2nd_procããè¿œå ããã
-
ã¹ã³ã¢ã®èšé²ãæåååããã¡ãœãããto_sããè¿œå ããã
-
-
é¢é£ãè¿œå ãã
-
ãScoreãã¯ã©ã¹ãããFrameãã¯ã©ã¹ãžããçŸåšã®ãã¬ãŒã ããæãé¢é£ãcurrentããè¿œå ããã
-
Tip
|
ããŒãå ã®æç« ãç·šéãããšãã¯ãããŒããéžæããç¶æ ã§ããããã£ãŒã䜿ã£ãŠç·šéãããšãæ¹è¡ãå ¥åãããããªããŸãã |
ã¹ã³ã¢ã®ã¯ã©ã¹ãšã¹ããŒããã·ã³å³ãäœæã§ããã®ã§ãRubyã®ããã°ã©ã ã«å€æããŠã¿ãŸãããã å€æããããã°ã©ã ã®åæåããŠãŒãã£ãªãã£ã¡ãœããã®éšåã¯ã ãRubyãscore.rb(3) ã®ããã«ãªãã§ãããã
# frozen_string_literal: true
require 'securerandom' # (1)
# Frameã¯ã©ã¹ã®å®çŸ©ãããã«ãã
# ã¹ã³ã¢ã¯å人ã®10ãã¬ãŒã åã®ã¹ã³ã¢ãèšé²ãã
class Score # (2)
attr_accessor :id, :player, :fno, :frames, :state
def initialize(name)
@id = SecureRandom.urlsafe_base64(8) # (3)
@player = name
@fno = 1
@frames = []
(-1..13).each do |fno| # (-1, 0) are dummy frame # (4)
@frames.append Frame.new(fno)
end
@state = :WAIT_FOR_1ST # (5)
@frames[fno2idx(@fno)].action(:SETUP) # (6)
end
def fno2idx(fno) # (7)
fno + 1 # frame number 1 => array index 3 (0 origin).
end
def frame(fno)
@frames[fno2idx(fno)] # return index on @frams at frame number.
end
def go_next_frame # (8)
@fno += 1
@frames[fno2idx(fno)].action(:SETUP)
end
def current # (9)
frame(@fno)
end
end
-
å®å šãªIDãçæããããã®ã©ã€ãã©ãªãã€ã³ããŒãããã
-
ãScoreãã¯ã©ã¹ã®å®çŸ©ã®ã¯ããŸãã
-
ã¹ã³ã¢ã®ã€ã³ã¹ã¿ã³ã¹ã«IDãã€ããŠããã
-
ãFrameãã®ã€ã³ã¹ã¿ã³ã¹ã®äœæãã¯ã©ã¹å³ã§ã¯ããScoreããããFrameããžã®ã³ã³ããžã·ã§ã³ãšããŠè¡šãããŠããéšåãèšèšäžã¯12åã ãããµãŒãã¹ãã¬ãŒã ã§ã次ããåç §ããå Žé¢ã第1ãã¬ãŒã ã§ãåã®ãã¬ãŒã ããåã®åã®ãã¬ãŒã ããåç §ããå Žé¢ã§åç §ãããããŒã®ãã¬ãŒã ãè¿œå ããŠããã
-
ã¹ã³ã¢ã®æåã®ç¶æ ããWAIT_FOR_1STãã«ããã
-
第1ãã¬ãŒã ãžãSETUPãã€ãã³ããéãã
-
ãã¬ãŒã çªå·ãšãã¬ãŒã ã®é åã®ã€ã³ããã¯ã¹ã察å¿ã¥ããã¡ãœããïŒãããŒã®ãã¬ãŒã ã第1ãã¬ãŒã ã®åã«è¿œå ããããã®ãªãã»ããïŒã
-
çŸåšã®ãã¬ãŒã ãã次ã®ãã¬ãŒã ãžé²ãããã¡ãœããããã®ã¡ãœããã§ã¯ã次ã®ãã¬ãŒã ã«ãSETUPãã€ãã³ããéãã
-
ãçŸåšã®ãã¬ãŒã ããåç §ããããã®ã¡ãœãããã¯ã©ã¹å³ã§ã¯é¢é£ç«¯åããcurrentãã®ãFrameãã¯ã©ã¹ãžã®é¢é£ã§è¡šãããŠããã
ããŒãã¹èšç®ãããŒã¿ã«èšç®ã®ã¡ãœãã㯠ãRubyãscore.rb(4) ã®ããã«ãªãã§ãããã
# Frameã¯ã©ã¹ã®å®çŸ©ããã以åã®ã³ãŒããããã«ãã
# ã¹ã³ã¢ã¯å人ã®10ãã¬ãŒã åã®ã¹ã³ã¢ãèšé²ãã
class Score
# ã¢ã¯ã»ãµãŒã®å®çŸ©ãããã«ãã
# initializeãfno2idxãframeãgo_next_frameãcurrentã¡ãœããã®å®çŸ©ãããã«ãã
def prev # (1)
frame(@fno - 1)
end
def pprev # (2)
frame(@fno - 2)
end
def calc_spare_bonus_after_1st # (3)
return unless prev.spare?
prev.spare_bonus = current.first
prev.action(:DETERMINE)
end
def calc_strike_bonus_after_1st # (4)
return unless prev.strike? && pprev.strike?
pprev.strike_bonus = prev.first + current.first
pprev.action(:DETERMINE)
end
def calc_strike_bonus_after_2nd # (5)
return unless prev.strike?
prev.strike_bonus = current.first + current.second
prev.action(:DETERMINE)
end
def update_total # (6)
@frames.each_cons(2) do |prev, cur|
cur.total = prev.total + cur.frame_score
end
end
def finished? # (7)
frame(10).fixed?
end
end
-
ããŒãã¹èšç®ã§äœ¿ãããåã®ãã¬ãŒã ããåŸãã¡ãœããã
-
ããŒãã¹èšç®ã§äœ¿ãããåã®åã®ãã¬ãŒã ããåŸãã¡ãœããã
-
1æç®ã®åŸã®ã¹ãã¢ããŒãã¹ãèšç®ããã¡ãœãããåã®ãã¬ãŒã ã®ã¹ã³ã¢ã確å®ããã®ã§ãåã®ãã¬ãŒã ãžãDETERMINEãã€ãã³ããéãã
-
1æç®ã®åŸã®ã¹ãã©ã€ã¯ããŒãã¹ãèšç®ããã¡ãœãããåã®åã®ãã¬ãŒã ããã¹ãã©ã€ã¯ãç¶ããŠããå Žåãããã§ã¹ã³ã¢ã確å®ããã®ã§ãåã®åã®ãã¬ãŒã ãžãDETERMINEãã€ãã³ããéãã
-
2æç®ã®åŸã®ã¹ãã©ã€ã¯ããŒãã¹ãèšç®ããã¡ãœãããåã®ãã¬ãŒã ã®ã¹ã³ã¢ã確å®ããã®ã§ãåã®ãã¬ãŒã ãžãDETERMINEãã€ãã³ããéãã
-
ãã®ã¹ã®ããŒã¿ã«ããæŽæ°ããã¡ãœãããeach_consã¯ãé åããæå®ããæ°ãã€èŠçŽ ãåãåºãã¡ãœããã
-
ãã²ãŒã çµäºãã®å€å®çšã®ã¡ãœããããµãŒãã¹ãã¬ãŒã ã®æ€èšçµæããã第10ãã¬ãŒã ããFIXEDãã«ãªãã°ããã®ã²ãŒã ã¯çµäºãšã¿ãªããã
ãããŠãã¹ããŒããã·ã³å³ã§è¡šãããå®éã«ã²ãŒã ã®é²è¡ã«åãããŠã¹ã³ã¢ãèšé²ããåŠçãããã¡ãœãã㯠ãRubyãscore.rb(5) ã®ããã«ãªãã§ãããã
# Frameã¯ã©ã¹ã®å®çŸ©ããã以åã®ã³ãŒããããã«ãã
# ã¹ã³ã¢ã¯å人ã®10ãã¬ãŒã åã®ã¹ã³ã¢ãèšé²ãã
class Score
# ã¢ã¯ã»ãµãŒã®å®çŸ©ãããã«ãã
# initializeããfinished?ãŸã§ã®ã¡ãœããã®å®çŸ©ãããã«ãã
def wait_for_1st_proc(pins) # (1)
current.action(:PINS, pins) # (2)
calc_spare_bonus_after_1st
calc_strike_bonus_after_1st
update_total
if finished? # (3)
@state = :FINISHED
elsif current.strike? # (4)
@state = :WAIT_FOR_1ST
go_next_frame
else # (5)
@state = :WAIT_FOR_2ND
end
end
def wait_for_2nd_proc(pins) # (6)
current.action(:PINS, pins) # (7)
calc_strike_bonus_after_2nd
update_total
if finished? # (8)
@state = :FINISHED
else # (9)
@state = :WAIT_FOR_1ST
go_next_frame
end
end
def scoring(pins) # (10)
case @state
when :WAIT_FOR_1ST
wait_for_1st_proc(pins)
when :WAIT_FOR_2ND
wait_for_2nd_proc(pins)
when :FINISHED
puts 'finished'
end
end
def to_s # (11)
"Player:#{@player}, Score(id: #{@id}), Frame:#{@fno},
|No|1st|2nd|Total|Frame Score|Spare Bonus|Strike Bonus|Frame State|
#{@frames.join("\n")}"
end
end
-
ãWAIT_FOR_1STãç¶æ ã®ãšãã®ç¶æ é·ç§»ã®ã¡ãœããã
-
çŸåšã®ãã¬ãŒã ã«ã€ããŠããã³æ°ãæŽæ°ããããŒãã¹ãèšç®ããã®ã¹ã®ããŒã¿ã«ãæŽæ°ããã
-
ãéžæç䌌ç¶æ ãã§ã®é·ç§»å ã®åå²åŠçããã²ãŒã çµäºãã®å Žåã¯ãFINISHEDããžé·ç§»ããã
-
ãã¹ãã©ã€ã¯ã ã£ããã®å Žåã¯ã次ã®ãã¬ãŒã ãžé²ãã§ãWAIT_FOR_1STããžé·ç§»ããã
-
ãã以å€ã®ãšãã¯2æç®ãåŸ ã€ã®ã§ããWAIT_FOR_2NDããžé·ç§»ããã
-
ãWAIT_FOR_2NDãç¶æ ã®ãšãã®ç¶æ é·ç§»ã®ã¡ãœããã
-
çŸåšã®ãã¬ãŒã ã«ã€ããŠããã³æ°ãæŽæ°ããããŒãã¹ãèšç®ããã®ã¹ã®ããŒã¿ã«ãæŽæ°ããã
-
ãéžæç䌌ç¶æ ãã§ã®é·ç§»å ã®åå²åŠçããã²ãŒã çµäºãã®å Žåã¯ãFINISHEDããžé·ç§»ããã
-
ãã以å€ã®ãšãã¯ã次ã®ãã¬ãŒã ãžé²ãã§ãWAIT_FOR_1STããžé·ç§»ããã
-
ã¹ã³ã¢ãèšé²ããã¹ããŒããã·ã³å³ã®æ¯ãèããæ åœããã¡ãœãããç¶æ ã«å¿ããŠããããã®ç¶æ çšã®ã¡ãœãããåŒã³åºãã
-
ãã¹ã³ã¢ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®å 容ïŒå å ãããã¬ãŒã ãå«ãïŒãæåååããã¡ãœããã
ããã§ããã¬ãŒã ãšã¹ã³ã¢ããããããã®ã¹ããŒããã·ã³å³ã§è¡šããæ¯ãèãã«åãããŠåäœããããã°ã©ã ã«å€æã§ããŸããã
æ®ãã¯ãè€æ°åã®ã¹ã³ã¢ã®ã»ããã§æ§æããããGameããšãè€æ°ã®ãGameããèšé²ãããScoreSheetãã¯ã©ã¹ã§ãã
ããŠãªã³ã°ãè€æ°åã§æ¥œãããšããã¿ãªããã¯ãããŠãã1çµã®ããŒã ã§1ã€ã®ã¬ãŒã³ã䜿ã£ãŠã1ãã¬ãŒã ããšã«ãã¬ãŒã€ãŒã亀代ããªãããã¬ã€ããŸãã ãã®ãããªã²ãŒã ã®æ¹åŒã¯ãããšãŒããã¢ã³æ¹åŒããšåŒã°ããŠããŸãã
å¥ã®æ¹åŒãšããŠãããŒã«ã©ãã¯ïŒããŒã«ãè¿ã£ãŠããã©ãã¯ïŒãæãã 2ã€ã®ã¬ãŒã³ãã1ãã¬ãŒã 亀代ã§äœ¿ã£ãŠãã¬ãŒããæ¹åŒããããŸãã ãã®ãããªã²ãŒã ã®æ¹åŒã¯ãã¢ã¡ãªã«ã³æ¹åŒããšåŒã°ããŠããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ããšãŒããã¢ã³æ¹åŒã䜿ãããšã«ããŸãã
ã»ãšãã©ã®ã¿ãªãããããŠãªã³ã°ããããšãã«ã²ãŒã ãé²è¡ããæé ã¯ãããšãŒããã¢ã³æ¹åŒããšåŒã°ããŠããŸãã ããšãŒããã¢ã³æ¹åŒãã«ããé²è¡ãæ³å®ããŠããGameãã¯ã©ã¹ã¯ã©ã®ãããªæé ã§åäœãããã¹ããæŽçããŸãããã
-
ã¹ã³ã¢ã·ãŒãã«åå ãããã¬ãŒã€ãŒåãæžãïŒãšã³ããªãŒããïŒã
-
æžãããã¬ãŒã€ãŒã®é ã«1ãã¬ãŒã åãã¬ãŒããïŒåèªã®ã¿ãŒã³ïŒã
-
次ã®ãã¬ãŒã€ãšäº€ä»£ããïŒæ¬¡ã®ã¿ãŒã³ãžé²ãïŒã
-
å šå¡ãã²ãŒã çµäºãããŸã§æé ãç¹°ãè¿ãã
ãã®æ¹åŒã«åãããŠã¹ã³ã¢ãèšé²ããåŠçããããGameãã¯ã©ã¹ã¯ã ãRubyãscore.rb(6) ã®ããã«ãªãã§ãããã
# Frameã¯ã©ã¹ãšScoreã¯ã©ã¹ã®å®çŸ©ããã以åã®ã³ãŒããããã«ãã
# Gameã¯ã©ã¹ã¯è€æ°åã®1ã²ãŒã åã®ã¹ã³ã¢ã®ã»ãããæ§æãã
class Game
attr_reader :id, :turn, :scores
def initialize
@id = SecureRandom.urlsafe_base64(8) # (1)
@turn = 0
@scores = []
end
def entry(name = 'unknown') # (2)
@scores.append(Score.new(name))
end
def turn_player_name # (3)
@scores[@turn].player
end
def go_next_turn # (4)
@turn = (@turn + 1) % @scores.size
end
def playing(score_index, pins) # (5)
@scores[score_index].scoring(pins)
if @scores[score_index].fno > 10 # (6)
go_next_turn if @scores[score_index].finished?
elsif @scores[score_index].current.state == :BEFORE_1ST # (7)
go_next_turn
end
end
def finished? # (8)
@scores.reject(&:finished?) == []
end
def to_s # (9)
"Game(id:#{@id}),\n#{@scores.join("\n")}"
end
end
-
ã²ãŒã ããšã«ãŠããŒã¯ãªIDãã€ããŠããã
-
ã²ãŒã ã«åå ãããã¬ãŒã€ãŒãç»é²ããã¡ãœããããã®ãã¬ãŒã€ãŒã®ä»åã®ã²ãŒã åã®ã¹ã³ã¢ãçšæããã
-
çŸåšãã¬ãŒäžã®ãã¬ãŒã€ãŒåãååŸããã¡ãœããã
-
次ã®ãã¬ãŒã€ãŒã«äº€ä»£ããã¡ãœãããç»é²ãããã¬ãŒã€ãŒã®é ã«é²ã¿ãæåŸãŸã§æ¥ããæåã®ãã¬ãŒã€ãŒãžæ»ãã
-
ã²ãŒã ãå®è¡ããã¡ãœãããçŸåšã®ãã¬ãŒã€ãŒã®ã¹ã³ã¢ã¯ã©ã¹ã®scoring ã¡ãœãããåŒã³åºããŠ1ãã¬ãŒã åã®ãã¬ãŒãèšé²ããã
-
ãµãŒãã¹ãã¬ãŒã ã§ã¯ã2ãã¬ãŒã 以äžãã¬ãŒããå Žåãããã®ã§ããã®ãšãã¯äº€ä»£ããªãã
-
çŸåšã®ãã¬ãŒã€ãŒã®çŸåšã®ç¶æ ããBEFORE_1STããªãã次ã®ãã¬ãŒã ã®æçåŸ ã¡ã«ãªã£ãŠããã®ã§ããã¬ãŒã€ãŒã亀代ããã
-
ãã¹ãŠã®ãã¬ãŒã€ãŒãã²ãŒã çµäºãã©ãã調ã¹ãã¡ãœããã
-
ã²ãŒã ã®ç¶æ³ãæåååããã¡ãœããã
ã¯ã©ã¹å³ã«ããã®çµæãåæ ããŠãããŸãããïŒ ãGameãã¯ã©ã¹ãæŽæ°ããã¯ã©ã¹å³ ïŒã çŸåšã®ãã¬ãŒã€ãŒã¯ãé¢é£ç«¯åããturnãã®é¢é£ã«ãã£ãŠåç §ããŠããScoreã䜿ã£ãŠããŸãã
ãGameãã¯ã©ã¹ãäœæã§ããã®ã§ãã¹ã³ã¢ã·ãŒããæ±ããScoreSheetãã¯ã©ã¹ãäœæã§ãããã§ããã æ°ããã¹ã³ã¢ã·ãŒããäœæããŠãããã«å¿ èŠãªæ°ã®ã²ãŒã ãè¿œå ããã°æžã¿ããã§ãã
ãã®æ¹åŒã«åãããŠã¹ã³ã¢ãèšé²ããåŠçããããGameãã¯ã©ã¹ã¯ã ãRubyãscore.rb(7) ã®ããã«ãªãã§ãããã
# Frameã¯ã©ã¹ãšScoreã¯ã©ã¹ãšGameã¯ã©ã¹ã®å®çŸ©ããã以åã®ã³ãŒããããã«ãã
# ScoreSheetã¯ãè€æ°åã®è€æ°åã®Gameãèšé²ãã
class ScoreSheet
attr_accessor :id, :time, :games
def initialize(date) # (1)
@id = SecureRandom.urlsafe_base64(8) # (2)
@play_date = date
@games = []
end
def add_game(games = 1) # (3)
games.times do
@games.append(Game.new)
end
end
def to_s # (4)
"Score Sheet Date: #{@time}(id:#{@id})"
end
end
-
ã¹ã³ã¢ã·ãŒããäœæãããšãã¯ãäœææã®æ¥æãæ§ããŠããã
-
ã¹ã³ã¢ã·ãŒãããšã«ãŠããŒã¯ãªIDãã€ããŠããã
-
åžæããæ°ã®ã²ãŒã ãã·ãŒãã«è¿œå ããã¡ãœãããåŒæ°ããªããšãã¯1çµã ãè¿œå ããã
-
ã¹ã³ã¢ã·ãŒãã®ç¶æ³ãæåååããã¡ãœããã
ã¯ã©ã¹å³ã«ããã®çµæãåæ ããŠãããŸãããïŒ ãScoreSheetãã¯ã©ã¹ãæŽæ°ããã¯ã©ã¹å³ ïŒã çŸåšã®ãã¬ãŒã€ãŒã¯ãé¢é£ç«¯åããturnãã®é¢é£ã«ãã£ãŠåç §ããŠããScoreã䜿ã£ãŠããŸãã
ããŠãªã³ã°ã®ã²ãŒã ã¹ã³ã¢ãèšé²ããã¹ã³ã¢ã·ãŒãã®æ¯ãèããæ€èšããŸããã
æ¯ãèãã®ã¢ãã«ã«ç»å Žããæ§æèŠçŽ ïŒç¶æ ãã€ãã³ããã¢ã¯ã·ã§ã³ïŒãæŽãåºããã²ãŒã ã®æé ãæŽçããŸããã
-
ã¹ã³ã¢ã«é¢ããç¶æ ã®çºèŠ
-
ã¹ã³ã¢ãèšé²ããããšãã®ãã¬ãŒã ã®å€åã芳å¯ããŠããã¬ãŒã ã«ã©ã®ãããªç¶æ ããããæŽãåºããã
-
-
ã¹ã³ã¢ã«é¢ããã¹ããŒããã·ã³å³ã®äœæ
-
æŽãåºãããã¬ãŒã ã®ç¶æ ã«ãé¢é£ããã€ãã³ããã¢ã¯ã·ã§ã³ãèããŠã¹ããŒããã·ã³å³ã«è¡šããã
-
-
ãã¬ãŒã ã¹ã³ã¢ã«é¢ããç¶æ ã®çºèŠ
-
ã²ãŒã ãé²ãããšãã®ã¹ã³ã¢ã®å€åã芳å¯ããŠãã¹ã³ã¢ã«ã©ã®ãããªç¶æ ããããæŽãåºããã
-
-
ãã¬ãŒã ã«é¢ããã¹ããŒããã·ã³å³ã®äœæ
-
ãµãŒãã¹ãã¬ãŒã ã®åäœã芳å¯ããŠãéåžžã®ãã¬ãŒã ãè¿œå ããŠã¹ã³ã¢ãèšé²ããæ¹æ³ãçºèŠããã
-
æŽãåºããã¹ã³ã¢ã®ç¶æ ã«é¢é£ããã€ãã³ããã¢ã¯ã·ã§ã³ãèããŠã¹ããŒããã·ã³å³ã«è¡šããã
-
ã¹ããŒããã·ã³å³ã䜿ãããšã§ããã¬ãŒã ãã¹ã³ã¢ã®åäœãè¡šããŸããã ãããŠããããããã¢ãã«ãšã³ãŒãã察å¿ã¥ããŠããã°ããããåæãšããŠïŒã¢ãã«ãã³ãŒãã®æ§ææ¹åŒãšããŠïŒæ¯ãèãã®èšèšã«æŽ»ãããŸãã
ã¢ãã«ãšã³ãŒãã察å¿ã¥ããããŠããã°ãRubyã®ããã°ã©ã ã¯ã¹ããŒããã·ã³å³ããå€æããããã«äœæã§ããŸãã ã€ãŸãã解決ãã¹ã課é¡ããã£ããšãããã®èª²é¡ãæ§é ã®ã¢ãã«ãšæ¯ãèãã®ã¢ãã«ã§è¡šãããšãã§ããã°ããã®ã¢ãã«ãªãã®ããã°ã©ã ãäœæã§ããããã§ãã äžæ¹ããã®ãããªæ¹æ³ã§äœæããããã°ã©ã ãæåŸ ããåäœãããªãå Žåã«ã¯ãã¢ãã«ã誀ã£ãŠãããã察å¿ã¥ãã®ã«ãŒã«ã«äžåããããšããããšã§ãã
ããã§ç€ºãããããªã¢ãã«ãšã³ãŒãã®å¯Ÿå¿ã¥ãã®ã»ãã«ãã¢ãã«ããå¥ã®ã¢ãã«ãžããããã¯ã³ãŒãããå¥ã®ã³ãŒããžãšãã£ã察å¿ã¥ããèããããŸãã ã¢ãã«ããã³ãŒããçæããæ¹æ³ã«ã¯ããã®ãã¥ãŒããªã¢ã«ã®ããã«å³ã®èŠçŽ ãšã³ãŒãã®èŠçŽ ã察å¿ãããã«ãŒã«ã決ããŠæã§å€æããæ¹æ³ä»¥å€ã«ããããŸãã äŸãã°ãã³ãŒãçã®ãã³ãã¬ãŒãïŒã¹ãããããªã©ãšåŒã°ããŸãïŒã«ã¢ãã«ã®ããŒã¿ããŒã¹ãžã®åãåãããåã蟌ãã ã¹ã¯ãªããã䜿ã£ãŠçæããæ¹æ³ã¯ãã䜿ãããŠããŸã
ãããã¯ããœãããŠãšã¢èšèšã«ããããã¢ãã«å€æããšåŒã°ããŠããŸãïŒã³ãŒããäžçš®ã®ã¢ãã«è¡šçŸãšã¿ãªããŸãïŒã ãããŠãã¢ãã«å€æãçšããŠéçºããã»ã¹ã«ãããåå·¥çšéãã¢ãã«ã§æ¥ç¶ããŠéçºããæ¹æ³ã®ããšããã¢ãã«é§åéçºïŒMDD: Model Driven DevelopmentïŒããšåŒã³ãŸãã
ã¢ãã«é§åéçºã玹ä»ããŠããèšäºãšããŠæ¬¡ã®èšäºããããŸãã
- ã¢ãã«é§åéçºã«ãããã¢ãã«å€æã®åœ¹å²
ãã®èšäºã§ã¯ãã¢ãã«å€æã®ç¹°ãè¿ãã«ããéçºæ¹æ³ã§ããããšãããã®å®æœäŸã玹ä»ããŠããŸãã