Java [ Toy Project ] - 영타 정확도 게임

NasK!m_311·2022년 9월 6일
0

Toy Project

목록 보기
1/1
post-thumbnail

💡 기획의도

국비수업 자바 진도가 끝나고 선생님께서 개인 미니 프로젝트 과제를 내주셨다.

무엇을 만들어 볼까 고민을 하던 중,
개발자가 되기 위해 나에게 부족한 역량인 영타를 보완하기 위한 프로젝트를 해보는 것이 좋을 것 같다고 생각했다.

지금까지 배웠던 자바 기술들을 복습하는 겸, 
내가 만든 타자게임으로 타자 연습을 하면 더욱 재미있게 할 수 있을 것 같아 기획 해보았다.

💡 소스코드

클래스는 총 3가지로 나누어 작성 해보았다.(MVC패턴 이용)

  • Word Class (변수 선언)
  • Function Cass (메소드 선언)
  • Main Class (메인 메소드)
package com.nasKim.typingGame;

public class Word {

	private int cnt = 0; 			// 난이도 입력시 몇글자의 입력 값을 담을 변수 선언.
	private int score = 0;			// 플레이어의 점수를 담을 변수 선언.
	private String word = "";		// 문제 영단어를 담을 변수 선언.
	private String answer = "";		// 플레이어의 정답 입력 값을 담을 변수 선언.
	
	public Word() {}
	
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	public String getWord() {
		return word;
	}
	public void setWord(String word) {
		this.word = word;
	}
	public String getAnswer() {
		return answer;
	}
	public void setAnswer(String answer) {
		this.answer = answer;
	}
 
	
}
package com.nasKim.typingGame;

import java.util.Random;
import java.util.Scanner;

public class Function {

// 문제 단어를 생성하는 메소드-------------------------------------------------------------

	public void create_word(Word w) {

		Random r = new Random();

		String res = "";
		for (int i = 0; i < w.getCnt(); i++) {
			res += (char) (r.nextInt(97, 122));
		}
		w.setWord(res);
	}

// 난이도 입력 화면을 출력하는 메소드--------------------------------------------------------

	public void select_difficulty(Word w) throws InterruptedException {

		Scanner sc = new Scanner(System.in);

		Thread.sleep(1500);
		System.out.println();
		System.out.println("----------난이도 선택----------");
		System.out.println();
		System.out.print("몇 글자?? >> ");
		w.setCnt(sc.nextInt());
		sc.nextLine(); // 버퍼상에 남아있는 \n 값을 처리하기 위해 사용.

	}

// 문제 출제화면을 출력하는 메소드-----------------------------------------------------------

	public void print_screen(Word w) {

		System.out.print("< " + w.getWord() + " >");
		System.out.print("     입력 >>     ");

	}

// 게임 로딩 대기화면을 출력하는 메소드-------------------------------------------------------

	public void wait_screen() throws InterruptedException {

		System.out.println(3 + "...");
		Thread.sleep(1000);
		System.out.println(2 + "..");
		Thread.sleep(1000);
		System.out.println(1 + ".");
		Thread.sleep(1000);
		System.out.println();
	}

// 정답 화면을 출력하는 메소드--------------------------------------------------------------

	public void correct_screen(Word w) throws InterruptedException {

		Thread.sleep(250);
		System.out.println();
		System.out.println("┌─────────<정답입니다>─────────┐");
		System.out.println("현재 당신의 점수는 : " + w.getScore() + "/100점 입니다.");
		System.out.println();
		Thread.sleep(500);
	}

// 오답 화면을 출력하는 메소드--------------------------------------------------------------

	public void incorrect_screen(Word w) throws InterruptedException {

		Thread.sleep(250);
		System.out.println();
		System.out.println("┌─────────<오답입니다>─────────┐");
		System.out.println("현재 당신의 점수는 : " + w.getScore() + "/100점 입니다.");
		System.out.println();
		Thread.sleep(500);
	}

// 게임 시작 화면을 출력하는 메소드----------------------------------------------------------	

	public void start_screen() {

		System.out.println("┌────────────────────────────┐");
		System.out.println("│                            │");
		System.out.println("│   💡💡영문 타자 정확도 게임💡💡   │");
		System.out.println("│                            │");
		System.out.println("└────────────────────────────┘");
	}

// 게임 실패 화면을 출력하는 메소드----------------------------------------------------------	

	public void fail_screen() {

		System.out.println("┌────────────────────────────┐");
		System.out.println("│       U can do it!!!       │");
		System.out.println("│            Now             │");
		System.out.println("│         Try again^^        │");
		System.out.println("└────────────────────────────┘");
	}

// 게임 성공 화면을 출력하는 메소드----------------------------------------------------------	

	public void success_screen() {

		System.out.println("┌────────────────────────────┐");
		System.out.println("│   ♥♥♥Congratulations♥♥♥    │");
		System.out.println("│            Now             │");
		System.out.println("│      Will be American^^    │");
		System.out.println("└────────────────────────────┘");
	}

// 에러메세지 화면을 출력하는 메소드----------------------------------------------------------	

	public void errMsg() {

		System.out.println("글자 수는 0보다 큰 수를 입력 plz...");
		System.out.println("게임 하고 싶으면 1코인 넣어주세요.");
	}

}
package com.nasKim.typingGame;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws InterruptedException {

		Scanner sc = new Scanner(System.in); 		// 입력 객체 생성.
		Word w = new Word(); 						// 변수 객체 생성.
		Function f = new Function(); 				// 기능 객체 생성.

		f.start_screen(); 							// 시작화면 출력 메소드.
		f.select_difficulty(w); 					// 난이도 입력 화면 출력 메소드.
		f.wait_screen(); 							// 게임 로딩 대기화면 출력 메소드.

//--------------------------<게임 중 화면>-----------------------------------------------------------------------			

		if (w.getCnt() <= 0) { 						// 입력된 글자수가 0이하 일 떄 조건.<1-1조건>
			f.errMsg();								// 에러메세지 메소드.
			
		} else {									// 입력된 글자수가 0초과 일 떄 조건.<1-2조건>
			
			while (true) { 								// 이 게임이 몇번 반복되야 100점이 채워지는지 횟수를 모르니 while문 사용.
				
				if (w.getScore() > -50 && w.getScore() < 100) { // 점수가 -50점과 100점에 도달하기 전까지 반복하기 위한 조건.<2-1조건>
					
					f.create_word(w);								// 문제로 출제될 단어 생성 메소드.
					f.print_screen(w);								// 문제 출제화면 출력 메소드.
					w.setAnswer(sc.nextLine());						// 스캐너로 입력받은 값을 answer변수에 할당하는 메소드.
					
					if (w.getWord().equals(w.getAnswer())) {		// 문제와 입력한 정답이 일치하는 조건.<3-1조건>
						w.setScore(w.getScore() + 10);					// score변수에 10을 추가로 더하는 메소드.
						f.correct_screen(w);							// 정답 화면 출력 메소드.
						
					} else {										// 문제와 입력한 정답이 불일치하는 조건.<3-2조건>
						w.setScore(w.getScore() - 10);					// score변수에 10을 추가로 뺴는 메소드.
						f.incorrect_screen(w);							// 오답 화면 출력 메소드.
					}

				} else if (w.getScore() >= 100) { 				// 점수가 100점에 도달하면 종료하기 위한 조건.<2-2조건>
					f.success_screen();								// 게임 성공 화면 출력 메소드.
					break;											// 성공 즉시 while반복문을 탈출하기 위한 키워드 break사용.

				} else if (w.getScore() <= -50) { 				// 점수가 -50점에 도달하면 종료하기 위한 조건.<2-3조건>
					f.fail_screen();								// 게임 실패 화면 출력 메소드.
					break;											// 실패 즉시 while반복문을 탈출하기 위한 키워드 break사용.
				}

			} // while문 닫는 중괄호

		} // <1-2조건>else문 닫는 중괄호

		sc.close(); 								// Scanner를 닫아준다. (주황줄 보기 싫어서..ㅎㅎ)

	} // main method

} // Main class

💡 게임 설명

1. 게임 시작 후, 플레이어에게 난이도를 입력 받는다. (글자 수 입력)


2. 아무 의미 없는 영단어가 입력받은 자릿수에 맞게 출력된다.


3. 플레이어가 출력된 영단어와 같은 답을 입력하면 +10점을 얻고,
	틀리게 입력하면 -10점을 얻는다.


4. 플레이어의 누적점수가 100점이되면 게임에서 승리하고,
	누적점수가 -50점이 되면 게임에서 패배한다.

💡 프로젝트 시연 화면


💡 알고리즘 순서도


💡 프로젝트 느낀점

-> 자바 과정이 끝나 갈 때 쯤 기획부터 설계, 코딩까지 처음으로 진행해보면서 쉽진 않았던 것 같다.
	특히 무엇이던 어떻게 설계를 해야하는지에 대한 고민이 
    정말 어렵고 시간이 오래 걸리는걸 다시 한 번 느꼈던 계기가 되었던 것 같다.
    
그래도 이번 프로젝트를 진행하면서 나의 실력이 어느정도 인지 확인 할 수 있었고, 
	부족한 점과 앞으로의 동기부여를 더욱 얻은 것 같다.    
    
나중에 이 프로젝트를 보면 정말 아무것도 아닐지 모르겠지만, 
	나의 목표인 '같이 일하고 싶은 개발자' 를 향한 믿거름이 되리라 믿어 의심치 않는다.  
    
지금까지 잘 달려온 만큼, 초심 잃지 말고 죽을 떄 까지 달려 볼거다. :)    

💡 2022-09-09 문제 출력 메소드 수정

-> 원래 코드는 영문 소문자만 랜덤하게 출력하는 코드였는데,
대/소문자를 랜덤하게 출력하고 싶어서 고민 끝에 코드 수정을 완성하여서 벨로그 추가 작성 해보았다.

// 문제 단어를 생성하는 메소드-------------------------------------------------------------

	public void create_word(Word w) {

		Random r = new Random();

		String res = "";
		for (int i = 0; i < w.getCnt(); i++) {
			res += (char) (r.nextInt(97, 122));
		}
		w.setWord(res);
	}

--------------------------------< 수정한 코드는 아래쪽! >---------------------------------

// 문제 단어를 생성하는 메소드-------------------------------------------------------------

	public void create_word(Word w) {

		Random r = new Random();

		String res = "";
		for (int i = 0; i < w.getCnt(); i++) {
			
			boolean flag = r.nextBoolean();	// 랜덤한 대소문자를 출력하기 위해 flag변수 선언.
			
			if(flag) {
				res += (char) (r.nextInt(97, 123));
			}else {
				res += (char) (r.nextInt(65, 91));
			}
		}
		w.setWord(res);
	}
    

<포스트 참조 : Alice_in_Wonderland.log>

profile
메리아빠, 먹다가 죽어도 되는 개발자.(살뺴자....)

0개의 댓글