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로 저장