반응형
package days1;
// 이름, 성별, 단/복식을 선언한 슈퍼클래스
public abstract class GameElement {
private String [] name;
private int set;
public GameElement() {
}
public GameElement(String[] name, int gender, int soloDuo) {
this.name = name;
this.set = set;
}
public String[] getName() {
return name;
}
public String[] setName() {
return name;
}
public int getset() {
return set;
}
public void setset(int set) {
this.set = set;
}
}
package days1;
import java.util.Random;
public class GameMethod extends GameElement{
// 계수기 출력, Log파일 생성, Player클래스로부터 받은 이름
// 넘겨주기 위한 객체 생성 및 초기화
ScoreBoard sb = new ScoreBoard();
// 포인트, 게임, 세트를 저장하고 ScoreBoard 클래스로 넘겨주기 위한 배열
int [][] board = new int [2][3];
// 점수 발생을 위한 랜덤 객체
Random rnd = new Random();
int a = 0;
// 세트 스코어를 확인하는 메소드
public void setCheck(int a) {
while (board[0][2] < a && board[1][2] < a) { //선수 1 과 2의 세트 스코어를 나타낸다
gameCheck();
}
}
// 계수기에 선수 이름을 출력하기 위한 메소드
public void nameSet(String[] names) {
sb.setScoreBoardName(names);
}
// Log파일 이름에 선수 이름을 지정하기 위한 메소드
public void getNames(String[] names) {
sb.getNames(names);
}
// 게임 스코어를 확인하는 메소드
private void gameCheck(){ //스코어 갱신 선수 1과 2중 누가 서브를 칠지는 a 변수에 저장된다
while (!(board[a][1] - board[1-a][1] >1 && board[a][1] > 5)) {
//1보다크고 5보다 클 때까지 반복
gameRoll(); //gameRoll() 메서드가 호출
if(board[a][1] == 6 && board[1-a][1] == 6) {
//playTieBreak() 메서드를 호출하고 그 결과를 a에 할당하고 반복문을 종료
a = playTieBreak();
break;
}
}
board[0][1] = board[1][1] = 0;
board[a][2]++;
sb.printSet(a, Integer.toString(board[a][2]));
//게임보드의 위치 초기화, 해당 위치에 있는 값 증가 sb는 출력작업을 처리하는 데 사용
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
// 타이브레이크
private int playTieBreak() {
while (!(board[a][0] > 6 && board[a][0] - board[1-a][0] >= 2)) {
a = rnd.nextInt(2);
board[a][0]++;
sb.printScore(Integer.toString(board[0][0]), Integer.toString(board[1][0]));
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
board[a][1]++;
sb.printGame(a, Integer.toString(board[a][1]));
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
return a;
}
// 포인트 생성 메소드
private void gameRoll() {
String [] score = {"0","15","30","40","WIN"};
while(!(board[a][0] > 3 && board[a][0] - board[1-a][0] > 1)) {
// while 루프는 현재 플레이어(a)가 이길 때까지 반복됩니다.
// 이를 위해 board 배열에서 현재 플레이어(a)의 득점 상황(board[a][0])을 1 증가
a = rnd.nextInt(2);
board[a][0]++;
sb.printScore(score[board[0][0]], score[board[1][0]]);
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
if(board[0][0] == 3 && board[1][0] == 3) a = playDeuce();
} //while end
board[0][0] = board[1][0] = 0;
board[a][1]++;
sb.printGame(a, Integer.toString(board[a][1]));
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
// 듀스 상황에서 포인트를 생성하는 메소드
private int playDeuce() {
String [] score = {"0","15","30","40","AD","WIN"};
while(!(board[a][0] == 5 && board[1-a][0] == 3)) {
a = rnd.nextInt(2);
board[a][0]++;
if(board[1-a][0] == 4) board[1-a][0]--;
sb.printScore(score[board[0][0]], score[board[1][0]]);
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
return a;
}
}
package days1;
import java.io.IOException;
import java.util.Scanner;
public class Player extends GameElement{
String[] name;
Scanner sc = new Scanner(System.in);
public void createPlayer() {
// 게임 방식 입력
System.out.print("게임 방식을 입력하시오 (3 4) : ");
int set = sc.nextInt();
while (!(set == 3||set ==4)) {
System.out.println("올바른 입력이 아닙니다.");
System.out.print("다시 게임 방식을 입력하시오 (3set 4set) : ");
set = sc.nextInt();
try {
System.in.skip(System.in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
// // 이름을 저장할 배열의 크기를 단식이면 2, 복식이면 4로 입력 방식에 따라 유동적으로 할당
//[soloDuo * 2]; //
// // 단식을 선택한 경우 - 성별 선택
// if(soloDuo == 1) {
// System.out.print("성별을 입력하시오 (1.남자 2.여자) : ");
// gender = sc.nextInt();
// while (!(gender == 1||gender ==2)) {
// System.out.println("올바른 입력이 아닙니다.");
// System.out.print("다시 성별을 입력하시오 (1.남자 2.여자) : ");
// gender = sc.nextInt();
// try {
// System.in.skip(System.in.available());
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
// // 복식을 선택한 경우 - 성별 선택
// else {
// System.out.print("성별을 입력하시오 (1.남자 2.여자 3.혼성) : " );
// gender = sc.nextInt();
// while (!(gender == 1||gender == 2 ||gender == 3)) {
// System.out.println("올바른 입력이 아닙니다.");
// System.out.print("다시 성별을 입력하시오 (1.남자 2.여자 3.혼성) : ");
// gender = sc.nextInt();
// try {
// System.in.skip(System.in.available());
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
//
// if(gender == 1) {
// gender = 3;
// }
// else {
// gender = 2;
// }
// 선수 이름 입력
if (set == 3) {
name = new String[2];
} else {
name = new String[4];
}
for (int i = 0; i < name.length; i++) {
System.out.printf("%d번 선수의 이름을 입력하시오 : ", i+1);
name[i] = sc.next();
}
this.setset(set);
// this.setname(name);
// this.setGender(gender);
// this.setSoloDuo(soloDuo);
}
}
package days1;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.Date;
public class ScoreBoard {
LocalTime elapsedTime = LocalTime.now(); // Play Time 계산을 위한 변수, 테니스 게임을 시작하는 순간의 시간
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); // 시간 출력 형식
String [][] scoreBoard = createScoreBoard(); // 계수기, 클래스 전반적으로 쓰이기 때문에 전역변수로 선언
String logFileNames; // Log 파일 이름을 지정하기 위한 변수
int temp; // 세트가 종료될 때 다음 세트 기록을 위해 계수기의 주소를 증가시키기 위한 변수
// 입력받은 이름을 Log 파일 제목에 반영하기 전 가공
public void getNames(String[] name) {
logFileNames = Arrays.toString(name);
}
// 계수기 생성 메소드
private String[][] createScoreBoard() {
scoreBoard = new String [3][8];
String [] menu = {"Team","Point","Set 1","Set 2","Set 3","Set 4","Set 5","Match"};
// 배열의 0번째 행 - 카테고리로 초기화
for (int i = 0; i < menu.length; i++) {
scoreBoard[0][i]=menu[i];
}
// 이름 입력되는 공간을 제외한 나머지 부분을 0으로 초기화
for (int i = 1; i < scoreBoard.length; i++) {
for (int j = 1; j < scoreBoard[i].length; j++) {
scoreBoard[i][j]=Integer.toString(0);
}
}
// 계수기 생성 완료 -> 전역변수 scoreboard로 반환
return scoreBoard;
}
// 계수기에 선수 이름 반영하는 메소드
public void setScoreBoardName(String[] names) {
// 단식일 경우
if(names.length == 2) {
scoreBoard[1][0] = names[0];
scoreBoard[2][0] = names[1];
}
// 복식일 경우
else if(names.length == 4 ){
scoreBoard[1][0] = names[0] + "/" + names[1];
scoreBoard[2][0] = names[2] + "/" + names[3];
}
}
// 포인트를 계수기에 반영 및 출력하는 메소드
public void printScore(String score1, String score2) {
scoreBoard[1][1] = score1;
scoreBoard[2][1] = score2;
printBoard();
}
// // 게임스코어를 계수기에 반영 및 출력하는 메소드
// public void printGame(int a, String gameScore) {
//
// int i = temp;
//
// if( a == 0) scoreBoard[1][2 + i] = gameScore;
// else scoreBoard[2][2 + i] = gameScore;
//
// // 양 측의 점수 차이 계
// int sbd = Math.abs(Integer.parseInt(scoreBoard[1][2+i]) - Integer.parseInt(scoreBoard[2][2 + i]));
//
// // 2게임차 이상이면서 먼저 6게임을 딴 경우 또는 타이브레이크 상황에서 7게임을 먼저 딴 경우
// // 현재 주소에는 더이상 기록하지 않고 다음 세트를 기록하는 주소로 이동하기 위해 temp를 증가시킴
// for (int j = 1; j < 3; j++) {
// if(scoreBoard[j][2 + i].contains("6") && sbd >= 2) temp++;
// else if(scoreBoard[j][2 + i].contains("7")) temp++;
// }
//
// printBoard();
// }
//
// // 세트스코어를 계수기에 반영 및 출력하는 메소드
// public void printSet(int a, String setScore) {
//
// if( a == 0) scoreBoard[1][7] = setScore;
// else scoreBoard[2][7] = setScore;
// printBoard();
// }
// Log 파일 생성 메소드
// public void creattxtfile(String[][] scoreBoard, String logFileNames) {
//
// LocalDate todayLog = LocalDate.now(); // Log 파일 제목에 현재 날짜를 반영하기 위한 객체 생성
// Date dayLog = new Date(); // Log가 기록될 때 현재 시간을 기록하기 위한 객체 생성
//
// // Log 파일 이름 형식 및 저장 위치 설정, 저장 위치 : C:\Users\"컴퓨터 사용자의 이름" => 모든 컴퓨터에서 동일하게 적용됨(user.home의 기능)
// String fileName = System.getProperty("user.home") + "\\" + todayLog + logFileNames + " GameLog.txt";
//
// // 게임 시작 시의 시간 elapsedTime과의 차이를 계산하여 Play Time을 Log 파일에 기록
// LocalTime timeLog = LocalTime.now();
// Duration du = Duration.between(elapsedTime, timeLog);
//
// // 시간 변환, 시/분/초
// long hour = du.toHours();
// long min = du.toMinutes() % 60;
// long sec = du.getSeconds() % 60;
//
// try {
// FileWriter fw = new FileWriter(fileName, true);
// PrintWriter pw = new PrintWriter(fw);
// pw.printf("Current Time: " + sdf.format(dayLog) +
// "\t\t\t Play Time: %02d:%02d:%02d", hour, min, sec);
// pw.println();
// pw.println("--------------------------------------------------------------");
// for (int i = 0; i < scoreBoard.length; i++) {
// for (String line : scoreBoard[i]) {
// pw.print(line+"\t");
// }
// pw.println();
// pw.println("--------------------------------------------------------------");
// }
// pw.println("\r\n");
// fw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// }
//
// 계수기 출력 메소드
// public void printBoard() {
//
// Date today = new Date(); // 현재 날짜를 반영하기 위한 객체 생성
// LocalTime todayBoard = LocalTime.now(); // 게임 시작 시의 시간 elapsedTime과의 차이를 계산하여 Play Time을 반영
// Duration du = Duration.between(elapsedTime, todayBoard);
//
// // 시간 변환, 시/분/초
// long hour = du.toHours();
// long min = du.toMinutes() % 60;
// long sec = du.getSeconds() % 60;
// System.out.printf("Current Time: " + sdf.format(today) +
// "\t\t\t\t Play Time: %02d:%02d:%02d\n", hour, min, sec);
// System.out.println("------------------------------------------------------------------------");
//
// for (int i = 0; i < scoreBoard.length; i++) {
//
// for (int j = 0; j < scoreBoard[i].length; j++) {
// System.out.printf("\t%s", scoreBoard[i][j]);
// }
// System.out.println();
// System.out.println("------------------------------------------------------------------------");
//
// }
// System.out.println("\n\n\n");
//
// // 콘솔 또는 실행 파일에 출력하면서 Log파일에 기록
// creattxtfile(scoreBoard, logFileNames);
// }
//
}
package days1;
import java.io.IOException;
// 실행을 위한 메인함수가 있는 클래스
public class Tennis {
public static void main(String[] args) {
Player p = new Player(); // 플레이어 객체 생성
p.createPlayer(); // User로부터 게임 진행 관련 정보를 입력받음
GameMethod g = new GameMethod(); // 테니스 게임 세팅을 위한 객체 생성
String[] names = p.getName(); // 입력받은 이름 저장
int set =p.getset();
int a = p.getset(); // 입력받은 세트를 저장
g.nameSet(names); // 계수기에 이름 반영
g.getNames(names); // Log 파일 생성 시 파일 제목에 이름 반영
g.setset(set);
g.setCheck(a); // 테니스 게임 진행
// 게임 종료
try {
System.out.println("게임이 끝났습니다. Enter를 누르면 종료합니다.");
System.in.read();
System.in.skip(System.in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
}