日期:2014-05-20 浏览次数:21041 次
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; public class Bowling { public static ArrayList<Round> rounds = new ArrayList<Round>(); public static void main(String[] args) { // init();//init() 为了调试 input(); countScore(); countTatal(); display(); } // /////////////////////////////////////////////////////////////////////////////////////////// public static void init() { // 读取数据过程 每次都大于0小于10; rounds.add(new Round(10, 0)); rounds.add(new Round(10, 0)); rounds.add(new Round(10, 0)); rounds.add(new Round(7, 2)); rounds.add(new Round(9, 1)); rounds.add(new Round(8, 1)); rounds.add(new Round(8, 2)); rounds.add(new Round(10, 0)); rounds.add(new Round(9, 1)); rounds.add(new Round(10, 8)); if (rounds.get(9).firstNumber == 10) rounds.add(new Round(2, 0)); // 为了简化计算,添加虚拟轮数,实际上不存在;; } // /////////////////////////////////////////////////////////////////////////////////////////// public static void input() {// 控制台输入,模拟击柱数 Scanner scanner = new Scanner(System.in); String regex = "\\d|10"; String temp = null; int firstNumber = 0, secondNumber = 0; for (int i = 0; i < 10; i++, firstNumber = 0, secondNumber = 0) { temp = ""; System.out.println("第" + (i + 1) + "轮第一次击柱数"); while (!(temp = scanner.nextLine()).matches(regex)) ; ; firstNumber = Integer.parseInt(temp); if (firstNumber != 10) { System.out.println("第" + (i + 1) + "轮第二次击柱数"); while (!(temp = scanner.nextLine()).matches(regex)) ; ; secondNumber = Integer.parseInt(temp); } rounds.add(new Round(firstNumber, secondNumber)); } Round round = rounds.get(9);// 第9轮 System.out.println("倒数第二次击柱数"); while (!(temp = scanner.nextLine()).matches(regex)) ; ; round.secondNumber = Integer.parseInt(temp); if (round.firstNumber == 10 || round.firstNumber + round.secondNumber == 10) { System.out.println("最后一次击柱数"); while (!(temp = scanner.nextLine()).matches(regex)) ; ; firstNumber = Integer.parseInt(temp); rounds.add(new Round(firstNumber, 0)); } } // /////////////////////////////////////////////////////////////////////////////////////////// public static void display() {//输出到控制台和文件 StringBuffer sb = new StringBuffer(); sb.append("轮数: "); for (int i = 1; i <= 10; i++) { sb.append(String.format("%5d", i)); } sb.append("\r\n第一次击球得分:"); for (int i = 0; i < 10; i++) {// sb.append(String.format("%5d", rounds.get(i).firstNumber)); } sb.append("\r\n第二次击球得分:"); for (int i = 0; i < 10; i++) { Round round = rounds.get(i); if (round.firstNumber == 10) sb.append(String.format("%5d", rounds.get(i).secondNumber)); else sb.append(" /"); } sb.append("\r\n本轮得分: "); for (int i = 0; i < 10; i++) { sb.append(String.format("%5d", rounds.get(i).score)); } sb.append("\r\n累计得分: "); for (int i = 0; i < 10; i++) { sb.append(String.format("%5d", rounds.get(i).total)); } sb.append("\r\n"); System.out.println(sb.toString()); try { BufferedWriter bw = new BufferedWriter(new FileWriter( "c:/Bowling.txt")); bw.write(sb.toString()); bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // /////////////////////////////////////////////////////////////////////////////////////////// public static void countScore() {// 统计各轮分数 Round round = rounds.get(9);// 第9轮 if (round.firstNumber == 10 || round.firstNumber + round.secondNumber == 10) round.score = round.firstNumber + round.secondNumber + rounds.get(10).firstNumber; else round.score = round.firstNumber + round.secondNumber; // --------------------------------------------- for (int i = 8; i >= 0; i--) {// 第8轮,第7轮...第0轮 round = rounds.get(i); Round tempRound = rounds.get(i + 1); if (round.firstNumber == 10) {// 首次分数为10 if (tempRound.firstNumber == 10) round.score = round.firstNumber + tempRound.firstNumber + rounds.get(i + 2).firstNumber; else round.score = round.firstNumber + tempRound.firstNumber + tempRound.secondNumber; } else if (round.firstNumber + round.secondNumber == 10)// 前两次分数为10 round.score = round.firstNumber + round.secondNumber + tempRound.firstNumber; else round.score = round.firstNumber + round.secondNumber;// 首次分数为10 } } // /////////////////////////////////////////////////////////////////////////////////////////// public static void countTatal() {// 统计前n轮的累加分数 rounds.get(0).total = rounds.get(0).score;// 第0轮 for (int i = 1; i < 10; i++) // 第1轮 第2轮...第9轮 rounds.get(i).total = rounds.get(i).score + rounds.get(i - 1).total; } } class Round { private static int counter = 0;// 计数器 private final int id = counter++;// id 代表 第id轮,id = 0,1,2,3,4,5,6,7,8,9 // (可能有10) int firstNumber;// 本轮击倒第一次击倒柱数 int secondNumber;// 本轮击倒第二次击倒柱数 int score;// 本轮得分 int total;// 至本轮累计总分 public Round(int number, int secondNumber) { this.firstNumber = number; this.secondNumber = secondNumber; } } /* 第1轮第一次击柱数 10 第2轮第一次击柱数 10 第3轮第一次击柱数 10 第4轮第一次击柱数 7 第4轮第二次击柱数 2 第5轮第一次击柱数 9 第5轮第二次击柱数 1 第6轮第一次击柱数 8 第6轮第二次击柱数 1 第7轮第一次击柱数 8 第7轮第二次击柱数 2 第8轮第一次击柱数 10 第9轮第一次击柱数 9 第9轮第二次击柱数 1 第10轮第一次击柱数 10 倒数第二次击柱数 8 最后一次击柱数 2 轮数: 1 2 3 4 5 6 7 8 9 10 第一次击球得分: 10 10 10 7 9 8 8 10 9 10 第二次击球得分: 0 0 0 / / / / 0 / 8 本轮得分: 30 27 19 9 18 9 20 20 20 20 累计得分: 30 57 76 85 103 112 132 152 172 192 */