• 북마크
타입문넷

창작잡담

[잡담] [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-3-

본문

안녕하십니까 라르트 입니다. 


오늘은 가챠게임의 가장 중요한 요소 가챠 알고리즘을 만들어 볼까 합니다. 



가챠를 하기 위해서 무작위로 숫자를 뽑아줄 수 있는 방법을 찾으니 random이라는 것을 사용하라고 나와서 그것을 이용해 봤습니다.



우선 간단하게 실험을 해봅시다. 
3일차 4 가챠 알고리즘 만들기.JPG

 0~999까지의 1000개의 숫자중에 아무거나 하나 뽑아보는 코딩

3일차 4-1 가챠 알고리즘 만들기.JPG

 
정상적으로 작동하는 군요. 이제 본격적으로 만들어 봅시다.



그냥 전체 카드 중에서 하나를 뽑아내는 방식은 확률설정 등에서 크나큰 어려움이 있기에, 제가 만들 가챠의 알고리즘은 우선적으로 뽑히는 카드의 등급을 확률로 결정한뒤, 그 등급내에서 다시 카드를 뽑아내는 형식으로 갈겁니다. 



3일차 4-2 가챠 알고리즘 만들기.JPG

 
for 코드를 이용해서 입력한 횟수만금 반복하도록 해줍니다. 가챠확률은 아직 정해지지 않았으니 대강 집어 넣고 해당하는 범위의 숫자가 뽑히면 star_get이라는 변수에 해당하는 카드 등급을 저장하도록 합니다. 

작동시켜보니 잘 작동하는 군요. 허나 조금 생각해보니 알고리즘이 조금 잘못된거 같아서 수정해주고 해당 등급내에서 카드를 뽑는 코드를 집어넣어 줍니다..



3일차 4-3 가챠 알고리즘 만들기.JPG

 

해당 범위의 숫자가 뽑히게 되면 star_get 변수에 해당하는 카드 등급의 카드 숫자를 card_amount 라는 딕셔너리에서 가져오도록 수정했습니다. 딕셔너리 변수를 사용하니 신세계를 볼 수 있더군요. 조언해주신 Kunggom님 감사드립니다.

자 자신만만하게 새롭게 알게된 코드를 사용해서 작동시켰습니다.

3일차 4-3 에러 가챠 알고리즘 만들기.JPG

 
에러네요...보아하니 int변수는 길이가 없다는 비스므리한 이야기 갔습니다. 원래 card_choice변수에 range 코드를 사용해서 범위로 넣었어야하는데 집어넣어야하는데, 그냥 숫자를 박아놨으니 숫자 하나 중에 숫자 하나를 고르라는 이상한 식이 된거 같군요.



3일차 4-3 에러 해결 가챠 알고리즘 만들기.JPG

 
card_choice를 해당하는 카드등급의 범위로 수정해줍니다. 



3일차 4-4 가챠 알고리즘 만들기.JPG

 
좋습니다, 잘 나오는군요.  이제 나중에 카드 데이터를 만들고 그 데이터를 읽어와서 저기서 나온 카드 번호와 데이터를 대조해서 해당하는 카드를 선택하는 코드를 만들면 됩니다. 나중에!

지금은 못만들어요. 데이터를 읽어오는 방법을 모릅니다. 공부할게 너무 많군요. 마찬가지로 Kunggom님이 알려주신 클래스 라는 것도 공부해야하고 함수 만드는 것도 공부해야하고, 데이터 읽어오려면 csv파일을 읽어오는 기능을 찾아야하는데 이건 아직 못찾아봤습니다. 해야할게 너무 많네요...



3일차 6 급히 수정가챠 알고리즘 만들기.JPG



방금 게시글을 쓰다가 찾아냈습니다. 카드번호가 range(star_get)으로 해놓으면 0~x라는 식으로 되기 때문에 수정해줍니다. 지금 발견 못했으면 나중에 데이터 만들어서 적용할 때 한참 해맸을 거 같네요.




3일차 5 가챠 알고리즘 만들기.JPG

 



3일차 5-1 가챠 알고리즘 만들기.JPG

 



 

본 프로그램에다가 추가하면서 뽑는게 끝나면 다시 상점 창으로 이동하도록 한 뒤 다시 실험해 봅니다 지금 보니 문제가 또 하나 보이네요. runnumber가 초기화가 되지 않아서 다음번 뽑기 때 문제가 생길지도? 라고 생각했는데 실제로 반복해서 해보니 문제가 안생기네요. for 코드에 첨부되서 자동적으로 초기화 시키는 듯 합니다. 넘어갑시다.



다음은 Kunggom님의 조언으로 딕셔너리 변수를 이용해 if문을 대폭 줄여보겠습니다.



3일차 1 딕셔너리로 if문 줄이기.JPG



메이화면의 if 코드를 없애버리고 입력 값에따라 딕셔너리에서 변수를 읽어오도록 변경했습니다. 사소하지만 p변수를 phase 변수로 헷깔리지 않도록 구체적으로 만들었습니다. 이또한 그분의 조언이십니다. 근데..여기서는 뭔가 혹때려다가 혹붙인 느낌이 나는군요. 그러나! 



3일차 1-2 딕셔너리로 if문 줄이기.JPG



여기서부터는 확연히 차이나기 시작합니다! 1~6지역까지 모두 만들어줬던 if/elif 코드가 하나로 통합되고 딕셔너리 변수로 가져오도록 바꿔습니다. 입력값이 딕셔너리에 없는 b나 f일때는 읽어오지 않도록 try/except 코드를 사용합니다. 많이 줄었군요. 실험해 보니 잘 됩니다. 이쯤되니 욕심이 조금 나서 while 문도 조금 줄여보도록 하겠습니다. 



3일차 3 while과 if elif문 줄이기.JPG

 

1~6지역을 각각 while 문으로 제어해 주었던 것을 while문을 없애버리고 변수를 설정해서 집어넣어 줍니다. 되돌아가는 b를 입력시 while문을 중지시켜 버리는 break 코드도 사용!



3일차 3-2 while과 if elif문 줄이기.JPG

 

탐색 방식도 딕셔너리를 사용해서 샤샤샥 수정해줬습니다. 크...코드의 줄 수가 엄청 줄었습니다. 백몇십줄 되던 길이가 대강 백줄 내외로 변했군요.

구동해보니 잘 돌아갑니다. 그러나, 메인화면에 좀 문제가 있었군요. 메인화면에 잘못된 입력을 했을때 오류가 떠버리네요. 잘못된 입력을 무시할 수 있도록 try/except 코드를 사용해서 수정해줬습니다.


3일차 3-3 딕셔너리로 if문 줄이기.JPG

 
완벽합니다. 후...사실 탐색 부분도 조금 더 진행해고 싶었지만 당분간은 클래스나 데이터 읽어오는 방법 등 코딩 공부를 병행 해야할 것 같아서 코딩부분의 진도가 늦어질 것 같네요.

코딩은 여기까지 하도록 하겠습니다.



-----------------


게임 기획 입니다. 오늘은 짧습니다. 카드랑 전투 시스템을 짜고 있는데 서로 연동된 부분이 많아서 좀 복잡하네요. 덕분에 아직 진도를 못나가고 있습니다. 그래서 오늘은 재화에 대해서 짧게 말씀드리고 마치도록 하겠습니다.



재화는 현재 기획상으로 3가지가 있습니다


 


소지금, 특수재화, 진화 포인트입니다.


 


 


첫번째. 소지금. 


 


 소지금은 기본적인 재화 입니다. 카드를 강화 하거나 아이템, 스킬로 변환 시킬 때 등등 다양한 용도로 사용됩니다. 획득방법은 획득한 카드를 팔거나 탐색에서 특수타일 중 하나인 재화집적소를 찾거나 전투에서 승리했을 때 얻을 수 있습니다. 임무를 통한 습득의 경우 아직 생각해놓은 것이 없기 때문에 추후로 미뤄두겠습니다.


 


두번째. 특수재화.


 


 아직 특수재화의 이름이 결정되지 않아서 특수재화로 표현했습니다. 특수재화는 말 그대로 특수한 용도에 쓰이는 재화입니다.  4~6등급 가챠와 고강화, 특이점 진화, 그 외에 추가될 특수한 사항에 들어가는 용도로 쓰이게 됩니다. 획득방법은 탐색에서 특수타일 중 하나인 재화집적소를 찾거나 카드를 판매했을 시 미량 획득 가능합니다


 


세번째.  진화 포인트.



 진화 포인트는 오로지 진화에만 사용되는 재화입니다. 진화 탭에서 카드를 갈아서 획득하거나 탐색에서 특수타일 중 하나인 진화의 알을 획득했을 때 얻을 수 있습니다.


 




 재화의 수급에 대해 현재 여러가지 고민 중에 있습니다. 임무 시스템의 도입이나 각 재화들을 다량으로 지급하는 특수카드 또한 고려 중이니 이것은 나중에 확정되면 따로 설명드리겠습니다.




이상입니다. 




코딩 공부하랴, 코딩하랴, 게임 기획하랴, 할게 정말 많네요...나중에 본격적으로 게임 데이터 작성까지 들어가게되면 하루에 할 수 있는 분량은 더 줄어들게 되겠군요. 그래도 완성까지는 쭉 달려보고싶네요.




보아주셔서 감사합니다. 조언은 언제나 환영입니다! 




ps.오늘부터는 주말이나, 모두들 아시다시피 쉬는 날이 되면 몸이 더 늘어져서 아무것도 안하게 되는 관계로 양은 더 줄어들 수도 있습니다.




 


 







  • 17.87Kbytes
0
로그인 후 추천 또는 비추천하실 수 있습니다.

댓글목록 4

Kunggom님의 댓글

profile_image
<p>오오, 엄청 빨리 적용하셨군요! 딕셔너리는 다른 언어에서는 해시 테이블 또는 연관 배열 등으로 불리는 자료구조로, 굉장히 유용하지요. 몇 가지 조언을 추가로 드리겠습니다.</p>

<p><br />1. 특정 아이템에 대해 당첨 확률을 적용하는 것은 간단하게 구현하면 정말 간단합니다. <a href="https://gigglehd.com/gg/4461599" target="_blank">https://gigglehd.com/gg/4461599</a> 이 글의 초반부에 나오는 설명과 코드를 보세요. 다만, 해당 글의 댓글에서도 나와 있지만 이런 방법은 정말로 확률에 목숨거는 게임에서는 사용할 수 없습니다. 즉, 실제로 서비스되는 가챠게임에서는 좀 더 정교한 방법을 사용합니다.</p>

<p><br />2. [csv 파일을 읽어온다]는 것은 [파일을 읽어온다]와 [데이터를 csv 형식으로 해석한다]는 2가지 단계를 거쳐야 하는 것입니다. 파일을 읽어오는 것은 파이썬 내장 <code>open()</code> 함수만으로도 충분하지요. 뭐 파일을 한번 열었으면 나중에 반드시 닫아주고 그런 건 필요하지만, 관련 자료는 인터넷에 많이 있으니 별 걱정하지 않으셔도 됩니다. 그런데 그렇게 해서 읽어온 파일은 그대로는 사용하기 힘들기 때문에, 프로그램 내에서 사용할 수 있는 자료 구조로 해석하는 과정을 거쳐야 합니다. csv 정도로 간단한 형식이면 그 부분을 직접 작업할 수도 있지만, 라이브러리를 사용할 수도 있습니다. csv의 경우 파이썬에 기본으로 내장된 라이브러리도 있고 직접 다른 라이브러리를 설치하여 사용할 수도 있는데, <b>어쩌면 자기가 작업하는 것보다 라이브러리를 사용하는 편이 처음에는 훨씬 복잡하게 느껴질 수도 있어요.</b> 하지만 라이브러리의 기능을 갖다쓰는 방법을 익히는 것도 좋은 공부라고 생각하므로, 한번 잘 생각해보시기 바랍니다.</p>

<p><br />3. 파이썬과 같은 고급 언어에서는 <b>배열이나 딕셔너리와 같은 자료 구조 안에 다른 배열이나 딕셔너리, 심지어는 함수조차 넣을 수 있으며, 필요하다면 종류를 섞어서 넣을 수도 있습니다.</b> 지금 보니까 딕셔너리 안에 배열을 넣는 정도는 이미 적용하신 부분도 있는데, 좀 더 다양한 응용 또한 가능하니까 참고하세요.</p>

라르트님의 댓글의 댓글

profile_image
라이브러리라...한번 찾아봐야겠네요. 안그래도 csv 형식을 읽어오는 거에대해서 고민이 조금 있었는데 감사합니다.

이에나군님의 댓글

profile_image
잘 보고 갑니다. 참고로 가챠를 만드실 때 tuple로 (0,1,2,,,999) 를 만드신 후 random의 choice 함수를 사용하셨는데요, random의 randint(0,999) 함수를 사용하면 같은 효과를 낼 수 있습니다.

<div>그리고 이런 세세한 프로그램을 짜보는 것도 좋지만 전체적인 outline을 pseudocode로 먼저 한 번 써보는 것도 꽤 도움이 될 겁니다.</div>

라르트님의 댓글의 댓글

profile_image
인터넷에&nbsp;<span style="font-family: gulim">pseudocode를</span>&nbsp;찾아보니 의사코드라고 나오는군요. 잠깐 살펴보니 전체적인 프로그램을 짤 때, 꽤 유용한 기법 같습니다. 한번 작성해 보겠습니다.
전체 2,254 건 - 41 페이지
제목
라르트 2,089 2 2019.03.19
셍튜므 1,403 0 2019.03.17
라르트 1,215 1 2019.03.17
라르트 1,673 0 2019.03.16
라르트 2,181 1 2019.03.15
허무정 1,828 0 2019.03.14
라르트 1,908 0 2019.03.14
라르트 1,558 0 2019.03.12
Kunggom 1,832 2 2019.03.10
타노스 1,387 0 2019.03.10
싸볫쓰끼싸유쓰 1,684 0 2019.03.02
젝카 1,819 0 2019.02.28
AMN연호 1,874 0 2019.02.28
닥터회색 2,096 3 2019.02.28
플라잉란코 1,428 0 2019.02.25