首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

昨天转正,做了道恶心的题,保龄球计分的,大家给点意见,该怎么处理

2012-03-23 
昨天转正,做了道恶心的题,保龄球计分的,大家给点意见编程题目如下:第一题:打保龄球是用一个滚球去打出十个

昨天转正,做了道恶心的题,保龄球计分的,大家给点意见
编程题目如下:
第一题:
打保龄球是用一个滚球去打出十个站立的柱,将柱击倒。一局分十轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为十轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的;滚球情况有关。即,某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:
(1) 若某一轮的第一次滚球就击倒全部十个柱,则本轮不再滚球。(若是第十轮则还需另加两次滚球)。该轮得分为本次倒柱数 10 与以后两次滚球所击倒柱数之和。
(2) 若某一轮的第一次滚球未击倒十个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部十个柱,则本轮不再滚球(若是第十轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。
(3) 若某一轮的两次滚球未击倒全部十个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数这和。
总之,若一轮中一次滚球或两次滚球击倒十个柱,则本轮得分是本轮首次滚球开始的连续三次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足十个,则本轮得分即为这两次击倒柱数之和。
以实例说明如下:
轮 1 2 3 4 5 6 7 8 9 10
各轮第一次得分10 10 10 7 9 8 8 10 9 10 8 #p#
各轮第二次得分/ / / 2 1 1 2 / 1 / 2-
各 轮 得 分30 27 19 9 18 9 20 20 20 20
累 计 总 分30,57,76,85,103,112,132,152,172,192
要求:
1.使用你熟悉的程序语言(C#,java,javascript 之一)写一个程序可以方便的对保龄球运动项目进行记分;
界面布局合理,能直观的显示每次得分,每轮得分和累计得分的情况
2.分值录入操作合理,需要有必要的无效值判断处理(比如每次击球得分不会>10等等)
3.每场比赛结束后将本次比赛数据保存下来。(选择文件或者数据库均可),

我昨天是用JAVA直接在控制台输出的,每次由我来输入击倒的数量,然后得分。我的代码算法太乱了,就不贴出来见笑了,大家还有写什么别的好办法吗?网上COPY的代码就不要来了,给点好的思路什么的,关于第2点验证和将最终数据保存成文件怎么弄啊~!希望大家一起交流下

[解决办法]

[解决办法]
这个一步步做下来没什么难的吧。。。
[解决办法]
这个应该毫无压力才对
[解决办法]
这个项目起码30万,有本事就搞定,没本事你就让别人搞定。
[解决办法]
看得出 你公司招人就招会这个题目的人了 因为当前公司肯定没人会

要是会肯定不会让你来做


[解决办法]
这打保龄球的界面该怎么弄啊..
[解决办法]

探讨
老板说这个就是以前公司的面试题,现在拿来转正做。没做好走人............

[解决办法]
探讨

这个项目起码30万,有本事就搞定,没本事你就让别人搞定。

[解决办法]
mark
[解决办法]
文字太多了,看不下去
[解决办法]
我记得这题哪本书有来着??好像是极限编程的结对???
[解决办法]
Java code
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*/ 


[解决办法]
这个感觉鸭梨很大,,自认为水平不行。
[解决办法]

探讨
这个一步步做下来没什么难的吧。。。

[解决办法]
我来溜溜。
[解决办法]
《敏捷软件开发:原则、模式与实践 》 第六章 一次编程实践

保龄球记得的结对编程。。

去下载看看吧。。。


加上PDF下载地址吧。
http://download.csdn.net/detail/java719904878/1025509(5分)

http://ishare.iask.sina.com.cn/f/5410737.html?from=like(0分)


 
[解决办法]
天啊 这是什么啊 看的头都大了
[解决办法]
敏捷原理和实践那本书里有这个项目,保龄球计分。自己去看吧。
[解决办法]
晕!!
[解决办法]
这题目没什么难度吧.
搞两个数组,数组1存放21个元素,
数组1初始化为-1;
数组2存放每轮分数,
i为数组下标,
如果扔得分10个,i++再进入下一个循环(即空出一个位置);

扔完之后统计分数;
判断奇数位
1如果不为负数,
如果加上前一个偶数位的值为10,就加上后一次偶数位的值.(偶数位必有数据,奇数位不一定)
否则此轮得分为奇数位加偶数位的和.
2如果奇数位为负数
说明得分为10,可以加后面的两个得分,
用循环加上后面两个的得分.


感觉实现很简单,就写一下得了...


C/C++ code
#include <stdio.h>int main(int argc, char const* argv[]){    int i,j;    int iround[21];    int iscore[10],icount;    for(i=0; i<21; i++)    {        scanf("%d", &iround[i]);        if(iround[i] == 10 && i%2==0)        {            printf("%d ", iround[i]);            i++;            iround[i]=-1;        }        printf("%d ", iround[i]);    }    printf("\n");    for(i=0; i<20; i++)    {        if(i%2 != 0)        {            if(iround[i] >= 0)            {                if(iround[i]+iround[i-1] == 10)                 {                    iscore[i/2] = iround[i] + iround[i-1] + iround[i+1];                }                else                {                    iscore[i/2] = iround[i] + iround[i-1];                }            }            else            {                for(iscore[i/2] = icount = 0, j = i; icount < 2 && j<21; j++)                {                    if(iround[j] >= 0)                    {                        icount++;                        iscore[i/2] += iround[j];                    }                }                iscore[i/2] += iround[i-1];            }        }    }    for(i = 0; i<10; i++)    {        printf("%d ", iscore[i]);    }    printf("\n");}
[解决办法]
不知道为啥,最近看到那么多字,头晕,没看完
[解决办法]
探讨
这题目没什么难度吧.
搞两个数组,数组1存放21个元素,
数组1初始化为-1;
数组2存放每轮分数,
i为数组下标,
如果扔得分10个,i++再进入下一个循环(即空出一个位置);

扔完之后统计分数;
判断奇数位
1如果不为负数,
如果加上前一个偶数位的值为10,就加上后一次偶数位的值.(偶数位必有数据,奇数位不一定)
否则此轮得分为奇数位加偶数位的和.
2如果奇数……

[解决办法]
还真够牛的,转正还要做题,还真的什么事都有
[解决办法]
mark 学习
[解决办法]
题没看明白
[解决办法]
探讨
这题目没什么难度吧.
搞两个数组,数组1存放21个元素,
数组1初始化为-1;


数组2存放每轮分数,
i为数组下标,
如果扔得分10个,i++再进入下一个循环(即空出一个位置);

扔完之后统计分数;
判断奇数位
1如果不为负数,
如果加上前一个偶数位的值为10,就加上后一次偶数位的值.(偶数位必有数据,奇数位不一定)
否则此轮得分为奇数位加偶数位的和.
2如果奇数……


[解决办法]
探讨

输入的时候直接输入 扔球的顺序就可以了;
10 10 10 7 2 9 1 8 1 8 2 10 9 1 10 8 2

[解决办法]
最低击柱机会 下界11上届21 
应该要设计程序控制它,希望过来人嗮嗮这种控制技巧
[解决办法]
还有输出 我的程序 在eclipse中输出格式 和 在文件中输出格式 有点区别

希望高手无私指点,怎么消除这种差别
[解决办法]
看题目就看了好久了
[解决办法]
好 我很 慌张 刚学c++ 压力很大 
小弟是自学 刚学过vb 感觉b很方便 但是大家都用 vc 我就又过来学 vc了 嗨 

[解决办法]
好像是一本书中的例子
[解决办法]
30万韩币差不多。

可以先画个三五轮,找找变量和计算公式,其实和初高中的数学竞赛题差不多,只不过用计算机的方式来描述计算了。
[解决办法]
不是很难 不过 细细心心的做一遍也有点出入
[解决办法]
好像是重构方面的一本书里的例子讲的就是介玩意
[解决办法]
建模不容易

热点排行