[THML] 포켓몬 게임 만들기-2 코드편

이전 글에 이어서 이번엔 코드와 관련한 글 입니다.

 

팀플과제 였던지라 제 코드만 소개해드리려 했는데 팀원들에게 허락을 받고 모두 소개해드릴 수 있게되었습니다.

 

코드설명은 로그인->선택->배틀 순으로 차례로 하겠습니다.


1. 로그인 코드

login.html 코드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Project Pokemon Login</title>
	<link rel="stylesheet" href="style/style.css">
	<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
</head>
<body>
<section class="wrapper">
	<div class="login-form">
		<h1>Web Pokemon</h1>
		<form name="login" method="post" action="Userlogin.jsp">
			<div class="input-area">
				<input type="text" name="id" id="id" autocomplete="off" required>
				<label for="id">USER NAME</label>
			</div>
			<div class="input-area">
				<input type="password" name="pw" id="pw" autocomplete="off" required>
				<label for="pw">PASSWORD</label>
			</div>
			<div class="btn-area">
				<button type="submit" id="btn">LOGIN</button>
			</div>
		</form>
		<div class="result"></div>
		<div class="login-register">
			<p>Don't have an account?
			<a href="#" class="register-link">Register</a></p>
		</div>
	</div>

	<div class="register-form">
		<h1>Web Pokemon</h1>
		<form name="register" method="post" action="Userregister.jsp">
			<div class="input-area">
				<input type="text" name="id" id="id" autocomplete="off" required>
				<label for="id">USER NAME</label>
			</div>
			<div class="input-area">
				<input type="password" name="pw" id="pw" autocomplete="off" required>
				<label for="pw">PASS	WORD</label>
			</div>
			<div class="btn-area">
				<button type="submit" id="btn">Register</button>
			</div>
		</form>
		<div class="login-register">
			<p>Already have an account?
			<a href="#" class="login-link">Login</a></p>
		</div>
	</div>
	<script>
      const wrapper = document.querySelector('.wrapper');
      const loginLink = document.querySelector('.login-link');
      const registerLink = document.querySelector('.register-link');

      registerLink.addEventListener('click', () => {
        wrapper.classList.add('active');
      });

      loginLink.addEventListener('click', () => {
        wrapper.classList.remove('active');
      });
    </script>
</section>
</body>
</html>

 

제 팀원중 한명의 로그인 창 코드입니다.

텍스트와 버튼들을 놓고 로그인을 시도할 수 있고, 회원가입과 로그인 이벤트리스너를 확인 할 수 있습니다.

 

 

UserLogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter,com.google.gson.Gson , java.util.*,웹프기말_포켓몬.UserEntity,웹프기말_포켓몬.PocketmonDBCP"%>
<jsp:useBean id="DBCP" class="웹프기말_포켓몬.PocketmonDBCP" scope="page" />
<%
    String id = request.getParameter("id");
    String pw = request.getParameter("pw");
    String message = "";

    boolean isValidUser = DBCP.checkID(id, pw); // 사용자 인증

    // 테이블에서 id 검색 후 pw 비교

    if (isValidUser) {
        System.out.println("로그인 성공");
        response.sendRedirect("PocketMon_Select.html");
        return;
    } else {
        // 로그인 실패 시 메시지 설정 후 로그인 페이지로 리디렉션
        System.out.println("로그인 실패");
        session.setAttribute("message", "Invalid credentials. Please try again.");
        response.sendRedirect("loginpage.html"); // 로그인 페이지로 리디렉션
        return; // 리디렉션 후 코드 실행 중단
    }
%>

 

로그인을 확인하는 jsp코드입니다. 입력받은 아이디와 비밀번호로 로그인 성공시 선택창으로 넘어가고 실패시 다시 로그인 페이지로 리디렉션 시키는 방식입니다.

 

 

Register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter,com.google.gson.Gson , java.util.*,웹프기말_포켓몬.UserEntity,웹프기말_포켓몬.PocketmonDBCP"%>
<jsp:useBean id="DBCP" class="웹프기말_포켓몬.PocketmonDBCP" scope="page" />
<%
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	
	boolean overlapId = DBCP.checkID(id,pw);
	// id가 중복이면 true, 등록실패
	
	if (overlapId){ //중복된 아이디가 있으니까 실패
		System.out.println("등록 실패");
		response.sendRedirect("loginpage.html");
	} else{
		// id, pw 데이터베이스에 등록
		System.out.println("등록 성공");
		DBCP.insertUser(id,pw);
		response.sendRedirect("loginpage.html");
	}
%>

 

회원가입을 하는 jsp 코드 입니다. 입력받은 아이디가 이미 DB에 있으면 등록실패시키고 없으면 해당 아이디와 비밀번호가 DB에 저장되며 다시 로그인을 시도하면 로그인이 되겠죠? 이렇게 구현해주었네요.

 


2. 포켓몬선택 코드

제가 구현한 선택창 코드입니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포켓몬 선택창</title>
<!--CSS파일불러오기-->
<link rel="stylesheet" type="text/css" href="SelectSytle.css">

</head>
<body>
  <nav class="sidebar">
    <!-- 여기에 설명 텍스트나 다른 내용을 넣을 수 있습니다. -->
    <p>포켓몬을 3마리를 선택합니다.<br><br> 마우스를 포켓몬 위에 올리면 해당 포켓몬의 체력,공격력,방어력,속성을 확인할 수 있습니다.<br>
		<br>모두 선택을 완료할 시에는 선택완료 버튼을 통해 배틀을 할 수 있습니다.</p>
  </nav>
<header>
	<table class="table-style">
		<td class="table-header"> 선택한 포켓몬</td>
		<td> <button class="Battle_sel_btn" style="width:100px; height:100px" id="myPocket1"> </button> </td>
		<td> <button class="Battle_sel_btn" style="width:100px; height:100px" id="myPocket2"> </button> </td>
		<td> <button class="Battle_sel_btn" style="width:100px; height:100px" id="myPocket3"> </button> </td>
		<td><button class="send_btn" style="width:100px; height:100px" onclick="PostHTML();"> 선택완료 </button></td>
	</table>
</header>
<hr>
<section>
<table>
	<tr>
		<td><button class="PM_Sel_Btn" value="이상해씨"id="1"style="background-image: url('PocketMonImg/이상해씨.png')";>
			<span class="tooltip">이상해씨<br>속성: 풀 <br>체력:40 <br>공격력:49 <br> 방어력:49 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="파이리" id="2" style="background-image: url('PocketMonImg/파이리.png')";>
			<span class="tooltip">파이리<br>속성: 불꽃 <br>체력:39 <br>공격력:52 <br> 방어력:43 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="꼬부기"id="3"style="background-image: url('PocketMonImg/꼬부기.png')";>
			<span class="tooltip">꼬부기<br>속성: 물 <br>체력:44 <br>공격력:48 <br> 방어력:65 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="피카츄"id="4"style="background-image: url('PocketMonImg/피카츄.png')";>
			<span class="tooltip">피카츄<br>속성: 전기 <br>체력:35 <br>공격력:35 <br> 방어력:30 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="디그다"id="5"style="background-image: url('PocketMonImg/디그다.png')";>
			<span class="tooltip">디그다<br>속성: 땅 <br>체력:35 <br>공격력:55 <br> 방어력:30 <br> </span></button></td>
	</tr>
	<tr>
		<td><button class="PM_Sel_Btn" value="나옹"id="6"style="background-image: url('PocketMonImg/나옹.png')";>
			<span class="tooltip">나옹<br>속성: 노말 <br>체력:40 <br>공격력:45 <br> 방어력:35 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="가디"id="7"style="background-image: url('PocketMonImg/가디.png')";>
			<span class="tooltip">가디<br>속성: 불꽃 <br>체력:60 <br>공격력:75 <br> 방어력:45 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="발챙이"id="8"style="background-image: url('PocketMonImg/발챙이.png')";>
			<span class="tooltip">발챙이<br>속성: 물 <br>체력:40 <br>공격력:50 <br> 방어력:40 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="모다피"id="9"style="background-image: url('PocketMonImg/모다피.png')";>
			<span class="tooltip">모다피<br>속성: 풀 <br>체력:50 <br>공격력:75 <br> 방어력:35 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="꼬마돌"id="10"style="background-image: url('PocketMonImg/꼬마돌.png')";>
			<span class="tooltip">꼬마돌<br>속성: 땅 <br>체력:40 <br>공격력:80 <br> 방어력:100 <br> </span></button></td>	
	</tr>
	<tr>
		<td><button class="PM_Sel_Btn" value="코일"id="11"style="background-image: url('PocketMonImg/코일.png')";>
			<span class="tooltip">코일<br>속성: 전기 <br>체력:25 <br>공격력:35 <br> 방어력:70 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="찌리리공"id="12"style="background-image: url('PocketMonImg/찌리리공.png')";>
			<span class="tooltip">찌리리공<br>속성: 전기 <br>체력:40 <br>공격력:30 <br> 방어력:50 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="럭키"id="13"style="background-image: url('PocketMonImg/럭키.png')";>
			<span class="tooltip">럭키<br>속성: 노말 <br>체력:250 <br>공격력:5 <br> 방어력:5 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="별가사리"id="14"style="background-image: url('PocketMonImg/별가사리.png')";>
			<span class="tooltip">별가사리<br>속성: 물 <br>체력:30 <br>공격력:45 <br> 방어력:55 <br> </span></button></td>
		<td><button class="PM_Sel_Btn" value="뚜벅쵸"id="15"style="background-image: url('PocketMonImg/뚜벅쵸.png')";>
			<span class="tooltip">뚜벅쵸<br>속성: 풀 <br>체력:45 <br>공격력:50 <br> 방어력:55 <br> </span></button></td>
	</tr>	
</table>
</section>
<script>
var selectedPokemons = []; //선택된 포켓몬이 저장될 배열

function addPokemon(pokemonValue) {
  if (selectedPokemons.length < 3) {
    selectedPokemons.push(pokemonValue);
  }
}
//aJax로 보내는 방식	
function PostHTML(){
	if (selectedPokemons.length != 3) { //3마리가 아닐경우 리턴
		alert("3마리가 아닙니다.");
		return;
	}
	// 선택된 포켓몬들의 데이터를 params 변수에 저장
    var params = selectedPokemons.map(function(value, index) {
        return 'pokemon' + (index + 1) + '=' + encodeURIComponent(value);
    }).join('&');

    var xmlhttp = new XMLHttpRequest(); // XMLHttpRequest 객체 생성

    // POST 방식으로 Pocketmon_Select.jsp에 요청을 보낸다.
    xmlhttp.open('POST', 'Pocketmon_Select.jsp', true);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    
    xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    window.location.href = 'battle.jsp';
                }
            };
     xmlhttp.send(params);
}

// 포켓몬 선택 버튼 클릭 이벤트 리스너 설정
function SelectionButtons() {
  var buttons = document.querySelectorAll('.PM_Sel_Btn');
  buttons.forEach(function(button) {
    button.addEventListener('click', function() {
		 var pokemonValue = this.value; // 버튼의 value 속성을 읽어옴
      // 이미 선택되어 있는 경우, 선택 취소
      if (selectedPokemons.includes(pokemonValue)) {
        selectedPokemons.splice(selectedPokemons.indexOf(pokemonValue), 1);
        button.style.border = '';
        updateHeaderButtons();
     } else if (selectedPokemons.length < 3) {
        // 새로 선택
        addPokemon(pokemonValue); // addPokemon 함수를 호출하여 포켓몬 추가
        button.style.border = '2px solid red';
        updateHeaderButtons();
      }
    });
     button.addEventListener('mouseenter', function() {
      var tooltip = button.querySelector('.tooltip');
      tooltip.style.display = 'block'; // 툴팁 표시
    });

    // 마우스가 떠날 때 툴팁 숨김
    button.addEventListener('mouseleave', function() {
      var tooltip = button.querySelector('.tooltip');
      tooltip.style.display = 'none'; // 툴팁 숨김
    });
  });
}

// 헤더 버튼 업데이트
function updateHeaderButtons() {
    // 모든 헤더 버튼 초기화
  for (var i = 1; i <= 3; i++) {
    var headerButton = document.getElementById('myPocket' + i);
    headerButton.style.backgroundImage = '';
    headerButton.innerText = ''; // 텍스트 내용도 초기화
    var tooltip = headerButton.querySelector('.tooltip');
    if (tooltip) {
      headerButton.removeChild(tooltip); // 기존 툴팁 요소 제거
    }
  }

  // 선택된 포켓몬에 대한 정보를 헤더 버튼에 설정
  selectedPokemons.forEach(function(pokemonValue, position) {
    var pokemonButton = document.querySelector('.PM_Sel_Btn[value="' + pokemonValue + '"]');
    var headerButton = document.getElementById('myPocket' + (position + 1));
    headerButton.style.backgroundImage = pokemonButton.style.backgroundImage; //이미지도 복사
    headerButton.style.backgroundSize = 'cover'; //이미지를 딱맞게
    headerButton.style.backgroundRepeat = 'no-repeat';
    headerButton.style.backgroundPosition = 'center'; //위치는 중간

    // 툴팁 정보 설정
    var tooltipText = pokemonButton.querySelector('.tooltip').innerHTML;
    var tooltipDiv = document.createElement('div');
    tooltipDiv.classList.add('tooltip');
    tooltipDiv.innerHTML = tooltipText;
    tooltipDiv.style.display = 'none'; // 기본적으로 툴팁 숨김
    headerButton.appendChild(tooltipDiv);

    // 마우스 오버 시 툴팁 표시
    headerButton.onmouseenter = function() {
      tooltipDiv.style.display = 'block';
    };

    // 마우스 아웃 시 툴팁 숨김
    headerButton.onmouseleave = function() {
      tooltipDiv.style.display = 'none';
    };
  });
}


// 헤더 버튼 리셋 함수
function HeaderResetButton(headerButton, selectedButton) {
   for (var i = 1; i <= 3; i++) {
    var headerButton = document.getElementById('myPocket' + i);
    headerButton.addEventListener('click', function() {
      var position = parseInt(this.id.replace('myPocket', '')) - 1;
       if (position < selectedPokemons.length) {
         var pokemonValue = selectedPokemons[position];
        selectedPokemons.splice(position, 1); // 선택 취소
        // 바디의 해당 포켓몬 버튼의 테두리 제거
        var pokemonButton = document.querySelector('.PM_Sel_Btn[value="' + pokemonValue + '"]');
        if (pokemonButton) {
          pokemonButton.style.border = '';
        }
        updateHeaderButtons(); // 헤더 업데이트 호출
      }
    });
  }
}

SelectionButtons();
HeaderResetButton();

</script>
</body>
</html>

 

스타일 코드를 제외해도 기네요.. 원래 CSS코드에 분리해서 구현했었는데 적용되는 시간이 왜인지는 모르게 20~30분 뒤에야 적용되더라구요.. 시간이 촉박해서 html에 다 집어넣게되었습니다.

 

nav에는 설명란을 적어주고,

헤더에는 선택한 포켓몬을 넣는 버튼3개를 넣어주고,

section에는 테이블로 여러 버튼들을 넣어서 포켓몬들의 정보와 사진들을 넣어주었습니다.

 

스크립트에는 AJAX 방식으로 선택한 포켓몬이 3마리면 그 3마리를 jsp에 전송하는 함수와

Section에 있는 포켓몬 선택시 헤더의 버튼에 순서대로 해당 버튼의 포켓몬과 툴팁이 적용되는 함수,

헤더의 정보를 업데이트 시키는 함수,

헤더의 버튼을 다시 누르면 그곳에 적용되있던 정보들을 리셋(선택취소)시키는 함수 가 적용되있습니다.

 

선택 html에서 정보를 받는 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<%
    // 요청에서 파라미터를 읽음
    String pokemon1 = request.getParameter("pokemon1");
    String pokemon2 = request.getParameter("pokemon2");
    String pokemon3 = request.getParameter("pokemon3");
	
    //선택된 포켓몬들을 섹션에 저장
    session.setAttribute("pokemon1", pokemon1);
    session.setAttribute("pokemon2", pokemon2);
    session.setAttribute("pokemon3", pokemon3);

    // 결과 페이지로 다시전송
    response.sendRedirect("battle.jsp");
%>
</body>
</html>

jsp코드에 파라미터값을 각각 받아오고 다시 Session에 저장시켜 그 정보들을 배틀jsp로 전송시킵니다.

이 jsp코드가 선택창과 배틀창의 정보를 이어주는 다리 역할을 하는 jsp입니다.

 


3. 배틀 코드

배틀.jsp의 일부

<%
//포켓몬 이름 받아옴.
String pokemon1 = (String) session.getAttribute("pokemon1");
String pokemon2 = (String) session.getAttribute("pokemon2");
String pokemon3 = (String) session.getAttribute("pokemon3");

PocketmonEntity pocketmon1 = DBCP.getPocketmon(pokemon1);
List<SkillEntity> skills_1 = DBCP.getSkillsByPokemonName(pokemon1);
pocketmon1.setSkills(skills_1,pocketmon1); // 포켓몬 객체에 스킬 리스트를 설정
// 각 스킬의 이름을 출력
for (SkillEntity skill : skills_1) {
    System.out.println("포켓몬1: 스킬이름: "+skill.getSkillName());
}


PocketmonEntity pocketmon2 = DBCP.getPocketmon(pokemon2);//포켓몬객체로 잘가져옴
List<SkillEntity> skills_2 = DBCP.getSkillsByPokemonName(pokemon2);//리스트로도 제대로 가져옴
pocketmon2.setSkills(skills_2,pocketmon2); // 포켓몬 객체에 스킬 리스트를 설정
//각 스킬의 이름을 출력
for (SkillEntity skill : skills_2) {
 System.out.println("포켓몬2: 스킬이름: "+skill.getSkillName());
}

PocketmonEntity pocketmon3 = DBCP.getPocketmon(pokemon3);//포켓몬객체로 잘가져옴
List<SkillEntity> skills_3 = DBCP.getSkillsByPokemonName(pokemon3);//리스트로도 제대로 가져옴
pocketmon3.setSkills(skills_3,pocketmon3); // 포켓몬 객체에 스킬 리스트를 설정
//각 스킬의 이름을 출력
for (SkillEntity skill : skills_3) {
 System.out.println("포켓몬3: 스킬이름: "+skill.getSkillName());
}

SkillEntity[] skill1 = new SkillEntity[4];
SkillEntity[] skill2 = new SkillEntity[4];
SkillEntity[] skill3 = new SkillEntity[4];


for(int i=0;i<4;i++){
   skill1[i] = skills_1.get(i);
   skill2[i] = skills_2.get(i);
   skill3[i] = skills_3.get(i);
}

/*PocketmonEntity[] randPocketmon = new PocketmonEntity[3];
List<PocketmonEntity> randomPocketmon = DBCP.getRandomPocketmon(); // 포켓몬 리스트를 가져옵니다.
Random rand = new Random();

for(int i=0; i < 3; i++){
   randPocketmon[i] = randomPocketmon.get(rand.nextInt(3));
   System.out.println(randPocketmon[i]);
}*/
PocketmonEntity[] randPocketmon = new PocketmonEntity[3];
List<PocketmonEntity> randomPocketmon = DBCP.getRandomPocketmon(); // 포켓몬 리스트를 가져옵니다.

Random rand = new Random();

// 리스트의 크기가 3 미만인 경우를 처리합니다.
if (randomPocketmon.size() < 3) {
    System.out.println("리스트에 포켓몬이 충분하지 않습니다.");
    return; // 또는 다른 적절한 처리를 수행합니다.
}

// 임시 리스트를 생성하여 중복 선택을 방지합니다.
List<PocketmonEntity> tempList = new ArrayList<>(randomPocketmon);

for (int i = 0; i < randPocketmon.length; i++) {
    int randomIndex = rand.nextInt(tempList.size()); // 랜덤 인덱스 생성
    randPocketmon[i] = tempList.get(randomIndex); // 랜덤 인덱스의 포켓몬을 배열에 저장

    // 선택된 포켓몬을 임시 리스트에서 제거합니다.
    tempList.remove(randomIndex);

    // 선택된 포켓몬을 출력합니다.
    System.out.println("상대방 랜덤포켓몬: "+randPocketmon[i].getName());
}

List<SkillEntity> AI_skills_1 = DBCP.getSkillsByPokemonName(randPocketmon[0].getName());
randPocketmon[0].setSkills(AI_skills_1,randPocketmon[0]); // 포켓몬 객체에 스킬 리스트를 설정
List<SkillEntity> AI_skills_2 = DBCP.getSkillsByPokemonName(randPocketmon[1].getName());
randPocketmon[1].setSkills(AI_skills_1,randPocketmon[1]); // 포켓몬 객체에 스킬 리스트를 설정
List<SkillEntity> AI_skills_3 = DBCP.getSkillsByPokemonName(randPocketmon[2].getName());
randPocketmon[2].setSkills(AI_skills_1,randPocketmon[2]); // 포켓몬 객체에 스킬 리스트를 설정



for (SkillEntity skill : AI_skills_1) {
    System.out.println("상대 포켓몬1: 스킬이름: "+skill.getSkillName());
}
for (SkillEntity skill : AI_skills_2) {
    System.out.println("상대 포켓몬2: 스킬이름: "+skill.getSkillName());
}
for (SkillEntity skill : AI_skills_3) {
    System.out.println("상대 포켓몬3: 스킬이름: "+skill.getSkillName());
}

SkillEntity[] eSkill1 = new SkillEntity[4];
SkillEntity[] eSkill2 = new SkillEntity[4];
SkillEntity[] eSkill3 = new SkillEntity[4];
for(int i=0;i<4;i++){
	   eSkill1[i] = AI_skills_1.get(i);
	   eSkill2[i] = AI_skills_2.get(i);
	   eSkill3[i] = AI_skills_3.get(i);
	}


%>

 

배틀관련 코드는 1000줄이 넘어서 가져올 수가 없었습니다.. 그래서 배틀창에 제가 쓴 코드만이라도 소개해드릴까합니다.

 

session으로 저장한 선택한 포켓몬을 받아와서 해당 포켓몬에 스킬들을 적용시켜주는 코드와

상대방이 사용할 포켓몬과 그 포켓몬들이 사용할 스킬들을 적용시켜주는 코드입니다.

 

Pocketmon1,2,3이 사용자가 쓸 포켓몬이고 randPocketmon이 상대방이 사용할 포켓몬의 정보입니다.

해당 포켓몬에 관한 정보들을 PocketmonEntity객체와 SkillEntity객체등 으로 만들어 구현했습니다.

 

 

if(turn==1){
         setType();

         if(num==1){var sk = uskill1;}
         else if(num==2){var sk = uskill2;}
         else if(num==3){var sk = uskill3;}
         else if(num==4){var sk = uskill4;}            
         if(count==1){
            textBox.innerHTML =uPokemon.name+"의 "+sk.name+"!";
         }
         
         acc = Math.floor(Math.random() * 101);
         
         if(sk.accuracy < acc && count==2 )
            textBox.innerHTML = "그러나 "+uPokemon.name+"의 공격은 빗나갔다!";
         else if(sk.accuracy >= acc && count==2 && eType.weak.includes(sk.type)){
            var hp = eh/100*ePokemon.health - ((uPokemon.damage * sk.damage * 13)/ePokemon.defense/50+2)*1.5;
            if(hp<=0){hp=0;count=0;turn=5;}
            eh = hp/ePokemon.health*100;
            document.getElementById("eh").style.width =eh+"%";
            textBox.innerHTML = "효과가 굉장했다!";
         }

배틀 코드의 일부를 더 가져와보았습니다. 공격의 성공과 실패에 관한 로직같네요.

 

포켓몬 객체

package 웹프기말_포켓몬;

import java.util.*;

public class PocketmonEntity {
	int id; //포켓몬 번호
	String name; //포켓몬 이름
	String property; //속성
	int HP; //체력
	int STR; //공격력
	int DEX; //방어력
	
	private List<SkillEntity> skills; // 스킬 리스트 필드 추가

    // 스킬 리스트에 대한 getter와 setter
    public List<SkillEntity> getSkills() {
        return skills;
    }

    public void setSkills(List<SkillEntity> skills,PocketmonEntity pocketmon) {
    	Random rand = new Random();
    	if ("노말".equals(pocketmon.getProperty())) {
    		 Collections.shuffle(skills, rand); 
    		 if (skills.size() > 4) {
    			 skills = skills.subList(0, 4);
    		 }
    		 this.skills=skills;
    	}

        this.skills = skills;
    }
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getProperty() {
		return property;
	}
	public void setProperty(String property) {
		this.property = property;
	}
	public int getHP() {
		return HP;
	}
	public void setHP(int hP) {
		HP = hP;
	}
	public int getSTR() {
		return STR;
	}
	public void setSTR(int sTR) {
		STR = sTR;
	}
	public int getDEX() {
		return DEX;
	}
	public void setDEX(int dEX) {
		DEX = dEX;
	}
}

 

 

DBCP코드

package 웹프기말_포켓몬;

import java.sql.*; 
import javax.sql.DataSource; 
import javax.naming.InitialContext;
import java.util.*;

public class PocketmonDBCP {

	// 데이터베이스 연결관련 변수 선언
		private Connection con = null;
		private PreparedStatement pstmt = null;
		private DataSource ds = null;

		// 등록한 DBCP 데이터소스 찾아 저장하는 생성자
		public PocketmonDBCP() {
			try {
				InitialContext ctx = new InitialContext();
			    ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
			} catch (Exception e) {
				e.printStackTrace();
			}		
		}
		
	// 데이터소스를 통해 데이터베이스에 연결, Connection 객체에 저장하는 메소드 
	void connect() {
		try {
		    con = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
		// 데이터베이스 연결 해제 메소드 
		void disconnect() {
			if(pstmt != null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			} 
			if(con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
		// 포켓몬 이름으로 레코드를 반환하는 메서드
	public PocketmonEntity getPocketmon(String name) {	
		connect();
		String SQL = "select * from Pocketmon where Name = ?";
		PocketmonEntity pocketmon = new PocketmonEntity();

		try {
			pstmt = con.prepareStatement(SQL);
			pstmt.setString(1, name);
			ResultSet rs = pstmt.executeQuery();			
			if(rs.next()) { //쿼리에 값이 있으면 이렇게 set시킴
				pocketmon.setId ( rs.getInt("Number") );
				pocketmon.setName ( rs.getString("Name") );
				pocketmon.setProperty ( rs.getString("property") );
				pocketmon.setHP ( rs.getInt("HP") );
				pocketmon.setSTR ( rs.getInt("STR") );
				pocketmon.setDEX ( rs.getInt("DEX") );
				return pocketmon;
			}
			rs.close();			
			} catch (SQLException e) {
				e.printStackTrace();
			} 
			finally {
				disconnect();
			}
		return null;
	}
	
	
	public SkillEntity getSkill(String name) {	
		connect();
		String SQL = "SELECT * FROM Skill WHERE Property = (SELECT Property FROM Pocketmon WHERE Name = ?)";
		SkillEntity skill = new SkillEntity();

		try {
			pstmt = con.prepareStatement(SQL);
			pstmt.setString(1, name);
			ResultSet rs = pstmt.executeQuery();			
			if(rs.next()) { //쿼리에 값이 있으면 이렇게 set시킴
				skill.setNum ( rs.getInt("Number") );
				skill.setSkillName ( rs.getString("Name") );
				skill.setProperty ( rs.getString("property") );
				skill.setPower ( rs.getInt("power") );
				skill.setAccuracy ( rs.getInt("Accuracy") );
				return skill;
			}
			rs.close();			
			} catch (SQLException e) {
				e.printStackTrace();
			} 
			finally {
				disconnect();
			}
		return null;
	}
	
	// 포켓몬 이름으로 해당 속성의 모든 스킬을 검색해서 리스트로 반환하는 메서드
    public List<SkillEntity> getSkillsByPokemonName(String pokemonName) {
        List<SkillEntity> skills = new ArrayList<>();
        connect();
        
        String SQL = "SELECT DISTINCT * FROM Skill WHERE Skill.Property IN(SELECT Property FROM Pocketmon WHERE Name = ?)";
        
        try {
            pstmt = con.prepareStatement(SQL);
            pstmt.setString(1, pokemonName);
            ResultSet rs = pstmt.executeQuery();
            
            while(rs.next()) {
                SkillEntity skill = new SkillEntity();
                skill.setNum(rs.getInt("Number"));
                skill.setSkillName(rs.getString("Name"));
                skill.setProperty(rs.getString("Property"));
                skill.setPower(rs.getInt("Power"));
                skill.setAccuracy(rs.getInt("Accuracy"));
                skills.add(skill);
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect();
        }
        return skills;
    }
    
 //랜덤포켓몬 추출을 위해 모든 포켓몬을 가져오는 메소드
    public List<PocketmonEntity> getRandomPocketmon() {
        List<PocketmonEntity> RandomPocketmon = new ArrayList<>();
        connect();
        
        String SQL = "SELECT DISTINCT * FROM Pocketmon";
        try {
            pstmt = con.prepareStatement(SQL);
            ResultSet rs = pstmt.executeQuery();
            
            while(rs.next()) {
            	PocketmonEntity Pocketmon = new PocketmonEntity();
            	Pocketmon.setId ( rs.getInt("Number") );
            	Pocketmon.setName ( rs.getString("Name") );
            	Pocketmon.setProperty ( rs.getString("property") );
            	Pocketmon.setHP ( rs.getInt("HP") );
            	Pocketmon.setSTR ( rs.getInt("STR") );
            	Pocketmon.setDEX ( rs.getInt("DEX") );
            	RandomPocketmon.add(Pocketmon);
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect();
        }
        return RandomPocketmon;
    }
    
    
    public boolean checkID(String id, String passwd) {
        connect(); // 데이터베이스 연결
        String sql = "SELECT * FROM User WHERE ID=? AND Password=?";
        try (PreparedStatement pstmt = con.prepareStatement(sql)) {
            pstmt.setString(1, id);
            pstmt.setString(2, passwd);
            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                // 일치하는 사용자가 있는 경우
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect(); // 데이터베이스 연결 해제
        }
        // 일치하는 사용자가 없는 경우
        return false;
    }
    
    public void insertUser(String id, String passwd) {
    	connect(); // 데이터베이스 연결

        // SQL to insert a new user
        String sql = "INSERT INTO User (ID, Password) VALUES (?, ?)";

        try (PreparedStatement pstmt = con.prepareStatement(sql)) {
            pstmt.setString(1, id);
            pstmt.setString(2, passwd);
            
            int affectedRows = pstmt.executeUpdate();

            // Optionally, you can still check if the insertion was successful
            if (affectedRows > 0) {
                System.out.println("User successfully inserted.");
            } else {
                System.out.println("No user was inserted.");
            }

            // Check if the insertion was successful
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            disconnect(); // 데이터베이스 연결 해제
        }

    }
		
}

 

DBCP로 포켓몬과 스킬, 유저정보를 가져오는 메소드들을 구현한 코드입니다.

 

 

이상으로 코드설명까지 마치겠습니다. 조금 더 소개해드리고 싶지만 기사시험과 다른 하고 싶은 일이 많아서 전부 하진 못했네요.. 궁금한 점이 있다면 댓글을 통해 최대한 도움드리겠습니다. 감사합니다.

'프로젝트 > 웹프로그래밍' 카테고리의 다른 글

[HTML] 포켓몬 게임 만들기-1  (0) 2024.01.13