냥코딩쟝
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();
      }
      
   }

}
profile

냥코딩쟝

@yejang

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!