빅데이터 서비스 교육/Java

Java 다마고치 게임 예제

Manly 2022. 5. 6. 11:04
반응형

다마고치 게임 예제

Main Menu

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class Menu {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		DAO dao = new DAO();
		Controller c = new Controller();

		while (true) {
			System.out.print("[1]로그인 [2]회원가입 [3]종료 >> ");
			int input1 = sc.nextInt();

			if (input1 == 1) {
				System.out.println("=====로그인=====");

				System.out.print("아이디 입력 >> ");
				String id = sc.next();

				System.out.print("패스워드 입력 >> ");
				String pw = sc.next();

				int cnt = dao.login(id, pw);
				if (cnt > 0) {
					System.out.println("로그인 성공");
					while (true) {
						System.out.println("[1]다마고치 등록 [2]다마고치 키우기 [3]다마고치 상태 확인 >> ");
						int input2 = sc.nextInt();
						if (input2 == 1) {
							System.out.println("다마고치를 등록 합니다.");
							System.out.println("다마고치 이름 : ");
							String name = sc.next();
							int row = dao.insert(id, name);
							if (row > 0) {
								System.out.println("다마고치 등록 성공");
							} else {
								System.out.println("다마고치 등록 실패");
							}
						} else if (input2 == 2) {
							System.out.println("다마고치 키우기");
							// 1. 하나의 아이디에 다마고치는 여러개
							// 1-1. 아이디별 다마고치를 전부 출력
							System.out.println(id + "님이 가지고 있는 다마고치");

							// 다마고치 한마리 --> DamaDTO
							// 다마고치 여러마리 --> ArrayList<DamaDTO>
							// --> DamaDTO[]

							ArrayList<DamaDTO> list = dao.selectDama(id);
							int i = 0;
							System.out.println("번호\t닉네임\t레벨\t경험치");
							for (DamaDTO dto : list) {
								System.out.print(++i + "\t");
								System.out.print(dto.getNick() + "\t");
								System.out.print(dto.getLev() + "\t");
								System.out.println(dto.getExp() + "\t");
							}
							// 2. 어떤 다마고치 키울건지 입력
							System.out.println("어던 다마고치를 키우시겠습니까?");
							int damaSelect = sc.nextInt();

							// 다마고치 닉네임은 지금 욕구가 하고 싶어요 로 출력
							// 인덱스 번호 -1을 해주는 이유는
							// 사용자에게 보여주는 번호는 1,2,3,4,5 이런 형식이였기 때문이다.
							String w = c.makeRandom();

							System.out.print(list.get(damaSelect - 1).getNick() + "은(는)");
							System.out.println("지금" + w + "이 하고 싶어요.");

							// 4. 다마고치 욕구 충족
							int row = c.grow(w,list.get(damaSelect-1).getNick());
							
							if(row>0) {
								System.out.println("다마고치 수정 성공");
							}else {
								System.out.println("다마고치 수정 실패");
							}
						} else if (input2 == 3) {
							System.out.println("내 다마고치 상태확인");
						} else {
							System.out.println("잘못된 숫자를 입력하셨습니다.");
							break;
						}
					}

				} else {
					System.out.println("로그인 실패");
				}

			} else if (input1 == 2) {
				// 가입할 아이디 입력 받기
				// 가입할 패스워드 입력 받기
				System.out.println("=====회원가입=====");

				System.out.print("아이디 입력 >> ");
				String id = sc.next();

				System.out.print("패스워드 입력 >> ");
				String pw = sc.next();

				// 두개의 정보를 저장해서 관리 할 수 있는 DB로 전달
				int cnt = dao.join(id, pw);
				if (cnt > 0) {
					System.out.println("회원가입 성공");
				} else {
					System.out.println("회원가입 실패");
				}
			} else {
				break;
			}
		}

	}

}

DAO

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DAO {

	// 데이터베이스 기능 사용시
	// 여러개의 메소드에서 사용가능 하도록 전역변수 선언
	private Connection conn = null;
	private PreparedStatement psmt = null;
	private ResultSet rs = null;

	// 메소드 수행시 결과값을 확인할 수 있는 변수!
	private int cnt = 0;

	// 동적 로딩 -> getConn()
	public void getConn() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";
			conn = DriverManager.getConnection(db_url, db_id, db_pw);

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// DB 사용에 따른 객체 종료 메소드 ->close()
	// Connection, PreparedStatement, ResultSet
	public void close() {
		// 역순으로 객체를 닫는다.
		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 회원가입이 가능한 메소드 생성 -> join()
	public int join(String id, String pw) {

		try {
			getConn();
			// 회원가입을 진행 할 수 있는 sql문 작성! - > damamember table 사용
			String sql = "insert into damamember values(?,?)";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, pw);
			cnt = psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}

	public int login(String id, String pw) {
		cnt = 0;
		try {
			// 1. DB 연결
			getConn();
			// 2. 회원이 맞는지 확인하는 sql문 전송
			String sql = "select * from damamember where id = ? and pw = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, pw);
			rs = psmt.executeQuery();
			if (rs.next()) {
				cnt = 1;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 3. 객체 종료
			close();
		}
		return cnt;
	}

	public int insert(String id, String name) {

		// lev, exp --> 0 인 다마고치 생성하기 jdbc코드 짜보기
		try {
			getConn();
			String sql = "insert into dama values(?,?,0,0)";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, name);
			cnt = psmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}

	public ArrayList<DamaDTO> selectDama(String id) {
		ArrayList<DamaDTO> list = new ArrayList<DamaDTO>();
		try {
			getConn();
			String sql = "select * from dama where id =? ";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			rs = psmt.executeQuery();
			while (rs.next()) {
				// rs.next()로 커서를 한칸씩 내리면서 데이터가 있는곳은
				// 각 변수에 값을 받아오고, 그 값들을 arrayList에 넣는다.
				String resultId = rs.getString("id");
				String resultNick = rs.getString("nick");
				int resultLev = rs.getInt("lev");
				int reusltExp = rs.getInt("exp");
				DamaDTO dto = new DamaDTO(resultId, resultNick, resultLev, reusltExp);
				list.add(dto);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;
	}

	public int updateExp(int exp, String nick) {

		try {
			getConn();
			String sql = "update dama set exp = exp+? where nick = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, exp);
			psmt.setString(2, nick);
			cnt = psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}

}

DTO

public class DamaDTO {

	// VO, DTO를 설계할때는 테이블 컬럼을 그대로 가지고와서 필드에 두기
	private String id;
	private String nick;
	private int lev;
	private int exp;
	
	public DamaDTO(String id, String nick, int lev, int exp) {
		this.id = id;
		this.nick = nick;
		this.lev = lev;
		this.exp = exp;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
	public int getLev() {
		return lev;
	}
	public void setLev(int lev) {
		this.lev = lev;
	}
	public int getExp() {
		return exp;
	}
	public void setExp(int exp) {
		this.exp = exp;
	}	
}

Controller

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

public class Controller {

	private Random ran = new Random();
	// 욕구(밥, 수면, 산책, 게임, 코딩) --> 랜덤하게 뽑아오기
	private String[] want = { "밥", "수면", "산책", "게임", "코딩" };
	private Scanner sc = new Scanner(System.in);
	private DAO dao = new DAO();

	public String makeRandom() {
		// 랜덤하게 뽑아올 수 있게 만들기
		return want[ran.nextInt(want.length)];
	}
	
	public int grow(String w, String nick) {
		// String w --> Menu에서 넘겨주게 될 다마고치의 욕구
		int row = 0;
		for (int i = 0; i < want.length; i++) {
			System.out.println(i+1+want[i]+" ");
		}
		//사용자가 선택한 욕구
		String input = sc.next();
		// 다마고치가 원하는 욕구랑 ==  사용자가 선택한 욕구가        일치하는지?
		
		if(input.equals(w)) {
			// exp 30 올려주기
			// 데이터베이스에 있는 값을 수정
			// "update dama set exp= exp + 30 where nick = ?";
			row = dao.updateExp(30,nick);
			
		}else {
			// exp 10 감소시키기
			// "update dama set exp= exp - 10 where nick = ?";
			row = dao.updateExp(-10,nick);
		}
		return row;
	}

}
반응형

'빅데이터 서비스 교육 > Java' 카테고리의 다른 글

Java Interface  (0) 2022.05.06
Java 추상클래스  (0) 2022.05.06
Java JDBC  (0) 2022.05.06
Java 상속  (0) 2022.05.06
Java Arraylist  (0) 2022.05.06