Skip to content
isdnetworks
Go back

심볼 하나에 행이 셋이었다

당첨 금액 테이블을 봤다.

slot_num     슬롯번호
symbol_num   심볼(아이콘) 번호
win_type     당첨 종류(당첨 심볼 개수)
win_money    당첨 종류별 지급 금액

설명에 이렇게 적혀 있었다.

당첨 종류는 각 심볼별로 3개당첨, 4개당첨, 5개당첨 세 종류씩이다

심볼 하나에 행이 셋이다.

Table of contents

Open Table of contents

앞과 반대였다

같은 설계서에서 릴과 페이라인은 문자열 한 칸에 넣어 뒀는데 여기는 행으로 나뉘어 있다.

릴        문자열에 통째로
페이라인  문자열에 통째로
당첨금액  행으로 나뉨

같은 사람이 짠 설계인데 방식이 다르다. 그러면 무엇을 기준으로 갈랐는지가 있을 것으로 보였다.

어떻게 쓰이나 봤다

두 방식의 차이를 이해하려고 어떻게 쓰이는지를 봤다. 릴은 클라이언트가 화면을 그리려고 통째로 받고 당첨 금액은 스핀 결과가 나오면 그 심볼과 그 개수의 금액을 찾는다.

결과: 7번 심볼이 4개 나옴

7번 심볼의 4개 당첨 금액을 조회

부분 조회다. 여기서 앞의 것과 갈리는 지점이 보였다.

당첨 금액을 문자열로 두면 "3:100,4:500,5:2000" 같은 모양이 될 텐데 이러면 매번 잘라서 찾아야 한다.

SELECT win_money FROM win_money_info
 WHERE slot_num = ? AND symbol_num = ? AND win_type = ?;

행으로 두면 조회 한 번이다. 그리고 (slot_num, symbol_num, win_type) 복합 인덱스를 걸 수 있어서 EXPLAINtypeconstref 로 나온다. 문자열 안의 값에는 인덱스를 못 걸고 FIND_IN_SET 으로 조건을 걸어도 전수 스캔이 된다.

배수였다

win_money 설명이 이랬다.

당첨 종류별 지급 금액(베팅한 금액에 곱해줄 금액)

금액이 아니라 배수다. 지급은 베팅 금액에 win_money 를 곱한 값이 된다.

컬럼 이름은 money 인데 실제로는 곱할 수라 이름과 내용이 다르다. 설명을 안 읽으면 win_money = 100 을 100코인 지급으로 읽을 텐데 베팅이 10이면 1,000이다. 설명서에만 적혀 있는 정보이고 win_multiplier 였으면 그 자리에서 갈렸을 것이다.

배수로 두는 것 자체는 이유가 있어 보였다. 금액을 고정하면 베팅 금액이 달라져도 지급이 같아서 말이 안 되는데 슬롯은 베팅 금액을 유저가 고르므로 비례해야 맞다. 밸런스를 조정할 때도 배수 하나만 고치면 모든 베팅 구간에 적용된다.

세 종류인 이유

3개와 4개와 5개 세 종류라는 것도 생각해 봤다. 릴이 다섯 개니 한 페이라인에 최대 5개가 같은 심볼일 수 있다.

1개, 2개  →  당첨 아님
3개       →  당첨
4개       →  더 큰 당첨
5개       →  최대

3개부터 당첨이라 세 종류이고 릴 개수가 종류 수를 정한다.

만약 릴이 여섯 개가 되면 3부터 6까지 네 종류가 되어 행이 늘어난다. 문자열이었으면 구분자 형식을 바꾸고 explode 하는 코드도 함께 고쳐야 하는데 행 구조라 INSERT 만 하면 된다.

앞에서 본 칸 수가 변동될 수 있다는 것과 반대 방향이다. 릴은 길이가 변하고 여기는 행이 는다.

판단 기준 — 문자열과 행

두 자리를 놓고 보니 기준이 조금 보였다. 통째로 읽고 통째로 쓰면 문자열이고 특정 조건으로 하나를 찾으면 행이다.

그리고 여기에 하나 더 붙는 것 같다. 값이 자주 조회되면 행 쪽이 인덱스를 탈 수 있고 로딩 때 한 번 나가는 값이면 문자열이다. 릴은 게임 시작 때 한 번 내려가고 당첨 금액은 매 스핀마다 조회된다.

다만 이것은 문서만 보고 짐작한 것이다. 실제로 당첨 금액을 매번 DB 에서 읽는지 아니면 메모리에 올려 두는지는 모른다.

메모리에 올려 두면 문자열이든 행이든 상관없어질 것 같고 코드를 보면 알게 될 부분이다.

정리


Share this post on:

Previous Post
숫자가 안 맞아서 보니 기준이 달랐다
Next Post
비어 있는 값이 오류가 아니었다