JAVA -볼링 게임
이론
Ex)
1프레임,2프레임 스트라이크 치고 3프레임 첫번째 5개, 두번째 3개 넘어뜨리면
1프레임 : 25점 => 1프레임 스트라이크 10점 + 2프레임 스트라이크 10점 + 3프레임 첫번째 투구 5점
2프레임 : 18점 (43점) => 2프레임 스트라이크 10점 + 3프레임 첫번째 5점 + 3프레임 두번째 3점
3프레임 : 8점 (51점) => 3프레임 첫번째 5점 + 3프레임 두번째 3점
.
.
.
점수의 계산법
볼링의 점수는 얼핏 보기에는 어려고 복잡한 듯 하지만, 그 기본은 10개의 프레임의 단순한 '덧셈'이다.
스페어(두 번째 투구에서 핀을 모두 쓰러뜨림)와 스트라이크(첫번째 투구에서 모든 핀을 쓰러뜨림)의 경우에만 보너스점이 가산되는 것이다.
볼링 점수의 특징은, 같은 숫자의 스트라이크와 스페어가 기록되더라도 '스트라이크를 계속 내었는냐, 스페어 다음의 제 1투궁서 핀 카운트가 몇점이냐...에 따라서 총점이 크게 달라지는 것이다.
계산방법
기본적으로는 쓰러진 핀의 숫자를 합해서 그 프레임까지의 합계점을 산출해 나간다.
스페어를 처리했을 경우에는 그 다음 프레임의 첫번째 투구에서 쓰러뜨린 핀의 숫자까지 더한다.
스트라이크의 경우에는 그 다음 프레임의 두번째 투구까지의 쓰러진 핀 수를 더한다.
파울을 범했을 때는 0점이 되면, 그 투구에서 넘어진 핀은 득점으로 간주되지 않는다.
10번째의 프레임에서 스트라이크나 스페어를 처리하면 세 번째의 투구까지 할 수 있다. 단 10번의 프레임 중 한 프레임에서 발생한 스트라이크와 스페어는 거듭해서 더해질 수 없다.
게임 채점방법
★ 스트라이크가 되었을 때를 제외하고는 첫 번째 투구로 넘어진 핀 수를 왼쪽 상단칸에 기록하며, 두 번째 투구로 넘어진 핀수는 오른쪽 상단칸에 기록한다. 만약 두 번째 투구로 1핀도 넘어지지 않으면 '-'로 표시한다.
두 번째 투구가 끝나면 즉각 점수가 기록되어야 한다.
스트라이크 재1투구로 10개의 핀을 전부 넘어뜨렸을 때 스트라이크로 기록하며, 채점표 상단 좌측에 x로 표시한다.
스트라이크를 득한 프레임의 채점은 다음 프레임이 완료될 때까지 득점을 기대하지 않는다. 스트라이크에 이어 다음 프레임이 스페어이면 득점은 20점이 된다.
★ 더블 연속하여 2개의 스트라이크를 득하면 더블로 기록하며, 다음 투구가 완료되기 전까지는 첫 스트라이크 프레임의 득점을 기재하지 않는다. 더블의 득점은 20점에 다음 투구로 넘어간 핀 수의 합산이 된다. 즉, 더블 다음 제3투구에 9핀이 넘어지면 첫 스트라이크를 득한 프레임의 득점은 29점이 된다.
★ 트리플 또는 터키 - 연속하여 3개의 스트라이크를 득하면 터키로 기록하며, 처음 스트라이크를 득한 프레임에 득점 30점을 기재한다.
따라서 300점 만점을 득하기 위하여는 한 게임 첫 프레임부터 12프레임 전부 12개의 연속 스트라이크를 득하여야 한다.
★ 스페어
어떤 프레임에서든지 제 2투구로 남은 핀을 전부 넘어뜨렸을 때 스페어로 기록하며, 채점표 상단 우측에 '/'로 표시한다.
스페어 이전 제 1투구로 넘어진 핀의 수를 해당 프레임 상단 좌측에 작게 기록하며, 해당 프레임의 득점은 제 2투구가 끝날 때까지 기록하지 않는다. 스페어를 득하였을 때는 다음 프레임의 제 1투구에 넘어진 핀의 숫자를 10점에 가산한 득점을 스페어를 득한 프레임에 기재한다. 10번 프레임에 스페어를 득하였을 때는 동일 레인에서 계속해서 제 3투구를 해야 한다.
=======================================================================================
◈ 점수 계산법
아래의 계산법으로 계산을 해보면 스트라이트 12개를 연속으로 치는 퍼펙트의 점수는 자연스럽게 300점 이라는 것을 알 수 있지요.
볼링의 한 게임은 10개의 프레임으로 구성되며, 스트라이크가 나왔을 때를 제외하고는 각 프레임마다 2회까지 투구할 수 있다. 그러나 마지막인 10프레임에서는 스트라이크, 또는 스페어를 처리하면 3회까지 투구한다.
핀 한개를 1점으로 계산하여 스트라이크는 10점을 얻고 다음 프레임의 점수를 보너스로 받으며, 스페어 처리를 했을 때는 다음 프레임의 제1구 점수를 보너스로 받는다.
아래의 점수 계산 예를 보자.
1프레임
제1구에서는 9핀을 쓰러뜨리고 제2구에서는 남은 핀을 쓰러뜨리지 못해서 9점이 된다.
2프레임
제1구는 8점, 제2구는 남은 핀을 모두 쓰러뜨려 스페어를 기록함으로써 기본 점수 10점과 다음 프레임의 1구 점수인 7점을 보너스로 받았다. 9+10+7=26점
3프레임
제1구 7점, 제2구는 2개의 핀만 쓰러뜨림으로써 9점만 더해진다. 26+7+2=35점
4프레임
제1구로 10핀 모두를 쓰려 뜨려 스트라이크를 쳐서 기본 점수 10점과 다음 프레임의 1,2구 점수를 보너스로 받아 20점이 더해진 다. 35+10+9+1=55점
5프레임
제1구에 9점, 제2구로 남은 핀을 쓰려 뜨려 스페어처리를 해서 10점을 얻었으나, 다음 프레임의 1구에서 파울을 기록함으로써 보너스가 없다. 55+10=65점
6프레임
제1구 파울, 제2구 9핀을 쓰러뜨렸으므로 9점이 더해진다. 65+0+9=74점
7프레임
제1구에 스트라이크를 기록함으로써 기본 점수 10점과 다음 프레임의 1,2구 점수인 10점을 보너스로 받아 모두 20점이 더해진다. 74+10+0+10=94점
8프레임
제1구는 레인 옆 통로에 빠진 거터(gutter)볼로 0점, 제2구는 스페어처리를 해서 10점과 다음 프레임의 1구 점수인 9점이 더해진다. 94+0+10+9=113점
9프레임
제1구 9점, 제2구는 스페어처리를 못해서 0점으로 모두 9점이 더해진다. 113+9+0=122점
10프레임
제1,2구는 스트라이크, 제3구는 8점으로 모두 28점이 더해진다. 122+10+10+8=150점
-------------------------------------------------------------------------------------------------------------
구현(60%정도 완성)
package game;
import java.io.IOException;
import java.util.Scanner;
public class bowling
{
public static void main(String[] args)throws IOException
{
Scanner input = new Scanner(System.in);
int frm; //프레임카운트
int []f_num = new int[20]; //첫번째 점수
int []s_num = new int[20]; //두번째 점수
int []result= new int[10]; //합계
int i = 0;
for(frm=0; frm <=9; frm++)
{
while(true)
{
System.out.print("첫번째 핀을 쓰러뜨린 개수(0~10) :");
f_num[frm] = input.nextInt();//첫번째 핀 입력
if(f_num[frm] < 11)
break;
System.out.println("잘못 입력되었습니다.");
}
if(10 - f_num[frm] != 0)//핀이 남아 있지 않을경우 남은핀 출력하지 않음
{
System.out.println("\n남은핀수 :" + (10 - f_num[frm]));
}
if(f_num[frm] == 10)
{
System.out.print("strake\n");
s_num[frm] = 0;
}
else
{
while(true)
{
System.out.printf("\n두번째 핀을 쓰러뜨린 개수 (%d~10) :",10 - f_num[frm]);
s_num[frm] = input.nextInt();
if(s_num[frm] < 11)
break;
System.out.println("잘못 입력되었습니다.");
}
}
if((f_num[frm] + s_num[frm]) == 10)
{
if(f_num[frm] != 10)
System.out.println("spare");
}
else
{
System.out.println("\n남은핀수 :" + (10 - (f_num[frm] + s_num[frm])));
}
System.out.println("Frame"+frm);//프레임 카운트
System.out.println("┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────────┐");
System.out.println("│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │");
System.out.println("├───┬───┼───┬───┼───┬───┼───┬───┼───┬───┼───┬───┼───┬───┼───┬───┼───┬───┼───┬───┬───┤");
for(i = 0 ; i <= 9 ; ++i)
{
if(f_num[i] == 10)
{
System.out.print("│ X │ "+s_num[i] + " ");//스트라이크일 경우 'X'를 출력한다.
}
else if(f_num[i] + s_num[i] == 10)
{
System.out.print("│ "+f_num[i]+" │ / "); //스페어일 경우 '/'를 출력한다.
}
else
{
System.out.print("│ "+f_num[i]+" │ "+s_num[i] + " ");//이도저도 아닐경우 핀의 수를 출력한다.
}
}
System.out.println("│ │");
System.out.println("├───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┼───┴───┴───┤");
//System.out.print("│");
for(i = 0 ; i <= 9 ; ++i)
{
result[i]= f_num[i] + s_num[i];
if(i != 9)
System.out.printf("│ %3d ",result[i]);
else
System.out.printf("│ "+result[i]);
}
System.out.println(" │");
System.out.println("└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────────┘");
}
}
}
-------------------------------------------------------------
아직 하지 못한 부분은 각프레임의 값을 더해서 result에 넣지 못한것과
마지막 10프레임에 값을 제대로 집어 놓지 못했다.
'School Study' 카테고리의 다른 글
[BSP]업무일지 - 20100805 (0) | 2010.08.06 |
---|---|
[BSP]업무일지 - 20100804 (0) | 2010.08.05 |
[BSP]업무일지 - 2010729 (0) | 2010.07.29 |
[BSP]업무일지 - 2010728 (0) | 2010.07.28 |
[BSP]업무일지 - 2010727 (0) | 2010.07.28 |