휴먼교육센터 개발자과정 41일차

조하영·2022년 9월 30일
0

40일차 기능에 추가 기능
1. 단어를 랜덤으로 뽑아 제시
2. 모든 단어를 맞춰야 게임 종료
3. 연속으로 3개 틀리면 오답주의 경고메세지
4. 게임의 종류를 3가지로(뜻, 영단어, 랜덤으로 맞추기)

메인 클래스

package test;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("영어단어장 프로그램 시작 ");
        new MainMenu();
        System.out.println("영어단어장 프로그램 종료 ");
    }
}

메인메뉴 클래스

package test;

import java.util.HashMap;
import java.util.Scanner;

public class MainMenu {
    private HashMap<String, WordMean> word = new HashMap<>();
    private HashMap<String, WrongWord> wrongWordList = new HashMap<>();

    Scanner in = new Scanner(System.in);

    MainMenu() {
        for (;;) {
            System.out.println("1. 단어관리");
            System.out.println("2. 단어게임");
            System.out.println("3. 프로그램 종료");
            System.out.println("메뉴를 선택해주세요");

            String selMenu = in.nextLine();
            if (selMenu.equals("1")) {
                new WordManager(word);
            } else if (selMenu.equals("2")) {
                if (word.size() > 0) {
                    new WordGame(word, wrongWordList);
                } else {
                    System.out.println("단어장에 단어를 추가해주세요.");
                }
            } else if (selMenu.equals("3")) {
                break;
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }
}

단어관리 클래스

package test;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class WordManager {
    Scanner in = new Scanner(System.in);
    private HashMap<String, WordMean> word = null;

    WordManager(HashMap<String, WordMean> word) {
        this.word = word;
        for (;;) {
            menu();
            System.out.println("메뉴를 선택해주세요 ");
            String selMenu = in.nextLine();
            if (selMenu.equals("1")) {
                addWord();
            } else if (selMenu.equals("2")) {
                delWord();
            } else if (selMenu.equals("3")) {
                searchWord();
            } else if (selMenu.equals("4")) {
                modWord();
            } else if (selMenu.equals("5")) {
                showWord();
            } else if (selMenu.equals("6")) {
                allDelWord();
            } else if (selMenu.equals("7")) {
                break;
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }

    private void modWord() {
        System.out.println("수정할 영단어를 입력해주세요. ");
        String modWord = in.nextLine();

        if (word.get(modWord) != null) {
            System.out.println("수정할 뜻을 입력해주세요. ");
            String modMean = in.nextLine();
            System.out.println("중요도를 상/중/하로 입력하세요. ");
            String imp = in.nextLine();
            System.out.println("코멘트를 작성하세요. ");
            String comment = in.nextLine();
            if (imp.equals("상") || imp.equals("중") || imp.equals("하")) {
                word.get(modWord).setMean(modMean);
                word.get(modWord).setImp(imp);
                word.get(modWord).setComment(comment);
                word.put(modWord, word.get(modWord));
                System.out.println(modWord + "(이/가) 수정되었습니다. ");
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        } else {
            System.out.println(modWord + " 단어가 없습니다. ");
        }
    }

    private void allDelWord() {
        System.out.println("정말로 삭제하시겠습니까?(Y/N)");
        String yn = in.nextLine();
        yn.toLowerCase();
        if (yn.equals("y")) {
            word.clear();
            System.out.println("모든 단어가 삭제되었습니다.");

        } else {
            System.out.println("이전 메뉴로 돌아갑니다. ");
        }
    }

    private void showWord() {
        System.out.println("등록된 단어의 갯수는 " + word.size() + "개 입니다.");
        for (String i : word.keySet()) {
            System.out.println(
                    i + ": " + word.get(i).getMean() + " (" + word.get(i).getImp() + ")" + word.get(i).getComment());
        }
    }

    private void searchWord() {

        for (;;) {
            System.out.println("1. 영단어로 검색 ");
            System.out.println("2. 뜻으로 검색 ");
            System.out.println("3. 중요도로 검색 ");
            System.out.println("4. 이전메뉴 ");
            System.out.println("메뉴를 선택해주세요 ");
            String selMenu = in.nextLine();
            if (selMenu.equals("1")) {
                searchEnWord();
            } else if (selMenu.equals("2")) {
                serchMeanWord();
            } else if (selMenu.equals("3")) {
                serchImpWord();
            } else if (selMenu.equals("4")) {
                break;
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }

    private void serchImpWord() {
        System.out.println("검색할 영단어의 중요도를 상/중/하로 입력해주세요 ");
        String searchImp = in.nextLine();
        boolean flag = true;
        for (Entry<String, WordMean> entry : word.entrySet()) {
            if (entry.getValue().getImp().equals(searchImp)) {
                System.out.println(entry.getKey() + ": " + entry.getValue().getMean() + " (" + entry.getValue().getImp()
                        + ")" + entry.getValue().getComment());
                flag = false;
            }
        }
        if (flag) {
            System.out.println("중요도 " + searchImp + "(은/는) 없습니다. ");
        }
    }

    private void serchMeanWord() {
        System.out.println("검색할 영단어의 뜻을 입력해주세요 ");
        String searchMean = in.nextLine();
        boolean flag = true;
        for (Entry<String, WordMean> entry : word.entrySet()) {
            if (searchMean.equals(entry.getValue().getMean())) {
                System.out.println(entry.getKey() + ": " + entry.getValue().getMean() + " (" + entry.getValue().getImp()
                        + ")" + entry.getValue().getComment());
                flag = false;
            }
        }
        if (flag) {
            System.out.println(searchMean + "의 뜻을 가진 단어가 없습니다. ");
        }
    }

    private void searchEnWord() {
        System.out.println("검색할 영단어를 입력해주세요 ");
        String searchEn = in.nextLine();
        boolean flag = true;
        for (Entry<String, WordMean> entry : word.entrySet()) {
            if (searchEn.equals(entry.getKey())) {
                System.out.println(entry.getKey() + ": " + entry.getValue().getMean() + " (" + entry.getValue().getImp()
                        + ")" + entry.getValue().getComment());
                flag = false;
            }
        }
        if (flag) {
            System.out.println(searchEn + " 단어가 없습니다. ");
        }
    }

    private void delWord() {
        System.out.println("삭제할 영단어를 입력하세요. ");
        String delWord = in.nextLine();
        if (word.get(delWord) != null) {
            word.remove(delWord);
            System.out.println(delWord + "(이/가) 삭제되었습니다.  ");
        } else {
            System.out.println(delWord + " 단어가 없습니다. ");
        }
    }

    private void addWord() {
        WordMean newWordMean = new WordMean();
        System.out.println("추가할 영단어를 입력하새요 ");
        String newWord = in.nextLine();
        boolean flag = true;
        for (Entry<String, WordMean> entry : word.entrySet()) {
            if (newWord.equals(entry.getKey())) {
                System.out.println(entry.getKey() + "단어가 이미 있습니다.  ");
                flag = false;
            }
        }
        if (flag) {
            System.out.println("영단어의 뜻을 입력하세요. ");
            String wordMean = in.nextLine();
            System.out.println("중요도를 상/중/하로 입력하세요. ");
            String imp = in.nextLine();
            System.out.println("코멘트를 작성하세요. ");
            String comment = in.nextLine();
            if (imp.equals("상") || imp.equals("중") || imp.equals("하")) {
                newWordMean.setMean(wordMean);
                newWordMean.setImp(imp);
                newWordMean.setComment(comment);
                word.put(newWord, newWordMean);
                System.out.println(newWord + "(이/가) 추가되었습니다.");
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }

    private void menu() {
        System.out.println("1. 단어추가 ");
        System.out.println("2. 단어삭제 ");
        System.out.println("3. 단어검색 ");
        System.out.println("4. 단어수정 ");
        System.out.println("5. 전체보기 ");
        System.out.println("6. 전체삭제 ");
        System.out.println("7. 이전메뉴 ");
    }
}

단어 정보 클래스

package test;

public class WordMean {
    private String mean = null;
    private String imp = null;
    private String comment = null;

    public void setComment(String comment) {
        this.comment = comment;
    }

    public void setMean(String mean) {
        this.mean = mean;
    }

    public void setImp(String imp) {
        this.imp = imp;
    }

    public String getComment() {
        return comment;
    }

    public String getMean() {
        return mean;
    }

    public String getImp() {
        return imp;
    }

}

틀린단어 정보 클래스

package test;

public class WrongWord {
    private String wrongMean = null;
    private int wrongCnt = 0;

    public String getWrongMean() {
        return wrongMean;
    }

    public void setWrongMean(String wrongMean) {
        this.wrongMean = wrongMean;
    }

    public int getWrongCnt() {
        return wrongCnt;
    }

    public void setWrongCnt(int wrongCnt) {
        this.wrongCnt = wrongCnt;
    }

    public void plusCnt() {
        wrongCnt++;
    }
}

게임 메뉴클래스

package test;

import java.util.HashMap;
import java.util.Scanner;

public class WordGame {
    Scanner in = new Scanner(System.in);

    WordGame(HashMap<String, WordMean> word, HashMap<String, WrongWord> wrongWordList) {
        for (;;) {
            menu();
            System.out.println("메뉴를 선택해주세요");
            String selMenu = in.nextLine();
            if (selMenu.equals("1")) {
                new MeanGame(word, wrongWordList);
            } else if (selMenu.equals("2")) {
                new EnWordGame(word, wrongWordList);
            } else if (selMenu.equals("3")) {
                new RanGame(word, wrongWordList);
            } else if (selMenu.equals("4")) {
                break;
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }
    }

    private void menu() {
        System.out.println("1. 뜻으로 영단어 맞추기 ");
        System.out.println("2. 영단어로 뜻 맞추기 ");
        System.out.println("3. 랜덤으로 맞추기 ");
        System.out.println("4. 이전메뉴 ");
    }
}

뜻을 제시하는 게임 클래스

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.Map.Entry;

public class MeanGame {
    private HashMap<String, WordMean> word = null;
    private HashMap<String, WrongWord> wrongWordList = null;
    Scanner in = new Scanner(System.in);
    private int point = 0;
    private int cnt = 0;
    private ArrayList<String> randomWord = new ArrayList<>();
    private ArrayList<String> chkWord = new ArrayList<>();

    MeanGame(HashMap<String, WordMean> word, HashMap<String, WrongWord> wrongWordList) {
        this.word = word;
        this.wrongWordList = wrongWordList;
        randomWord.addAll(word.keySet());
        System.out.println("총 문제는 " + word.size() + "개 입니다.");
        System.out.println("모든 문제를 맞추거");
        System.out.println("100을 입력하면 게임이 종료됩니다.");
        System.out.println("엔터를 치면 게임을 시작합니다.");
        in.nextLine();

        startGame();
        endGame();

    }

    private void endGame() {

        System.out.println("최종 점수: " + point + "점");
        for (Entry<String, WrongWord> entry : wrongWordList.entrySet()) {
            System.out.println("틀린단어: " + entry.getKey() + " 오답: " + entry.getValue().getWrongMean() + " 틀린횟수: "
                    + entry.getValue().getWrongCnt());
        }
        System.out.println();
    }

    private void startGame() {
        for (;;) {
            boolean flag = true;
            Random r = new Random();
            int rIdx = r.nextInt(randomWord.size());
            String rWord = randomWord.get(rIdx);

            if (chkWord.size() != 0) {
                for (int i = 0; i < chkWord.size(); i++) {
                    if (rWord.equals(chkWord.get(i))) {
                        flag = false;
                    }
                }
            }

            if (flag) {
                System.out.println("---------------");
                if (wrongWordList.get(rWord) != null && wrongWordList.get(rWord).getWrongCnt() > 2) {
                    System.out.println(wrongWordList.get(rWord).getWrongCnt() + "번 틀린 단어(오답조심)");
                }
                if (cnt > 2) {
                    System.out.println("연속으로 " + cnt + "개 틀렸습니다. 집중해주세요. ");
                }
                System.out.println(word.get(rWord).getMean());

                System.out.println("위 뜻을 가진 영단어는?");
                String correct = in.nextLine();
                if (rWord.equals(correct)) {
                    chkWord.add(rWord);
                    System.out.println("정답입니다.");
                    point += 10;
                    cnt = 0;
                } else {
                    if (wrongWordList.get(rWord) != null) {
                        System.out.println("오답입니다.");
                        wrongWordList.get(rWord).setWrongMean(correct);
                        wrongWordList.get(rWord).plusCnt();

                    } else {
                        WrongWord newWrongWord = new WrongWord();
                        System.out.println("오답입니다.");
                        newWrongWord.setWrongMean(correct);
                        newWrongWord.plusCnt();
                        wrongWordList.put(rWord, newWrongWord);
                    }
                    cnt++;
                }
                if (correct.equals("100") || chkWord.size() == word.size()) {
                    break;
                }
            }
        }

    }
}

영어단어로 제시 게임 클래스

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.Map.Entry;

public class EnWordGame {
    private HashMap<String, WordMean> word = null;
    private HashMap<String, WrongWord> wrongWordList = null;
    Scanner in = new Scanner(System.in);
    private int point = 0;
    private int cnt = 0;
    private ArrayList<String> randomWord = new ArrayList<>();
    private ArrayList<String> chkWord = new ArrayList<>();

    EnWordGame(HashMap<String, WordMean> word, HashMap<String, WrongWord> wrongWordList) {
        this.word = word;
        this.wrongWordList = wrongWordList;
        randomWord.addAll(word.keySet());
        System.out.println("총 문제는 " + word.size() + "개 입니다.");
        System.out.println("모든 문제를 맞추거");
        System.out.println("100을 입력하면 게임이 종료됩니다.");
        System.out.println("엔터를 치면 게임을 시작합니다.");
        in.nextLine();

        startGame();
        endGame();

    }

    private void endGame() {

        System.out.println("최종 점수: " + point + "점");
        for (Entry<String, WrongWord> entry : wrongWordList.entrySet()) {
            System.out.println("틀린단어: " + entry.getKey() + " 오답: " + entry.getValue().getWrongMean() + " 틀린횟수: "
                    + entry.getValue().getWrongCnt());
        }
        System.out.println();
    }

    private void startGame() {
        for (;;) {
            boolean flag = true;
            Random r = new Random();
            int rIdx = r.nextInt(randomWord.size());
            String rWord = randomWord.get(rIdx);

            if (chkWord.size() != 0) {
                for (int i = 0; i < chkWord.size(); i++) {
                    if (rWord.equals(chkWord.get(i))) {
                        flag = false;
                    }
                }
            }

            if (flag) {
                System.out.println("---------------");
                if (wrongWordList.get(rWord) != null && wrongWordList.get(rWord).getWrongCnt() > 2) {
                    System.out.println(wrongWordList.get(rWord).getWrongCnt() + "번 틀린 단어(오답조심)");
                }
                if (cnt > 2) {
                    System.out.println("연속으로 " + cnt + "개 틀렸습니다. 집중해주세요. ");
                }
                System.out.println(rWord);

                System.out.println("위 영단어의 뜻은?");
                String correct = in.nextLine();
                if (word.get(rWord).getMean().equals(correct)) {
                    chkWord.add(rWord);
                    System.out.println("정답입니다.");
                    point += 10;
                    cnt = 0;
                } else {
                    if (wrongWordList.get(rWord) != null) {
                        System.out.println("오답입니다.");
                        wrongWordList.get(rWord).setWrongMean(correct);
                        wrongWordList.get(rWord).plusCnt();

                    } else {
                        WrongWord newWrongWord = new WrongWord();
                        System.out.println("오답입니다.");
                        newWrongWord.setWrongMean(correct);
                        newWrongWord.plusCnt();
                        wrongWordList.put(rWord, newWrongWord);
                    }
                    cnt++;
                }
                if (correct.equals("100") || chkWord.size() == word.size()) {
                    break;
                }
            }
        }
    }
}

랜덤으로 제시하는 게임 클래스

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.Map.Entry;

public class RanGame {
    private HashMap<String, WordMean> word = null;
    private HashMap<String, WrongWord> wrongWordList = null;
    Scanner in = new Scanner(System.in);
    private int point = 0;
    private int cnt = 0;
    private ArrayList<String> randomWord = new ArrayList<>();
    private ArrayList<String> chkWord = new ArrayList<>();

    RanGame(HashMap<String, WordMean> word, HashMap<String, WrongWord> wrongWordList) {
        this.word = word;
        this.wrongWordList = wrongWordList;
        randomWord.addAll(word.keySet());
        System.out.println("총 문제는 " + word.size() + "개 입니다.");
        System.out.println("모든 문제를 맞추거");
        System.out.println("100을 입력하면 게임이 종료됩니다.");
        System.out.println("엔터를 치면 게임을 시작합니다.");
        in.nextLine();

        startGame();
        endGame();

    }

    private void endGame() {

        System.out.println("최종 점수: " + point + "점");
        for (Entry<String, WrongWord> entry : wrongWordList.entrySet()) {
            System.out.println("틀린단어: " + entry.getKey() + " 오답: " + entry.getValue().getWrongMean() + " 틀린횟수: "
                    + entry.getValue().getWrongCnt());
        }
        System.out.println();
    }

    private void startGame() {
        for (;;) {
            boolean flag = true;
            Random r = new Random();
            int choice = r.nextInt(2);
            int rIdx = r.nextInt(randomWord.size());
            String rWord = randomWord.get(rIdx);

            if (chkWord.size() != 0) {
                for (int i = 0; i < chkWord.size(); i++) {
                    if (rWord.equals(chkWord.get(i))) {
                        flag = false;
                    }
                }
            }

            if (flag) {
                if (choice == 1) {
                    System.out.println("---------------");
                    if (wrongWordList.get(rWord) != null && wrongWordList.get(rWord).getWrongCnt() > 2) {
                        System.out.println(wrongWordList.get(rWord).getWrongCnt() + "번 틀린 단어(오답조심)");
                    }
                    if (cnt > 2) {
                        System.out.println("연속으로 " + cnt + "개 틀렸습니다. 집중해주세요. ");
                    }
                    System.out.println(word.get(rWord).getMean());

                    System.out.println("위 뜻을 가진 영단어는?");
                    String correct = in.nextLine();
                    if (rWord.equals(correct)) {
                        chkWord.add(rWord);
                        System.out.println("정답입니다.");
                        point += 10;
                        cnt = 0;
                    } else {
                        if (wrongWordList.get(rWord) != null) {
                            System.out.println("오답입니다.");
                            wrongWordList.get(rWord).setWrongMean(correct);
                            wrongWordList.get(rWord).plusCnt();

                        } else {
                            WrongWord newWrongWord = new WrongWord();
                            System.out.println("오답입니다.");
                            newWrongWord.setWrongMean(correct);
                            newWrongWord.plusCnt();
                            wrongWordList.put(rWord, newWrongWord);
                        }
                        cnt++;
                    }
                    if (correct.equals("100") || chkWord.size() == word.size()) {
                        break;
                    }

                } else {
                    System.out.println("---------------");
                    if (wrongWordList.get(rWord) != null && wrongWordList.get(rWord).getWrongCnt() > 2) {
                        System.out.println(wrongWordList.get(rWord).getWrongCnt() + "번 틀린 단어(오답조심)");
                    }
                    if (cnt > 2) {
                        System.out.println("연속으로 " + cnt + "개 틀렸습니다. 집중해주세요. ");
                    }
                    System.out.println(rWord);

                    System.out.println("위 영단어의 뜻은?");
                    String correct = in.nextLine();
                    if (word.get(rWord).getMean().equals(correct)) {
                        chkWord.add(rWord);
                        System.out.println("정답입니다.");
                        point += 10;
                        cnt = 0;
                    } else {
                        if (wrongWordList.get(rWord) != null) {
                            System.out.println("오답입니다.");
                            wrongWordList.get(rWord).setWrongMean(correct);
                            wrongWordList.get(rWord).plusCnt();

                        } else {
                            WrongWord newWrongWord = new WrongWord();
                            System.out.println("오답입니다.");
                            newWrongWord.setWrongMean(correct);
                            newWrongWord.plusCnt();
                            wrongWordList.put(rWord, newWrongWord);
                        }
                        cnt++;
                    }
                    if (correct.equals("100") || chkWord.size() == word.size()) {
                        break;
                    }
                }
            }
        }
    }
}
profile
공부하는 개발자

0개의 댓글