그래도 꽤 여러가지 만들었기에 이래저래 테스트를 돌려보았다
아니나다를까 문제점이 여러가지 보인다 ;ㅅ;
나중에 고치려면 골치아플수 있으니 미리 수정하고 넘어가야지
1. Max all 버튼 수정
지난번에 나름 괜찮게 고쳤다고 생각했는데
public void Max_all(){
while (MA >= TS_cost){
TS_purchase();
}
while (MA >= D1_cost * (10 - D1_amount%10)){
D1_purchase();
}
while (MA >= D2_cost * (10 - D2_amount%10)){
D2_purchase();
}
while (MA >= D3_cost * (10 - D3_amount%10)){
D3_purchase();
}
while (MA >= D4_cost * (10 - D4_amount%10)){
D4_purchase();
}
while (MA >= D5_cost * (10 - D5_amount%10)){
D5_purchase();
}
while (MA >= D6_cost * (10 - D6_amount%10)){
D6_purchase();
}
}
이런 기존의 구조에는 문제가있었다
아니 사실 문제가 아닐지도 모르지만
위에서부터 순서대로 최대치를 구매하면서 내려가는거라
골고루 한번씩 구매하는걸 반복하는것과 조금씩 다른결과가 나올수있는데
문제가 아니라면 아닐수도 있지만 난 골고루 사주길 원한다 -_-
좀 더 머리를 굴린끝에...
public void Max_all(){
double min_cost;
do {
if (MA >= D1_cost * (10 - D1_amount%10)){
D1_purchase();
}
if (MA >= D2_cost * (10 - D2_amount%10)){
D2_purchase();
}
if (MA >= D3_cost * (10 - D3_amount%10)){
D3_purchase();
}
if (MA >= D4_cost * (10 - D4_amount%10)){
D4_purchase();
}
if (MA >= D5_cost * (10 - D5_amount%10)){
D5_purchase();
}
if (MA >= D6_cost * (10 - D6_amount%10)){
D6_purchase();
}
if (MA >= TS_cost){
TS_purchase();
}
double[] costs = {D1_cost * (10 - D1_amount%10), D2_cost * (10 - D2_amount%10), D3_cost * (10 - D3_amount%10), D4_cost * (10 - D4_amount%10), D5_cost * (10 - D5_amount%10), D6_cost * (10 - D6_amount%10), TS_cost};
min_cost = costs.Min();
} while (MA >= min_cost);
}
이렇게 수정했더니
이제야 진짜 원하던대로 되는가 싶었는데
특정 차원의 갯수가 0개이고 10개 미만으로 구매가능할때 Max all 버튼을 눌러도
작동을 안해야하는데 1~9개만 구매가능할때 Max 버튼을 누르면 1개가 구매되는 버그가 있었다
뭐가 문제인가 싶어 둘러보니 나머지를 구하는 %연산에 문제가 있는듯하다
위의 스크립트에서 amount 가 0일때는 나눗셈을 할수가 없어서 오류가 나는듯
이리저리 고민해봤는데....
뭔가 아름답게 해결할만한 방법이 안보여서 그냥 땜빵처리를 했다
미래의 내가 좋은 방법을 생각해줄거야
public void Max_all(){
double min_cost;
do {
double D1_amounts, D2_amounts, D3_amounts, D4_amounts, D5_amounts, D6_amounts;
D1_amounts = D1_amount + 0.0001;
D2_amounts = D2_amount + 0.0001;
D3_amounts = D3_amount + 0.0001;
D4_amounts = D4_amount + 0.0001;
D5_amounts = D5_amount + 0.0001;
D6_amounts = D6_amount + 0.0001;
if (MA >= D1_cost * (10 - D1_amounts%10)){
D1_purchase();
}
if (MA >= D2_cost * (10 - D2_amounts%10)){
D2_purchase();
}
if (MA >= D3_cost * (10 - D3_amounts%10)){
D3_purchase();
}
if (MA >= D4_cost * (10 - D4_amounts%10)){
D4_purchase();
}
if (MA >= D5_cost * (10 - D5_amounts%10)){
D5_purchase();
}
if (MA >= D6_cost * (10 - D6_amounts%10)){
D6_purchase();
}
if (MA >= TS_cost){
TS_purchase();
}
double[] costs = {D1_cost * (10 - D1_amounts%10), D2_cost * (10 - D2_amounts%10), D3_cost * (10 - D3_amounts%10), D4_cost * (10 - D4_amounts%10), D5_cost * (10 - D5_amounts%10), D6_cost * (10 - D6_amounts%10), TS_cost};
min_cost = costs.Min();
} while (MA >= min_cost);
}
정수이어야할 Dn_amount 변수들에 순간적으로 0.0001을 더해줘서
0이 아니게만들어주는 무식한 방식의 땜빵 ^^
일단 문제는 해결
2. 지수표현 수정
대부분 숫자들이 1000 미만은 그대로 표기하고 넘어가면 1.23e45 형태로 나오게 해놓았는데
지수형태로 표현할때는 상관없지만 1000 미만을 그대로 사용하는경우
어떤건 정수이고 어떤건 소수점을 보여줘야하는데
정수로 일괄처리를 해두어서 어색한 부분이 있었다
Total Tickspeed가 현재 1.1이어야 하는데 그냥 1로 보이는모습....
뭐 이건 인지만 하면 간단하게 해결할수있는 문제였다
public string Expo(double number, string note){
string result;
if (number < 1e3){
result = number.ToString(note);
}
else{
var exponent = (Math.Truncate(Math.Log10(Math.Abs(number))));
result = (number / Math.Pow(10, exponent)).ToString("F2") + "e" + exponent;
}
return result;
}
기존의 Expo 메소드에 그냥 애초에 1000미만일때
소수점 자리수를 어떻게 표시할지 받아오게 만들고
update()에서 메소드를 사용할때도 그냥 "F0"나 "F2"를 집어넣어주니 해결끗
어떤건 소수점 2자리로, 어떤건 정수로
잘 표시되는모습이다
만든것도 그렇게 많지도않은데 벌써 이렇게 문제점들이 보이니...
역시 혼자 배우고 혼자 만드는데는 한계가 있는걸까?
'개발 > Newbie Creator' 카테고리의 다른 글
방치게임 개발하기 #9 - Buy max (0) | 2024.12.21 |
---|---|
방치게임 개발하기 #8 - 스크립트 간소화 (1) | 2024.12.19 |
방치게임 개발하기 #7 - 버튼꾸미기3 (0) | 2024.12.17 |
방치게임 개발하기 #6 - 버튼꾸미기 2 (0) | 2024.12.15 |
방치게임 개발하기 #5 - 버튼 꾸미기 (1) | 2024.12.13 |