본문 바로가기
java/예제&실습

[명품자바] 6장 실습문제

by unhyepnhj 2024. 6. 27.

난이도 6 이상만

 

6. 경과시간 맞추기 게임 [난이도 6]

- 다음 예시를 참고하여 <Enter> 키를 입력하면 현재 초 시간을 보여주고, 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임

※<Enter> 키 입력을 위해서 Scanner.nextLine()을 호출하면 된다

 

Player 클래스

import java.util.Calendar;

public class Player{
	Calendar calendar;
	String name;
	int previous;
	int following;
	int interval;
	
	public Player(String name) {
		this.name=name;
	}
	
	public int getPreviousTime() {
		calendar=Calendar.getInstance();
		previous=calendar.get(Calendar.SECOND);
		return previous;
	}
	
	public int getFollowingTime() {
		calendar=Calendar.getInstance();
		following=calendar.get(Calendar.SECOND);
		return following;
	}
	
	public int getInterval() {
		interval=Math.abs(previous-following);
		return interval;
	}
	
	public int getIntervalWith10() {
		return Math.abs(10-interval);
	}
}

 

Game 클래스

import java.util.Scanner;

public class Game {
	public void run(Player p) {
		Scanner scanner=new Scanner(System.in);
		
		System.out.println();
		System.out.print(p.name+" 시작 <Enter>키 >> ");
		scanner.nextLine();
		System.out.println("현재 초 시간 = "+p.getPreviousTime());
		System.out.print("10초 예상 후 <Enter> 키 >> ");
		scanner.nextLine();
		System.out.println("현재 초 시간 = "+p.getFollowingTime());
	}
	
	public void compare(Player p1, Player p2) {
		if(p1.getIntervalWith10()<p2.getIntervalWith10())
			System.out.println("승자는 "+p1.name);
		else if(p1.getIntervalWith10()>p2.getIntervalWith10())
			System.out.println("승자는 "+p2.name);
		else
			System.out.println("비겼습니다");
	}
}

 

TimeEx 클래스(main)

public class TimeEx {
	public static void main(String[] args) {	
		Player p1=new Player("황기태");
		Player p2=new Player("이재문");
		Game g=new Game();
		
		System.out.println("10초에 가까운 사람이 이기는 게임입니다.");
		g.run(p1);
		g.run(p2);
		
		System.out.println();
		System.out.print(p1.name+"의 결과 "+p1.getInterval()+", "+p2.name+"의 결과 "+p2.getInterval()+", ");
		g.compare(p1, p2);
	}
}

 

문제 풀 때 클래스를 따로따로 만드는 경향이 있는데

별 이유는 없고 그냥 그 편이 멋있는 것 같습니다


9. 철수와 컴퓨터의 가위바위보 게임 [난이도 7]

- 가위, 바위, 보는 각각 1, 2, 3 키

- 철수가 키를 입력하면, 동시에 프로그램도 Math.Random()을 이용하여 1, 2, 3 중에 한 수를 발생시키고 이것을 컴퓨터가 낸 것으로 함

- 철수와 컴퓨터 중 누가 이겼는지 판별하여 승자를 출력

 

>> 실행

 

Player 클래스

public class Player {
	String name;
	int input;
	String output;
	
	public Player(String name) {
		this.name=name;
	}
	
	public String showOutput() {
		switch(input) {
		case 1:
			return "가위";
		case 2:
			return "바위";
		case 3:
			return "보";
		default:
			return "";
		}
	}
	
	public int makeRandom() {
		int rand=(int)(Math.random()*3+1);	//1부터 3까지 난수 생성
		return rand;
	}
}

 

RPSGameEx클래스(main)

import java.util.Scanner;

public class RPSGameEx {
	public void run() {

		Player p1=new Player("철수");
		Player p2=new Player("컴퓨터");
		
		Scanner scanner=new Scanner(System.in);
		
		while(true) {

			System.out.print(p1.name+" [가위(1), 바위(2), 보(3), 종료(4)] >> ");
			p1.input=scanner.nextInt();
			p2.input=p2.makeRandom();
			
			if(p1.input==4) {
				System.out.println("종료합니다");
				break;
			}
			
			System.out.printf("%s(%s) : %s(%s)\n", p1.name, p1.showOutput(), p2.name, p2.showOutput());
			compare(p1, p2);
		}
	}
	
	public void compare(Player p1, Player p2) {
		if(p1.input==p2.input)
			System.out.println("비겼습니다.");
		else if((p1.input==1&&p2.input==3) || (p1.input==2&&p2.input==1) || (p1.input==3&&p2.input==2))	
			System.out.println(p1.name+"가 이겼습니다.");	//철수가 이기는 경우
		else
			System.out.println(p2.name+"가 이겼습니다.");	//컴퓨터가 이기는 경우
		System.out.println();
	}

	public static void main(String[] args) {
		RPSGameEx game=new RPSGameEx();
		game.run();
	}
}

10. 겜블링 게임 [난이도 7]

- 두 사람이 번갈아 가며 게임을 진행

- 이들의 이름을 키보드로 입력받으며 각 사람은 Person 클래스로 작성(->Person 객체 2개 생성)

- 각 사람이 자신의 차례에서 <Enter> 키를 입력하며 3개의 난수가 발생, 이 숫자가 모두 같으면 승리하고 게임 종료

- 난수 범위 1~3으로 설정

 

>> 실행

 

Player 클래스

public class Player {
	String name;
	int n1, n2, n3;
	boolean isWinner=false;
	
	public Player(String name) {
		this.name=name;
	}
	
	public void setAndShowNum() {
		n1=(int)(Math.random()*3+1);
		n2=(int)(Math.random()*3+1);
		n3=(int)(Math.random()*3+1);
		
		System.out.print( "      "+n1+"      "+n2+"      "+n3+"      ");
	}
	
	public void showResult() {
		if(n1==n2&&n2==n3) {
			isWinner=true;
			System.out.println(name+"님이 이겼습니다!");
		}
		else
			System.out.println("아쉽군요!");
	}
}

 

GamblingEx 클래스(main)

import java.util.Scanner;

public class GamblingEx {
	public void run() {
		Player[] p = new Player[2];	//두 사람이 진행
		Scanner scanner=new Scanner(System.in);
		
		for(int i=0; i<p.length; i++) {
			System.out.print(i+1+"번째 선수 이름 >> ");
			p[i]=new Player(scanner.next());
		}
		System.out.println();
		
		scanner.nextLine();	//Enter 입력
		while(true) {
				for(int i=0; i<2; i++) {
				System.out.printf("[%s]: <Enter>", p[i].name);
				scanner.nextLine();
				p[i].setAndShowNum();
				p[i].showResult();
				if(p[i].isWinner==true) return;
			}
		}
	}

	public static void main(String[] args) {
		new GamblingEx().run();
	}
}

11. StringBuffer 클래스를 활용하여 문자열 수정하기 [난이도 6]

 

>> 실행

- 첫 줄에 원본 문자열을 입력

- 명령으로 원래 문자!변경할 문자 입력

 

String 클래스로 풀이

import java.util.*;

public class EditStringEx {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print(">> ");
        String string = scanner.nextLine();
        
        while(true){
            System.out.print("명령: ");
            String input = scanner.next();
            
            if(input.equals("그만")){
                System.out.println("종료합니다.");
                return;
            }
            else{
                StringTokenizer st=new StringTokenizer(input, "!'");
    
                if (st.countTokens()<2){
                    System.out.println("잘못된 명령입니다!");
                    continue;
                }
                else{
                    String org = st.nextToken();
                    String change = st.nextToken();
                    
                    if(string.contains(org)){
                        string = string.replace(org, change);
                        System.out.println(string);
                    }
                    else{
                        System.out.println("찾을 수 없습니다!");
                        continue;
                    }
                }
            }
        }
    }
}

문제를 제대로 안 읽어서 String으로 풀었네요 ㅋ

 

StringBuffer 클래스로 풀이

import java.util.*;

public class EditStringEx {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print(">> ");
        StringBuffer stringBuffer = new StringBuffer(scanner.nextLine());
        
        while(true) {
            System.out.print("명령: ");
            String input = scanner.next();
            
            if(input.equals("그만")) {
                System.out.println("종료합니다.");
                return;
            } 
            else {
                StringTokenizer st = new StringTokenizer(input, "!'");
    
                if (st.countTokens()<2) {
                    System.out.println("잘못된 명령입니다!");
                    continue;
                } 
                else {
                    String org=st.nextToken();
                    String change=st.nextToken();
                    
                    int start=stringBuffer.indexOf(org);
                    if (start =-1) {
                        int end = start + org.length();
                        stringBuffer.replace(start, end, change);
                        System.out.println(stringBuffer.toString());
                   }
                   else {
                        System.out.println("찾을 수 없습니다!");
                        continue;
                   }
                }
            }
        }
    }
}

12. 문제 10의 겜블링 게임을 n명이 플레이하도록 수정하기 [난이도 8]

- 게임에 참여하는 선수의 수를 입력받고

- 각 선수의 이름을 입력받도록 수정

 

>> 실행

 

Player 클래스

- 10번이랑 똑같다

public class Player {
	String name;
	int n1, n2, n3;
	boolean isWinner=false;
	
	public Player(String name) {
		this.name=name;
	}
	
	public void setAndShowNum() {
		n1=(int)(Math.random()*3+1);
		n2=(int)(Math.random()*3+1);
		n3=(int)(Math.random()*3+1);
		
		System.out.print( "      "+n1+"      "+n2+"      "+n3+"      ");
	}
	
	public void showResult() {
		if(n1==n2&&n2==n3) {
			isWinner=true;
			System.out.println(name+"님이 이겼습니다!");
		}
		else
			System.out.println("아쉽군요!");
	}
}

 

GamblingEx 클래스(main)

import java.util.Scanner;

public class GamblingEx {
	public void run() {
		Scanner scanner=new Scanner(System.in);
		
		System.out.print("게임에 참여할 선수 숫자>> ");
		int playerNum=scanner.nextInt();
		
		Player[] p = new Player[playerNum];	//입력받은 만큼
		
		for(int i=0; i<p.length; i++) {
			System.out.print(i+1+"번째 선수 이름 >> ");
			p[i]=new Player(scanner.next());
		}
		System.out.println();
		
		scanner.nextLine();	//Enter 입력
		while(true) {
				for(int i=0; i<p.length; i++) {
				System.out.printf("[%s]: <Enter>", p[i].name);
				scanner.nextLine();
				p[i].setAndShowNum();
				p[i].showResult();
				if(p[i].isWinner==true) return;
			}
		}
	}

	public static void main(String[] args) {
		new GamblingEx().run();
	}
}

그냥 객체 배열 쓰라는 것 같은데 어쩌다 보니 10번 풀 때도 객체 배열로 풀었어서 조금만 수정했습니다