-
열네번째 포켓몬, 폴리곤2 구현 (속임수, 스피드 비교)포켓몬 배틀 구현 2022. 3. 23. 05:23
지금까지 구현해둔 포켓몬들중 마지막, 폴리곤2이다.
이 글이 끝나면 또 다양한 포켓몬들을 추가할것이다.
그럼 빨리 스타트!
폴리곤2 역시 썬더, 랜드로스 등등과 같은 딜탱형 포켓몬이다.
https://pikalytics.com/pokedex/homebss/porygon2
Porygon2 Series 12 Battle Stadium Singles Stats Pokédex | Pokémon | Pikalytics
Eviolite 99.800% Leftovers 0.100% Life Orb 0.100% Choice Specs 0.000%
pikalytics.com
hp 회복은 필수.
속임수도 대부분 채용하고,
냉동빔, 트라이어택, 10만볼트, 섀도볼 등
다양한 견제기중 2개를 선택하면 된ㄷ.
냉동빔이랑 10만볼트는 이미 구현했고,
섀도볼은 구현하지는 않았는데 딱히 추가로 구현할건없고...
그래서 새로 구현해야한느 트라이어택이랑
그냥 선택률 높은 냉동빔을 골랐따.
hp회복과 냉동빔은 옛날에 구현 했으니 패스
트라이어택부터 구현해보자.
트라이어택은 상대방에게 화상, 마비, 얼음중 하나의 상태이상을 거는 독특한 기술이다.
다른 상태이상들과 마찬가지로, "부가효과" 함수에서 처리해주자.
if (a[aa][skillnumber][6] == "트택" && b[bb][5][0] == "n" && rd < stoi(a[aa][skillnumber][7])) { int triattack = rand() % 3; if (triattack == 0) { if (b[bb][0][1] != "불꽃" && b[bb][0][2] != "불꽃") { if (s == 1) cout << "상대 "; cout << b[bb][0][11] << "은 화상을 입었다!\n"; int atk = stoi(b[bb][0][4]); atk /= 2; string aattkk = to_string(atk); b[bb][0][4] = aattkk; // 상대 공격력을 절반으로 깎음 b[bb][5][1] = "y"; //화상 여부 y 처리 } } else if (triattack == 1) { if (b[bb][0][1] != "전기" && b[bb][0][2] != "전기") { if (s == 1) cout << "상대 "; cout << b[bb][0][11] << "은 마비되어 기술이 나오기 어려워졌다!\n"; int spd = stoi(b[bb][0][8]); spd /= 2; string ssppdd = to_string(spd); // 마비는 상대의 스피드를 절반으로 깎음 b[bb][0][8] = ssppdd; b[bb][5][3] = "y"; } } else if (triattack == 2) { if (b[bb][0][1] != "얼음" && b[bb][0][2] != "얼음") { if (s == 1) cout << "상대 "; cout << b[bb][0][11] << "은 얼어붙었다!\n"; b[bb][5][6] = "y"; } } b[bb][5][0] = "y"; }
구현은 간단하다.
그냥 0,1,2중 값을 하나 뽑아
0이면 화상, 1이면 마비, 2면 얼음을 상대방에게 건다.
코드가 길뿐,
다 다른 상태이상 코드를 복붙한것이므로 쉽게 해결
다음 스킬 "속임수"는,
자신의 공격력이 아닌 상대방의 공격을 참조하는 독특한 스킬이다.
물리기술의 데미지를 계산할때 자신의 물리 공격력과 상대방의 물리 방어력을 계산에 넣는데,
속임수는 "상대방의" 물리 공격력과 상대방의 물리 방어력을 사용한다.
상당히 독특한 기술이다.
데미지 계산과 관련된 함수이므로, "데미지" 함수로 이동
if (a[aa][number][0] == "속임수") atk = stoi(b[bb][0][4]); //스킬 "속임수"는 상대방의 공격력을 참조한다.
공격측 a의 사용 스킬 이름이 "속임수"라면
공격을 맞은 쪽 b의 공격력 b[bb][0][4]를 값으로 참조한다.
이러면 간단하게 구현 끝!
...인줄 알았는데
나도 몰랐는데, 속임수는 교체 "전" 상대방 포켓몬의 공격력을 참조한다.
상대방이 폴리곤2를 보고 속임수를 쓸것을 예측해
물리 포켓몬을 특수 포켓몬으로 교체했다해도,
교체 전 물리 포켓몬의 공격력을 기준으로 데미지가 측정되기에
속임수의 데미지는 강력하다.
https://www.youtube.com/watch?v=Y0XFptr02Eg&t=287s
해당 영상의 2:48초부터 참고
상대는 흑마렉스를 망나뇽으로 교체했는데,
속임수의 첫번째와 두번째 데미지가 3배가량 차이난다.
이는 첫번째 속임수는 특수 어태커인 흑마렉스의 공격력을, (특수 어태커라 공격력이 낮다)
두번째 속임수는 물리 어태커인 망나뇽의 공격력을 참조해서 그렇다.
이거는 왠만한 포켓몬 매니아들도 모르는 사실일것같아.
나무위키에도 안써있으니 말 다했지 뭐.
쨌든 이를 구현하려면, 교체하기 전 포켓몬의 번호를 알아야된다.
while (1) {//배틀의 매 턴은 while문으로 구현됨. ps[10] = ps[0]; ps[11] = ps[1];
이는 메인 함수에서 각 턴이 시작될때,
그때의 포켓몬 번호 ps[0]과 ps[1]을 ps[10], ps[11]에 저장한다.
상대방의 교체 여부와 상관 없이,
턴이 시작했을때 상대방 필드 위 포켓몬을 기준으로 하면 된다.
이는 ps 배열을 2칸 추가해 해당 칸에 턴이 시작됐을떄의 각 포켓몬 번호 값을 할당한다.
if (a[aa][number][0] == "속임수") { int sys = 0; if (s == 1) sys = ps[11]; //내가 속임수를 사용한 경우 상대방의 교체 전 포켓몬의 공격력 참조 else if (s == 0) sys = ps[10]; //상대방이 속임수를 사용한 경우 나의 교체 전 포켓몬의 공격력 참조 atk = stoi(b[sys][0][4]); //스킬 "속임수"는 상대방의 교체전 포켓몬의 공격력을 참조한다. }
그리고 다시 "데미지" 함수의 위 코드로 돌아와,
플레이어가 속임수를 사용했을때는 상대방의 포켓몬 번호 ps[11]을,
반대로 cpu가 속임수를 사용했을때는 플레이어의 포켓몬 번호 ps[10]을 참조하도록 수정한다.
공격측이 플레이어인지 상대방인지는 함수 인자에서 1과 0의 값을 변수 s에 받아 구분한다.
그러면 폴리곤2의 스킬 구현 끝!
폴리곤2는 거의 대부분 아이템을 "진화의휘석"을 사용한다.
이는 디메리트없이 사용자의 방어력과 특방을 1.5배로 올려주는 엄청난 사기템이다.
다만, "진화할 수 있는 포켓몬"만 해당 아이템을 사용가능하다.
대부분의 실전 포켓몬은 최종 진화형태이므로,
이를 사용할수있는 포켓몬은 극히 한정되어있고
그중 하나가 폴리곤2이다.
진화 전 개체가 진화 후 개체의 하위호환인 경우가 대부분인 다른 포켓몬들과 달리,
폴리곤2는 내구형, 폴리곤 z는 공격형으로 용도가 다르며
둘의 개체값 차이도 크지않다.
즉 폴리곤2는 최종진화체가 아님에도 개체값이 상당히 높아
진화의 휘석으로 방,특방이 1.5배가 되면 어지간한 어태커로는 뚫을 수 없는 내구도를 보여준다.
여기에 체력 회복기, 상대방의 높은 공격력을 역이용하는 속임수,
적에게 상태이상을 터뜨려주는 여러 특수 보조기까지,
폴리곤2는 막이로써 엄청난 성능을 보여준다.
다만 아무래도 이 탱킹은 아이템인 진화의 휘석에서 나오다보니,
템을 없애버리는 "탁쳐서떨구기",
서로의 템을 바꾸는 "트릭"과 같은 스킬에는 약하다.
어쩌다 이야기가 길어졌는데
결국 폴리곤 2 아이템 진화의 휘석은
그냥 폴리곤 2의 방어력과 특방 능력치를 1.5배 곱해서 입력하면 된다.
아이템이 없어지면 이 능력치가 원래대로 돌아오는데,
굳이 이를 구현할 필요 없이
그냥 탁쳐서떨구기, 트릭을 구현할때 상대방의 아이템이 휘석이면 상대방 방,특방을 2/3으로 떨어뜨리면 된다.
뭐 한마디로 요약하자면 템은 구현할게 없다.
마지막으로 남은 특성
폴리곤2의 특성은
다운로드 트레이스 애널라이즈 3개가 존재한다.
다만 아무래도 가장 무난하게 사용가능한 애널라이즈를 주로 사용한다.
그리고 이게 다른 2개보다 구현하기 쉬울것같기도하고,
그래서 기쁜 마음으로 구현을 시작했는데,
역시 인생은 마음대로 되지 않더라.
애널라이즈는 후공이면 기술 위력이 1.3배 상승한다.
여기서 문제는, 자신이 후공인지 어떻게 아냐는것이다.
데미지를 1.3배로 늘리므로, 이는 "위력증감" 함수에서 처리해야한다.
다만 이 위력증감 함수는 스피드가 누가 빠른지, 공격측이 플레이어인지 cpu인지를 인자로 받지 않는다.
이 특성 하나때문에 또 인자를 이리 저리 추가하기는 귀찮고,
결국 선공인지 후공인지는 스피드를 비교하여 정하므로,
이 스피드비교 함수, 정확히는 여기에 우선도까지 감안하여 비교하는 "우선도비교" 함수를 호출하여
if (p[pp][0][12] == "애널라이즈" && 우선도비교(p, s, pp, ss, number, snumber) == 0) { cout << "[특성 애널라이즈]\n"; cout << p[pp][0][11] << "의 기술 위력이 강해졌다!\n"; damage = damage * 13 / 10; }
이렇게 하면 된다.
우선도 비교 함수는 둘의 스피드를 비교해서
먼저 넣은 인자가 빠르면 1, 느리면 0을 리턴한다.
그러면 이제 끝났느냐? 아니다.
"둘이 스피드가 같은 경우"가 남았다.
둘이 스피드가 같을 경우, 그냥 랜덤으로 한쪽이 먼저 선공한다.
문제는 두 폴리곤 2가 서로 공격했을때이다.
맨 처음에 스피드비교 함수를 호출해 랜덤값이 1이 나와 플레이어의 폴리곤2가 먼저 공격했다.
그리고 이 폴리곤2가 공격할때, 또 스피드 함수를 호출해 해당 공격이 후공인지 확인하는데,
이때 랜덤값이 0이 나오면 후공을 했다 생각해 위력이 1.3배가 된다.
그리고 후공측의 폴리곤2가 공격할때도 스피드 함수를 호출할것이고
이때 랜덤값이 1이 나오면 선공을 했다 생각해 위력이 1.3배가 되지 않는다.
즉 선공한 폴리곤2는 후공을 했다 판단되어 위력이 1.3배가 되고
반대로 후공한 폴리곤2는 선공을 했다 파악해 위력이 늘어나지 않는
아이러니한 사태가 일어난다.
이를 어떻게 수정해야하나 고민했고,
결국 귀찮지만 인자를 전달해 해결하는 방법밖에 없나 고민하던 그때
스피드 함수에 넣는 인자가 같을때 동일한 랜덤값을 리턴하면 되겠구나!
결국 3번의 스피드 비교 함수가 서로 다른 값을 리턴하는게 문제고,
어차피 스피드 비교 함수에 넣는 인자 값은 동일할테니,
넣은 인자값이 같으면 선공 후공 여부가 동일하게 정해지면 된다.
int 우선도비교(string p[][one][two], string s[][one][two], int pp, int ss, int number, int snumber) { int speed=1138; int pspeed = stoi(p[pp][0][8]); int sspeed = stoi(s[ss][0][8]); if (p[pp][number][6] == "우선도") { pspeed += stoi(p[pp][number][7]) * 3000; } //우선도 처리 if (s[ss][snumber][6] == "우선도") { sspeed += stoi(s[ss][snumber][7]) * 3000; } if (pspeed > sspeed) { speed = 1; } //플레이어가 빠르면 1 else if (pspeed < sspeed) { speed = 0; } //cpur가 빠르면 0 else if (pspeed == sspeed) { speed = (pspeed+number+snumber) % 2; } //둘이 같으면 1과 0중 랜덤으로 값 리턴 return speed; }
서로의 스피드가 같을경우,
스피드 값과 자신, 상대방이 사용한 스킬 번호를 더해서 2로 나눈다.
이러면 세 스피드비교 함수는 모두 같은 인자를 사용하니 같은 랜덤값을 리턴하고,
양쪽이 사용하는 스킬은 매번 달라지므로
스피드가 같을때 선공측이 랜덤하게 정해지는것도 구현 가능하다.
https://khs20010327.tistory.com/17
우선도와 스피드 구현
포켓몬은 "스피드"와 "우선도"라는 개념이 존재한다. 일단 스피드는 말 그대로 포켓몬의 스피드를 나타낸다. 각 포켓몬은 고유의 스피드 개체값을 지니고있고, 이를 노력치, 아이템 등으로 보정
khs20010327.tistory.com
이에 관한 글은 전에도 썼었으니 참고.
폴리곤2도 다른 딜탱형 포켓몬처럼 금방 구현할줄알았는데...
스킬 "속임수"랑 특성 "애널라이즈"덕분에
생각보다 구현이 오래걸렸다.
그래도 기발하게 문제를 해결했고,
왠만한 포덕들도 모를 시스템을 적용했으니
기분은 뿌듯했다.
'포켓몬 배틀 구현' 카테고리의 다른 글
열여섯번째 포켓몬, 무한다이노 구현 (프레셔) (0) 2022.03.25 열다섯번째 포켓몬, 맘모꾸리 구현 (연속기) (0) 2022.03.25 열세번째 포켓몬, 칠색조 구현 (반동기) (0) 2022.03.23 열두번째 포켓몬, 따라큐 구현 (특성 탈) (0) 2022.03.23 열한번째 포켓몬, 솔가레오 구현 (틀깨기, 약점보험) (0) 2022.03.23