자바 미니 프로젝트

자바 미니 프로젝트

joungdev 2024. 7. 23. 17:36

Enter키를 누르면 점수가 오르는 게임

입출력 기능과 컬렉션을 활용하여 자바로 단순하고 재밌는 게임을 만들어 보고자 만들었다.

 

클래스 다이어그램

클래스 다이어그램


Run 클래스

package com.kh.mini.game.run;

import com.kh.mini.game.view.GameView;

public class Run {

    public static void main(String[] args) {
        GameView gameView = new GameView();
        gameView.start();
    }
}

 

 

•  메인 메소드가 포함된 클래스, 프로그램을 실행


User 클래스

package com.kh.mini.game.model.vo;

public class User {
    private String id;
    private int score;

	// User 생성자로 id와 score를 초기화 한다. 객체를 만들 때 아이디와 점수를 설정
    public User(String id, int score) {
        this.id = id;
        this.score = score;
    }
	
    // getter/setter 메서드로 id와 score의 값을 반환하고 id와 score의 값을 설정
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}

 

• 사용자의 정보(Id, score)를 저장하고 반환하는 데이터 모델

• 사용자의 아이디와 점수를 필드로 가지며, 이를 관리하기 위한 메서드를 제공.

• 이 클래스는 'id'와 'score'를 설정하고 조회하는 기능을 제공하여, 사용자의 정보를 관리할 수 있도록 돕는다.


GameView 클래스

package com.kh.mini.game.view;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import com.kh.mini.game.game.controller.UserController;
import com.kh.mini.game.model.vo.User;

public class GameView {
	private UserController userController;
	private User currentUser;

	public GameView() {
		userController = new UserController();
		currentUser = null; // 현재 로그인된 사용자가 없을 때 null로 세팅
	}

 


 사용자와 상호작용하는 게임의 기본 사용자 인터페이스를 제공하고 게임의 실행 흐름을 관리하고 사용자의 입력을 처리하며, UserController 클래스를 통해 사용자의 데이터를 조작한다.

 

// GameView 클래스의 필드부


start() 메소드 

	public void start() {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		boolean running = true;

		// BufferedReader를 Scanner 대신 사용 / 성능 향상에 도움이 된다고 함
		while (running) {
			System.out.println("1. 로그인");
			System.out.println("2. 회원가입");
			System.out.println("3. 순위 확인");
			System.out.println("4. 종료");
			System.out.print("메뉴를 선택하세요 : ");

			try {
				int menu = Integer.parseInt(reader.readLine());
				switch (menu) {
				case 1:
					login(reader);
					break;
				case 2:
					register(reader);
					break;
				case 3:
					showLeaderboard();
					break;
				case 4:
					if (currentUser != null) {
						userController.saveScore(); // 게임 종료 시 점수를 저장
					}
					System.out.println("프로그램을 종료합니다.");
					running = false;
					break;
				default:
					System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
				}
			} catch (NumberFormatException | IOException e) {
				System.out.println("입력 오류: " + e.getMessage());
			}
		}
	}

 

• 게임 시작 전 메뉴 선택을 하는 인터페이스를 제공하는 메소드.

• 사용자의 선택에 따라 다음 메소드로 넘어갈 수 있게 기능을 제공.


login() 메소드

	private void login(BufferedReader reader) throws IOException {
		System.out.print("아이디 입력 : ");
		String id = reader.readLine();
		currentUser = userController.getUser(id);

		if (currentUser != null) {
			System.out.println("로그인 성공! 당신의 점수는 : " + currentUser.getScore());
			userController.setCurrentUser(currentUser); // 로그인 상태를 현재 입력된 사용자로 바꿈
			gameLoop(reader);
		} else {
			System.out.println("아이디가 존재하지 않습니다.");
		}
	}

 

• start 메소드에서 1입력시 실행되는 메서드.

• 로그인 인터페이스를 제공.

• 아이디를 입력받고 해당 계정이 존재하는 지 여부로 흐름 제어.


register() 메소드

		private void register(BufferedReader reader) throws IOException {
		System.out.print("원하시는 아이디를 입력해주세요 : ");
		String id = reader.readLine();

		if (userController.register(id)) {
			currentUser = userController.getUser(id);
			System.out.println("회원가입에 성공했습니다. 로그인 해주세요");
		} else {
			System.out.println("중복된 아이디 입니다. 다시 입력해주세요");
		}
	}

 

• 회원가입을 지원하는 메서드

• 회원가입 인터페이스를 제공.

• 아이디를 입력하고 중복여부를 체크한뒤 회원가입에 성공하게 됨


gameLoop() 메소드

	private void gameLoop(BufferedReader reader) throws IOException {
		boolean inGame = true;
		while (inGame) {
			System.out.println("당신의 점수는 : " + currentUser.getScore());
			System.out.print("엔터를 누르면 점수가 오릅니다. 종료를 원하시면 'exit'을 입력해주세요\n");

			String input = reader.readLine();
			if ("exit".equalsIgnoreCase(input)) {
				inGame = false;
			} else if("".equals(input)) {
				userController.incrementScore(); // 점수 증가
				// 점수 업데이트 후 현재 사용자 정보 갱신
				currentUser = userController.getUser(currentUser.getId());
			} else System.out.println("다시 입력하세요");
		}
		userController.saveScore(); // 점수 저장
		userController.logout(); // 로그아웃 시점에서 리더보드 업데이트
	}

 

• 게임 실행시 점수가 오르는 화면을 제공하는 메서드

• exit을 입력하면 게임 종료.

• Enter 키를 누르면 점수가 증가하고 업데이트 후 현자 사용자의 정보 갱신


showLeaderboard() 메소드

	private void showLeaderboard() {
		List<User> leaderboard = userController.getLeaderboard();
		System.out.println("순위 목록:");
		for (int i = 0; i < leaderboard.size(); i++) {
			User user = leaderboard.get(i);
			System.out.println((i + 1) + "등: " + user.getId() + " - 점수: " + user.getScore());
		}
	}
}

 

• 사용자들의 순위 목록을 보여주는 메서드

• 리스트에 저장된 사용자들의 정보와 순위 정보를 출력


UserController 클래스

package com.kh.mini.game.game.controller;

import java.util.List;

import com.kh.mini.game.dao.UserDAO;
import com.kh.mini.game.model.vo.User;

public class UserController {
    private UserDAO userDAO; 
    private User currentUser; // 현재 로그인된 사용자의 정보를 저장

    public UserController() {
        userDAO = new UserDAO();
    }


 사용자의 정보를 관리하고 게임 관련 작업을 처리하는 클래스, 사용자의 점수를 업데이트하고 사용자 정보를 저장하며, 사용자 정보를 로드하는 등의 기능을 담당한다.

 

 // UserController 필드부


register() 메서드

    public boolean register(String id) {
        if (!userDAO.userExists(id)) {
            userDAO.saveUser(new User(id, 0));
            return true;
        }
        return false;
    }

 

• 새로운 사용자를 등록하는 메서드.

• 기존에 아이디가 존재 하지 않으면 User 객체에 입력 받은 아이디와 0점 점수로 초기화.



getUser() 메서드

    public User getUser(String id) {
        return userDAO.getUser(id);
    }


• 주어진 id로 사용자 정보를 가져오는 메서드

• 해당 id에 해당하는 사용자 정보를 반환



incrementScore() 메서드

    public void incrementScore() {
        if (currentUser != null) {
            User user = userDAO.getUser(currentUser.getId());
            if (user != null) {
                user.setScore(user.getScore() + 1);
                userDAO.saveUser(user);
                currentUser = user;
            }
        }
    }

 

• 현재 로그인된 사용자의 점수를 증가하는 메서드

• currentUser가 null이 아닌 경우 (즉, 사용자가 로그인한 경우) 현재 사용자의 최신 정보를 가져옴

• 가져온 사용자의 점수를 증가시키고 기존 사용자의 정보를 업데이트

• currentUser도 최신 정보로 업데이트


saveScore() 메서드

   public void saveScore() {
        if (currentUser != null) {
            userDAO.saveUser(currentUser);
        }
    }

 

• 현재 상태를 저장하는 메서드


logout() 메서드

    public void logout() {
        // 로그아웃 시 사용자 정보 저장 처리
        saveScore();
    }

 

• 로그아웃 시 사용자 정보 저장 처리 유도


getLeaderboard() 메서드

    public List<User> getLeaderboard() {
        return userDAO.getLeaderboard();
    }

 

• 순위 정보 전달하는 메서드


setCurrentUser() 메서드

    public void setCurrentUser(User user) {
        this.currentUser = user;
    }
}

 

• 현재 사용자를 세팅하는 메서드


UserDAO 클래스

package com.kh.mini.game.dao;

import com.kh.mini.game.model.vo.User;

import java.io.*;
import java.util.*;

public class UserDAO {
    private static final String FILE_PATH = "users.txt"; // 사용자 데이터 파일 경로

    public UserDAO() {
        // 파일이 존재하지 않는 경우 생성
        File file = new File(FILE_PATH);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                System.out.println("파일 생성 오류: " + e.getMessage());
            }
        }
    }

 

 사용자의 정보를 파일에 저장하고 불러오는 기능을 제공하고 사용자가 존재하는지 확인하고 사용자 정보를 업데이트하거나 가져오는 등의 작업을 수행

 

// UserDAO 클래스의 필드부


userExitsts() 메소드

    public boolean userExists(String id) {
        List<User> users = loadUsers();
        for (User user : users) {
            if (user.getId().equals(id)) {
                return true;
            }
        }
        return false;
    }

 

• 내가 적은 아이디와 기존 아이디를 비교해서 같으면 true를 반환 다르면 false를 반환하여 기존에 있는 아이디인지 확인하는 메소드


saveUser() 메소드

    public void saveUser(User user) {
        List<User> users = loadUsers();
        boolean updated = false;

        // 사용자 리스트에서 기존 사용자 정보를 업데이트
        for (int i = 0; i < users.size(); i++) {
            if (users.get(i).getId().equals(user.getId())) {
                users.set(i, user);
                updated = true;
                break;
            }
        }

        // 사용자가 새로 추가된 경우
        if (!updated) {
            users.add(user);
        }

        writeUsers(users);
    }

 

• 기존 사용자의 입력받은 아이디와 load한 사용자의 아이디가 같은지 비교해서 같으면 업데이트를 진행하고 다르면 사용자 목록에 추가하여 아이디를 저장하는 메소드

• 사용자가 새로 추가된 경우 리스트에 추가하여 모든 사용자를 하나의 파일에 저장


getUser() 메서드

    public User getUser(String id) {
        List<User> users = loadUsers();
        for (User user : users) {
            if (user.getId().equals(id)) {
                return user;
            }
        }
        return null;
    }

 

• 모든 사용자를 파일에서 불러와 리스트에 저장

• 리스트의 모든 사용자에 대해 사용자의 아이디가 주어진 아이디와 일치하면 해당 사용자 정보를 반환

• 그 와중에 매개변수로 들어온 id와 동일한 아이디기 있으면 user 반환

• 동일한 아이디가 없다면 null 반환


getLeaderboard() 메서드

    public List<User> getLeaderboard() {
        List<User> users = loadUsers();
        users.sort((u1, u2) -> Integer.compare(u2.getScore(), u1.getScore()));
        return users;
    }

 

• 모든 사용자를 파일에서 불러와 리스트에 저장

• 점수를 내림차순으로 정렬

• 정렬된 리스트를 반환


loadUser() 메서드

    private List<User> loadUsers() {
        List<User> users = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                if (parts.length == 2) {
                    String id = parts[0].trim();
                    int score = Integer.parseInt(parts[1].trim());
                    users.add(new User(id, score));
                }
            }
        } catch (IOException e) {
            System.out.println("파일 읽기 오류: " + e.getMessage());
        }
        return users;
    }

 

• 파일에서 사용자 정보를 읽어 User 객체의 리스트를 생성하고 반환하는 기능을 함

• ','를 기준으로 id와 score를 나누어 객체 리스트로 반환


writeUsers() 메소드

	 private void writeUsers(List<User> users) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {
            for (User user : users) {
                writer.write(user.getId() + "," + user.getScore());
                writer.newLine(); // 줄바꿈
            }
        } catch (IOException e) {
            System.out.println("파일 쓰기 오류: " + e.getMessage());
        }
    }
}

 

• 파일에 유저 정보를 저장하는 메소드

• id와 score를 id,score로 저장

반응형