$$ 이 포스팅은 노 베이스를 대상으로 하지 않는다 $$
$$ 노 베이스는 다른 포스팅을 먼저 보고 오도록 하자 $$
저번 시간에 우리는
버튼을 누르면 숫자가 증가하도록 만들었다
그리고 초기화는 숙제였지
별거 있나,
그냥 0으로 만들면 되는거지
버튼도 연결해준다
이제 기본 시스템은 구현이 끝났다
남은건
확률 구현하고
확률 적용하고
화면에 표시하는 것 뿐이다
자 그러면 확률 구현은 어떻게 할 것이냐
구현 방법은 여러가지가 있지만
우리는 살짝 노가다 방식을 사용할 것이다
걱정하지 말아라
확률 데이터 파일은 제공하도록 할테니
뭐 연산식을 사용할 수도 있겠지만
코린이한테 연산식을 구현해보라고 하는건
너무 가혹한 얘기가 아닌가
좌측의 lib 폴더에
새로운 폴더를 하나 만든다
폴더명은 localData
파일명은
probabily.dart
파일 내용을 작성하기 전
확률 구현에 있어서
필요한 로직을 한번 정리해보자
뭐 구현하고 싶은 마음대로 하면 되지만
나를 따라할거라면
다음과 같은 로직을 적용할 수 있다
1. 강화 성공 확률은 5 스테이지마다 2%씩 감소한다
2. 강화 하락 확률은 11스테이지마다 0.5%씩 증가하며 최대 7%까지만 증가 한다
3. 강화 성공 확률은 최대 30%까지만 하락하며 그 이하는 내려가지 않는다
4. 10스테이지마다 하락 확률은 0이 된다
5. 강화 스테이지가 50이 되면 하락 확률은 5%로 증가한다
그러면 해당 내용을 반영한 노가다 데이터를 만들어보자
이런 자료를 하나 만든다
이 자료가 담을 수 있는 데이터 형태를 하나 소개한다
1: {'success': 1.0, 'maintain': 0.0, 'decrease': 0.0},
해당 내용을 풀어보면
Map <int> | 1 | 2 | 3 |
Map <String> | success | maintain | decrease |
Map <Double> | 1.0 | 0.0 | 0.0 |
이런식으로 배치된다
별거 없다
Map 자료란
간단하게 말해서
내가 보기 쉽게 데이터를 정리 한 것이다
물론 저 대로 사용할 수 있다
보통 키:쌍 이렇게 부르는데
키는 Success
쌍은 1.0
이런식으로 부른다
따라서 1.0을 쓰고싶으면 Success를 가져와 쓰게 된다
상세한건 나중에 설명하도록 하고
한번 내용을 기술해보자
다시 말하지만 코린이는
연산식을 만들어 계산하는게 힘들다
그게 가능하면 그건 코린이라고 할 수 없지 않을까?
그래서 확률 데이터가 담긴 파일을 준비했다
다운로드 받아서 그대로 복사붙여넣기 하면 된다
이렇게 Map자료를 가져와서 사용하기 위해 변수를 만들고 지정한다
코드를 조금 분석해보자면
Map<String, double> get currentProbability =>
stageProbabilities[_Stage] ?? {'success': 0.0, 'maintain': 0.0, 'decrease': 0.0};
Map 자료를 선언한다 , 키와 쌍은 String과 double로 선언되었다
이제 파일을 불러와야겠지
그리고 HomePage.dart를 보면
onPreesed 안을 일단 주석처리 해준다
이러면 에러가 안생길 것이다
이제 저장하고 다음 작업을 이어가자
일단 스테이지를 1로 만들자
보통 게임은 1 스테이지 부터 시작이지 0 스테이지부터 시작이 아니니까
그 다음 데이터가 정말 불러와지는지 확인 해보자
여기서 확인하는건 실제로 확률 데이터가 불러와지는지,
스테이지는 변화가 되는지에 대한 정보다
이제 강화버튼에 넣고 저장한 다음 버튼을 눌러보자
로그를 보면
확률을 불러오고 있고
스테이지가 잘 증가하는 것을 볼 수 있다
자 이제 잘 불러오니까
확률적으로
성공 , 하락 , 유지를 반환하도록 함수를 만들어보자
그 전에 DownStage라는 함수를 먼저 하나 만들었다
하락이 나왔을때 스테이지는 하락해야한다
하지만 1스테이지 이하로 하락된다면?
그건 의도한 결과와 다르니 Max 메서드를 이용해
1 이하로 떨어지지 않도록 한다
이제 확률을 구현해보자
일단 DataConfigure 프로바이더 안에
함수를 하나 만든다
그 다음 랜덤 숫자를 사용하기 위해 패키지 하나를 import 한다
math 패키지는 랜덤숫자를 사용하거나 수식을 계산하거나
수학적인 일을 할때 사용한다
그 다음
Random() 객체를 이용할 random 변수를 하나 만들어주고
실제로 랜덤한 숫자를 담을 변수를 하나(randomNumber) 만들어준다
저걸 풀어보면
final double randomNumber = Random().nextDouble();
이런 형태가 될 것이다
왜 random = Random() 이런식으로 만드냐고?
지금은 우리가 하나의 랜덤값만 뽑아오니까 상관없는데
만약 여러개를 뽑아야 한다면
final double randomNumber1 = Random().nextDouble();
final double randomNumber2 = Random().nextDouble();
final double randomNumber3 = Random().nextDouble();
이런식으로 써야한다
이렇게 하면 매번 랜덤 숫자를 만들때
새로운 객체를 만들테고
성능이 떨어질 수 밖에 없다
3가지 일을 한사람한테 시키는것보다
하나 끝나고 하나 다시 시키고
또 끝나면 다시 시키는 과정이
절대 효율면으로 좋을 수가 없다
따라서 하나의 객체를 만들고 돌려쓴다
그 다음
콘솔에 출력해보는데
print('Random Number : $randomNumber');
여기서 print 안에 왜 $ 이런게 들어있냐면
보통 변수를 출력하거나 글자를 출력하거나 한가지만 된다
근데 글자랑 변수랑 같이 출력하고 싶을 수도 있으니까
$를 쓰면 글자 안에서 변수를 출력할 수 있다
이제 테스트해보자
앞서 강화버튼에 다른거 넣어놨으니
이번에 다른 함수로 바꾸고 테스트 해보자
랜덤 숫자는 0.0 ~ 1.0 사이의 숫자를 반환하고
숫자 잘 반환하는걸 확인했다 다음 작업을 이어서 진행하자
함수를 수정한다
아까 로그로 확인한
성공 , 유지 , 하락에 대한 데이터를 현재 스테이지에 맞게 가져오고
lowerBound는 하한선을 나타낸다
이를 만들어두는 이유는
하한선 - 상한선 사이에 랜덤한 숫자가 있다면
함수에 적용하기 위한 일종의 필터링 같은 것이다
이게 왜 필요하냐고?
랜덤숫자는 계속 달라진다
그러면 값에 대한 검증이라던지, 어떤 모종의 이유로 구현 범위를 넘어설 수 있다
이럴경우 정상범위를 초과하므로 저렇게 지정하도록 한다
자 이제 제일 복잡한게 나왔다
구조는 쉽다
upperBound라는 상한선을 정하고
하한 - 상한 사이에 랜덤 한 숫자가 나오면
outcome 의 값으로 성공 ,하락을 구분한다
유지는 break를 통해 아무 작업도 하지 않는다
마지막으로 하한선을 상한선으로 덮어씌워
기존 값에 대한 검증이 확실히 되도록 한다
이렇게 작성하고 이제 테스트를 해보면
게임 화면과 로그다
잘 되는걸 볼 수 있다
그러면 실제로 성공했는지 실패했는지 어쨌는지 봐야할거니까
로그를 추가해보자
자 이제 저장하고 다시 실행해보자
강화가 하도 잘붙어서
실패하기까지 오래걸렸다
이제 화면에 확률을 표시해보도록 하자
HomePage.dart로 넘어와서
확률 데이터를 수정한다
일단 확률이 적힌 Map 자료를 가져오고
확률에 100을 곱해 정수로 만들어준다
확률을 0.1% 이런식으로 표시할 순 없으니까 말이다
그리고 텍스트를 한번 더 가공한다
double로 만든 데이터는 text 위젯에 넣을 수 없다
text위젯은 String , 문자만 지원하니까
따라서 String으로 바꿔주는데 이때 12.345455 이런식으로 나오면
12.34까지만 출력되게 toStringAsFixed 메서드를 사용한다
그 다음 텍스트 위젯에 넣는다
이제 const를 지워야 한다
const는 고정된 값만 지원하는데 확률은 계속 달라지니까 const를 지워야한다
const가 어디있냐고?
이 확률의 부모는 Padding 이므로 Padding앞에 const를 지운다
부모의 속성이 자식을 따라가기 마련이다
자 그러면
이제 확률이 화면에 표시된다
강화를 한번 시도해보자
화면에 잘 표시되는걸 볼 수 있다
끝내며
다음 시간엔 이제 기기에 데이터 저장과 불러오기
강화 총 횟수 설정 및 화면에 표시하도록 해보자
조금만 더 하면 시리즈가 끝난다 마지막까지 함께 해주길 바란다
'Flutter > Android' 카테고리의 다른 글
[ 플러터 ] 가챠 게임을 코린이도 만들 수 있다 -2 (6) | 2023.10.28 |
---|---|
[ 플러터 ] 가챠 게임을 코린이도 만들 수 있다 - 1 (4) | 2023.10.25 |
[플러터] 비 전공자도 텍스트 컨트롤 할 수 있다 - 4 (1) | 2023.10.13 |
[플러터] 비 전공자도 텍스트 컨트롤 할 수 있다 - 3 (2) | 2023.10.07 |
[플러터] 비 전공자도 텍스트 컨트롤 할 수 있다 - 2 (1) | 2023.10.06 |