국비수업 자바 진도가 끝나고 선생님께서 개인 미니 프로젝트 과제를 내주셨다.
무엇을 만들어 볼까 고민을 하던 중,
개발자가 되기 위해 나에게 부족한 역량인 영타를 보완하기 위한 프로젝트를 해보는 것이 좋을 것 같다고 생각했다.
지금까지 배웠던 자바 기술들을 복습하는 겸,
내가 만든 타자게임으로 타자 연습을 하면 더욱 재미있게 할 수 있을 것 같아 기획 해보았다.
클래스는 총 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점이 되면 게임에서 패배한다.
-> 자바 과정이 끝나 갈 때 쯤 기획부터 설계, 코딩까지 처음으로 진행해보면서 쉽진 않았던 것 같다.
특히 무엇이던 어떻게 설계를 해야하는지에 대한 고민이
정말 어렵고 시간이 오래 걸리는걸 다시 한 번 느꼈던 계기가 되었던 것 같다.
그래도 이번 프로젝트를 진행하면서 나의 실력이 어느정도 인지 확인 할 수 있었고,
부족한 점과 앞으로의 동기부여를 더욱 얻은 것 같다.
나중에 이 프로젝트를 보면 정말 아무것도 아닐지 모르겠지만,
나의 목표인 '같이 일하고 싶은 개발자' 를 향한 믿거름이 되리라 믿어 의심치 않는다.
지금까지 잘 달려온 만큼, 초심 잃지 말고 죽을 떄 까지 달려 볼거다. :)
-> 원래 코드는 영문 소문자만 랜덤하게 출력하는 코드였는데,
대/소문자를 랜덤하게 출력하고 싶어서 고민 끝에 코드 수정을 완성하여서 벨로그 추가 작성 해보았다.
// 문제 단어를 생성하는 메소드-------------------------------------------------------------
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);
}