保龄球计分的面向对象实现 OO
程序员文章站
2022-07-04 08:34:41
...
闲来无事,看到论坛中一个帖子谈到
《OO 还是 procedural 小程序的设计》http://www.iteye.com/topic/1112383
尝试用OO的方式写了一下(真的是太闲了 ):
保龄球基本规则: 每一盘可以有10 个frame ,从1-9 个 frame 是有两次击球机会,第10个 有可能有3次机会。
如果一个frame第一个球全中(strike) 那就 进入 下一个frame, 并把下两次击球的得分算为这次的bonus。
如果一个frame 没有全中,就打这个frame的第二个球, 如果补了个全中(Spare),那就把下一次击球的得分算为bonus。
如果一个frame既没有全中,也没有补全中,那就击倒几个瓶算积分。
第10个frame,如果是全中,或者补中 就有3次击球机会,并把三次击球总共打倒的瓶数算为这个frame的分数。
《OO 还是 procedural 小程序的设计》http://www.iteye.com/topic/1112383
尝试用OO的方式写了一下(真的是太闲了 ):
引用
保龄球基本规则: 每一盘可以有10 个frame ,从1-9 个 frame 是有两次击球机会,第10个 有可能有3次机会。
如果一个frame第一个球全中(strike) 那就 进入 下一个frame, 并把下两次击球的得分算为这次的bonus。
如果一个frame 没有全中,就打这个frame的第二个球, 如果补了个全中(Spare),那就把下一次击球的得分算为bonus。
如果一个frame既没有全中,也没有补全中,那就击倒几个瓶算积分。
第10个frame,如果是全中,或者补中 就有3次击球机会,并把三次击球总共打倒的瓶数算为这个frame的分数。
public interface IFrame { int BALLS = 10; /** 当前Frame以及之后的总分 */ int totalScore(); /** 当前Frame得分 */ int frameScore(); /** 当前Frame可贡献的Spare奖励 */ int getSpareBonus(); /** 当前Frame可贡献的Strike奖励 */ int getStrikeBonus(); IFrame nextFrame(); void setNextFrame(IFrame frame); }
public abstract class AbstractFrame implements IFrame { private IFrame nextFrame; @Override public int totalScore() { return frameScore() + nextFrame().totalScore(); } @Override public IFrame nextFrame() { return nextFrame; } @Override public void setNextFrame(IFrame frame) { nextFrame = frame; } }
public class StrikeFrame extends AbstractFrame implements IFrame { @Override public int frameScore() { return BALLS + nextFrame().getStrikeBonus(); } @Override public int getSpareBonus() { return BALLS; } @Override public int getStrikeBonus() { return BALLS + nextFrame().getSpareBonus(); } }
public class SpareFrame extends AbstractFrame implements IFrame { protected int[] hits; public SpareFrame(int[] hits) { this.hits = hits; } @Override public int frameScore() { return BALLS + nextFrame().getSpareBonus(); } @Override public int getSpareBonus() { return hits[0]; } @Override public int getStrikeBonus() { return BALLS; } }
public class NormalFrame extends AbstractFrame implements IFrame { protected int[] hits; public NormalFrame(int[] hits) { this.hits = hits; } @Override public int frameScore() { return hits[0] + hits[1]; } @Override public int getSpareBonus() { return hits[0]; } @Override public int getStrikeBonus() { return hits[0] + hits[1]; } public void setHits(int[] hits) { this.hits = hits; } }
public abstract class AbstractFinalFrame extends AbstractFrame implements IFrame { @Override public int totalScore() { return frameScore(); } @Override public IFrame nextFrame() { throw new RuntimeException("不支持此方法!"); } }
public class FinalStrikeFrame extends AbstractFinalFrame implements IFrame { protected int[] hits; public FinalStrikeFrame(int[] hits) { this.hits = hits; } @Override public int frameScore() { return BALLS + hits[1] + hits[2]; } @Override public int getSpareBonus() { return BALLS; } @Override public int getStrikeBonus() { return BALLS + hits[1]; } }
public class FinalSpareFrame extends AbstractFinalFrame implements IFrame { protected int[] hits; public FinalSpareFrame(int[] hits) { this.hits = hits; } @Override public int frameScore() { return BALLS + hits[2]; } @Override public int getSpareBonus() { return hits[0]; } @Override public int getStrikeBonus() { return BALLS; } public void setHits(int[] hits) { this.hits = hits; } }
public class FinalNormalFrame extends AbstractFinalFrame implements IFrame { protected int[] hits; public FinalNormalFrame(int[] hits) { this.hits = hits; } @Override public int frameScore() { return hits[0] + hits[1]; } @Override public int getSpareBonus() { return hits[0]; } @Override public int getStrikeBonus() { return hits[0] + hits[1]; } public void setHits(int[] hits) { this.hits = hits; } }
public class FrameFactory { static IFrame buildFrame(int[] hits) { if (hits[0] == IFrame.BALLS) return new StrikeFrame(); if (hits[0] + hits[1] == IFrame.BALLS) return new SpareFrame(hits); return new NormalFrame(hits); } static IFrame buildFinalFrame(int[] hits) { if (hits[0] == IFrame.BALLS) return new FinalStrikeFrame(hits); if (hits[0] + hits[1] == IFrame.BALLS) return new FinalSpareFrame(hits); return new FinalNormalFrame(hits); } public static IFrame buildFrames(int[][] hitCounts) { if (hitCounts == null || hitCounts.length == 0) throw new IllegalArgumentException("参数无效!"); IFrame last = buildFinalFrame(hitCounts[hitCounts.length - 1]); for (int i = hitCounts.length - 2; i >= 0; i--) { IFrame frame = buildFrame(hitCounts[i]); frame.setNextFrame(last); last = frame; } return last; } }
public class Main { public static void main(String[] args) { int[][] hitCounts = new int[][] { { 10, 0 }, { 7, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; IFrame head = FrameFactory.buildFrames(hitCounts); System.out.println(head.totalScore()); } }