로그인회원가입  | 마이페이지 대화방IRC디스코드LAB운영자에게타입문넷 RSS  접속자 : 323 (회원 225) 오늘 22,591 어제 29,797 전체 94,131,955  
총 게시물 2,890건, 최근 0 건
   
[잡담]

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

글쓴이 : 라르트  (59.♡.227.173) 날짜 : 2019-03-15 (금) 12:08 조회 : 648
안녕하세요, 라르트입니다.

오늘은 본격적으로 코딩작업에 들어갑니다. 아무것도 몰라서 책과 인터넷을 뒤져서 어찌어찌 만들었습니다. 코딩하는데 파이썬 자체툴보다는 비쥬얼 스튜디오 코드라는 것을 쓰라는 말을 들어서 그것을 사용했습니다.

어제 이야기한대로 메인화면을 만들어보겠습니다. 텍스트 게임이라 글자 몇개 출력하는게 다이니 그다지 어렵지 않을겁니다.

2.JPG
 
메인화면에는 플레이어 이름과 레벨, 경험치, 기본재화인 소지금을 표시합니다. 또한 탐색, 상점, 상태의 각 시스템을 사용할 수 있는 탭으로 이동하는 기능도 있습니다. 프로그램이 루프할 수 있도록 while 코드를 이용해줍시다. 
 
2-1.JPG
 
오류네요...?
아... if 코드를 사용해서 변수의 조건을 확인할 때 문자는 ' ' 사이에 넣어줘야 한다는 것을 깜빡했군요. 다행히 스튜디오에서 바로 잡아주네요 좋습니다.

2-2.JPG
 
4-1.JPG
 
좋아. 잘 됐습니다.
다음은 메인화면에서 각 기능 탭으로 넘어가는 기능을 구현합니다. 입력값에 따라서 변수 p가 변화하도록 만들어놨으니 while 코드를 사용해 각 값일때 해당 탭의 코드가 루프하도록 만듭니다.
 
3.JPG
 
3-1.JPG
 
3-2.JPG
 
자, 실행해봅니다.
4-1.JPG
 
탐색 탭으로 이동합니다.

4-2.JPG
 
4-3.JPG
 
좋아, 잘 됐군요. 이제 메인화면으로 다시 이동합니다.

4-4에러.JPG

...또 에러. 이번에는 스튜디오에서도 안가르쳐 주네요.
...
....(약 20분의 시간이 흘렀다.)
.....
보아하니 에러가 아니라 프로그램이 종료된 듯 합니다. 
전체 브로그램을 루프시키기 위해 start 변수를 만들어서 while 코드로 다시 돌려줍니다. 

4-4에러 해결.JPG
 
4-5.JPG
 
4-6.JPG
 
4-7.JPG
 
좋아, 성공이네요. 근데 화면 전환의 구분이 힘드네요. ---------을 추가해서 구분을 쉽게 합시다.

4-8.JPG
 
4-9.JPG
 
크...좋군요. 이제 구분하기가 한결 수월해졌습니다.

사실 이정도면 목표한 분량은 끝이 났지만 조금 욕심을 부려 조금만 더 해봅시다.

탐색의 각 지역들을 선택해 들어갈 수 있게 해줍니다. 마찬가지로 입력값에 따라 p값이 변하게 해놨으니, while 코드로 구분한 뒤, 각 지역에서 2차 지역을 선택할 때에는 탐색 방식을 선택하는 동시에 맵 데이터를 읽어올 수 있도록 입력값에 따라 두개의 변수를 바꾸도록 해줍니다.
탐색방식은 어느 지역이나 똑같을 테니 모두 한 곳으로 향하도록 합니다(각각의 지역 코드 하위에 일일이 집어넣다가 끝날때 쯤 깨달음을 얻고 수정한건 비밀입니다.)

5-1.JPG
 
1~6지역이 map변수 값만 다르지 모두 저렇게 짜여져있습니다.

자, 탐색방식 선택하는 것도 만들어 두죠. 오늘은 여기까지 할겁니다.
6-1.JPG
 
.....이상한거 발견하셨나요? 3을 입력했을때의 변환이 이상하군요. 거기다 입력값도 선택지에 비해서 하나가 많아요. 스크린 샷 찍고 시험구동이 끝날 때까지 모르다가 찍은 스크린샷 확인하다가 알아차렸습니다.
급히 수정해줍니다.
6-1-1.JPG
 
시험구동
6-2.JPG
 

 
6-3.JPG
 
6-4.JPG
 
문제 없네요.

자, 진자 여기서 끝내려고 해쓴데 위의 문제를 수정하다가 거슬리는 것을 한가지 발견했습니다.
7-1.JPG
 

아시겠나요?

탐색, 상점, 상태 탭이 탐색의 지역 탭과 같은 위상에 있습니다. 저렇게 되면 상점탭을 가기위해 메인화면에서 s를 입력했을 때, 컴퓨터가 탐색 탭을 확인하고 바로 상점 탭을 확인하러 가는게 아니라 1~6지역에다가 탐색 방법 탭까지 전부 확인하고 이동하게 됩니다. 물론 몇개 안되기 때문에 순식간이긴 하겠습니다만, 굳이 확인할 필요 없는걸 확인하게 할 이유는 없지요. 진~짜 마지막으로 고쳐줍시다. explore 변수를 추가하여 메인화면에서 입력시 해당값을 1로 바꾸고 탐색탭은 이 값이 1일때 활성화 되도록 합니다. 그리고 1~6지역 탭과 탐색방식 탭을 탐색 탭의 하부로 옮겨줍니다. 
7-2.JPG

이게 말로는 간단한데, 실제로 할려면 스페이스바를 미친듯이 눌러줘야하는 쓸대없이 귀찬은 작업이네요. 어쨋든 훌륭하게 됐습니다. 나머지 상점탭과 상태 탭도 탐색과 마찬가지로 p변수가 아니라 다른 변수를 사용하도록 수정할겁니다. 코딩은 여기서 진짜 진짜 끝입니다.

-----

다음은 게임 기획입니다. 오늘은 성장에 대해서 구상해 본것을 설명하겠습니다. 성장은 상태탭에 들어가서 할 수 있는데요. 본 게임의 성장방법은 카드의 레벨을 올리는 것을 제외하고 4가지를 생각하고 있습니다 카드의 레벨은 나중에 전투시스템이나 카드에 대한 설정을 완료했거나 어느정도 정리가 됐을때 설명하겠습니다. 

우선, 성장방법 4가지에는 진화, 강화, 스킬, 아이템이 있습니다.

이 모든 성장은 가챠를 필요로 합니다. 이게임은 가챠를 위한 개돼지 게임이기 때문이죠.

성장 시스템.jpg

 
 첫번째. 진화


 진화는 진화 포인트와 같은 등급의 카드(Lv max) 두 장을 소모하여 각 카드의 다음등급 카드 중 임의로 하나를 획득할 수 있게 합니다.


 진화 포인트는 카드를 갈아서 획득합니다. 획득하는 진화 포인트는 각 카드의 등급별로 차이가 있습니다. 구체적인 수치는 아직 미정입니다.

진화.jpg
 

각 진화에는 특이점이 3개 존재합니다. 3->4, 6->7, 7->8입니다.

3->4 는 넘어갈 때에는 진화시키는 카드의 태그 중 하나의 태그가 임의로 선택되어 해당 태그에 해당되는 카드 중 하나로 진화하게 됩니다.

6->7 은 마찬가지로 진화시키는 카드의 태그 중 하나의 태그에 해당하는 카드 중 하나로 진화하게 되는데 이때의 태그를 플레이어가 선택할 수 있습니다.

7->8 은 조합을 통해 진화하게 됩니다. 진화하는데 대량의 포인트와 3~5 개의 필요 카드가 존재합니다.

 


 두번째. 강화


강화는 동일 카드와 재화를 소비하여 가능합니다. 각 카드에 +1, +2 등의 숫자가 붙습니다. 강화는 특정 수치에 +를 줍니다. 높은 강화는 높은 등급의 카드와 동일 혹은 더 뛰어넘을 수 있을 정도의 수치를 부여해줍니다. 강화의 한계는 현재까지 정해놓은 바가 없습니다. 현재까지 설정으로는 무한히 강해질 수 있습니다. 다만 +3강을 위해서는 +2강 두장이 있어야하기에 갈수록 강화난이도는 기하급수적으로 높아지겠죠. (최소한의 온정으로 강화확률은 넣지 않겠습니다.)

강화.jpg
 

 

 세번째. 스킬


카드는 해당 카드를 획득할 때 기본 스킬’ 1개를 지니고 있습니다. 해당 카드만 지니고 있는 스킬일 수도 있고 범용 스킬일 수도 있습니다. 동일한 카드라 하여도 동일한 스킬을 지니고 있다는 보장은 없습니다. 카드는 고유의 스킬과 범용 스킬의 풀에서 임의의 스킬을 한 개 지니고 있는 것입니다.

그러나 이 기본 스킬을 해당 카드는 사용할 수 없습니다.

각 카드들은 3개의 습득 스킬을 사용할 수 있는데, 이 스킬은 다른 카드의 기본 스킬을 변환 하여 습득 가능합니다. 만일 해당 카드의 기본 스킬을 해당 카드로 사용하고 싶으시다면 다른 카드가 지닌 똑같은 기본스킬을 변환하여 해당 카드에 습득시켜야 합니다.

기본 스킬을 변환 시켰을 때, 해당 카드는 소멸합니다.

습득 스킬 슬롯은 카드 Lv에 따라 개방됩니다.

 

 

네번째. 아이템


카드는 획득했을 때, 확률적으로 특정 아이템을 지니고 있을 수 있습니다.(기본 스킬과 다르게 카드는 아이템을 가지고 있지 않을 수도 있습니다.) 이 아이템은 각 카드에 따른 고유 아이템과 태그에 따른 아이템 중 하나입니다.

아이템은 스킬과 다르게 획득 당시에 지니고 있다 하더라도 바로 적용됩니다만, 추출 시에는 마찬가지로 해당 카드는 소멸합니다.

각 카드 당 아이템 소지 한계는 스킬과 마찬가지로 3개입니다. 카드 Lv에 따라 개방됩니다.


이상으로 성장에 대한 어렴풋한 설정은 완료했습니다. 다음에는 재화와 카드에 대한 설정 그리고 이번에 하지 못한 전투 시스템에 대한 설정을 하도록 하겠습니다. 

보아주셔서 감사합니다.


63.34 Kbytes

Kunggom (218.♡.232.194) 2019-03-15 (금) 15:16

흐음, 혹시 함수 개념이나 자료구조 중에서 딕셔너리에 대한 개념, 오류처리 개념, 클래스 개념은 배워보셨나요?

이 개념들을 알고 있으면, elif문 도배나 while문 도배를 줄일 수 있습니다. 예를 들면, 파이썬에서는 딕셔너리를 통해 다른 언어의 switch case문과 같은 일을 할 수 있지요. switch case문은 elif문(다른 언어에서는 else if문)을 계속 나열해야 할 때 대신 써먹는 기능이라고 보시면 됩니다.

그리고, 변수의 이름은 가급적 너무 짧게 짓지 않는 것이 좋습니다. 알파벳 한 글자로 p라고 쓰면 처음에는 편할지는 몰라도, 프로그램 크기가 커지면 점차 골치아픈 일이 생기게 될 겁니다. 뜻을 명확하게, 이를테면 phase와 같이 적는 편이 더 낫지요.

댓글주소
     
     
라르트 (59.♡.227.173) 2019-03-15 (금) 16:05
오, 그런게 있었군요 책과 인터넷을 한번 뒤져봐야겠습니다. 변수 이름은 확실히 말씀하신대로일거 같네요. 수정하도록 하겠습니다. 감사합니다.
댓글주소
PlasticCat (125.♡.18.176) 2019-03-15 (금) 19:25
가챠아-어서 가챠를 돌려야만!
댓글주소
     
     
라르트 (59.♡.227.173) 2019-03-16 (토) 14:11
그래서 가챠 알고리즘을 얼른 만들었습니다.
댓글주소
그대가시는대… (112.♡.12.150) 2019-03-15 (금) 20:31
그아아앗... 코딩을 그만둔지 5년... 고통이 몰려온다... 보기만해도!
댓글주소
     
     
라르트 (59.♡.227.173) 2019-03-16 (토) 14:12
그대 또한 도전해보심이 어떠신지
댓글주소
Kunggom (218.♡.232.194) 2019-03-15 (금) 23:17

저녁 먹으면서 이런 걸 나보고 하라고 한다면 무슨 결과물이 나올지 궁금하여 대충 시도해 봤는데, 별로 좋은 결과물은 안 나오네요.

#외부 라이브러리 들여오기
import re
from collections import OrderedDict

# 전역 변수
menu = OrderedDict()
area = {}
character = {}
system = {}
running = True

# 메뉴 클래스
class Menu:
def __init__(self, name, input_list, select_msg, is_need_sort, method_name):
self.name = name
self.list = input_list
self.isSort = is_need_sort
self.selectMsg = select_msg
self.method = method_name
# 새로 만든 메뉴를 목록에 추가
global menu
menu[name] = self

def run(self):
print(self.selectMsg)
if self.isSort == True:
list_name = natural_sort([key for key in self.list])
else:
list_name = [key for key in self.list]
for i, j in enumerate(list_name):
print(f"{i+1:>4}: {j}")
try:
num = int(input("번호 선택 (나가려면 0): "))
if 0 < num <= len(list_name):
select = list_name[num - 1]
print(f"{select}을(를) 선택하셨습니다.")
print_delimiter()
# 입력받은 메소드 이름에 따라 객체를 선택하여 메소드 실행
obj = self.list[select]
func = getattr(obj, self.method)
func()
except:
print("나가기를 선택하셨습니다.")
return None

# 게임 종료 구현
class System:
def __init__(self, name):
global system
system[name] = self

def exit(self):
global running
running = False

# 캐릭터 클래스
class Character:
# 캐릭터 생성시 이름만 받으면 레벨, 경험치, 소지금은 모두 0으로 설정
def __init__(self, name, level = 0, exp = 0, gold = 0):
self.name = name
self.level = level
self.exp = exp
self.gold = gold
# 새로 만든 캐릭터를 목록에 추가
global character
character[name] = self

def printStatus(self):
str = f"이름: {self.name}, 레벨: {self.level}, 경험치: {self.exp}, 소지금: {self.gold}"
print(str)

# 지역 클래스
class Area:
# 지역 초기화
def __init__(self, **entries):
self.__dict__.update(entries)
name = entries["name"]
# 새로 만든 지역을 목록에 추가
global area
area[name] = self

# 자연스러운 순서 정렬 구현 함수
# https://stackoverflow.com/a/4836734
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(l, key = alphanum_key)

# 화면에 줄 치기
def print_delimiter():
print("-" * 80)

# 메뉴 정의
main_menu = Menu("메뉴", menu, "무엇을 하시겠습니까?", False, "run")
explorer = Menu("탐색", area, "탐색할 지역을 고르세요.", True, "func")
status = Menu("상태", character, "상태를 확인할 캐릭터를 고르세요.", True, "printStatus")
game_exit = Menu("종료", system, "게임을 종료하시겠습니까?", False, "exit")
exit_menu = System("게임 종료")

# 지역 정의
def area1_func():
print("1지역으로 들어왔습니다.")

def area2_func():
print("2지역으로 들어왔습니다.")

def area3_func():
print("3지역으로 들어왔습니다.")

Area(name = "1지역", func = area1_func)
Area(name = "2지역", func = area2_func)
Area(name = "3지역", func = area3_func)

# 게임 시작
print("게임을 시작합니다.")
input_str = input("캐릭터의 이름을 입력해 주세요: ")
player = Character(input_str)
player.printStatus()

def main():
while running:
main_menu.run()

if __name__ == '__main__':
main()

이런 종류의 프로그램은 처음 짜보는 것인데, 생각보다 까다로운 점이 많은 것 같습니다. 내공이 모자라당…

댓글주소
     
     
라르트 (59.♡.227.173) 2019-03-16 (토) 14:11
눈이 빙글빙글 도는 군요. 코딩에 쓰인 코드들이 어떤건지조차 모르니, 이 프로그램이 어떻게 돌아가는 건지 이해가 안되네요.
좀더 공부하자...ㅠㅠ

근데 궁금한게 저렇게 코딩하면 프로그램이 꺼지지 않고 돌아가나요? while 문이 하나도 안보여서 그냥 꺼져버릴거 같은....?
댓글주소
          
          
Kunggom (218.♡.232.194) 2019-03-16 (토) 19:02
잘 보시면 while문은 맨 아랫줄 인근에 나와 있습니다. 맨 밑에서 4~5번째 줄을 살펴보세요.
댓글주소
닥터회색 (211.♡.121.27) 2019-03-16 (토) 21:32
어디에 컴맹  요소가....이것은 기만안가....케지메 안건이 아닌가
댓글주소
     
     
라르트 (183.♡.229.4) 2019-03-17 (일) 15:33
정말로 프로그래밍 이라는 것을 배운지 3일째 된겁니다 그 전까지는 프로그램 깔고 지우는 거밖에 못했어요.
댓글주소
2ndEdition (14.♡.241.233) 2019-03-17 (일) 21:42
자 이제 컴맹을 보여주시죠. 
댓글주소
     
     
라르트 (59.♡.227.173) 2019-03-19 (화) 00:58
잘 살펴보세요. 지금 제가 하는건 수학의 알고리즘 입니다. 컴맹이라 프로그램 언어같은건 진짜 처음부터 공부하고 있어요!
댓글주소
☞특수문자
hi
   

총 게시물 2,890건, 최근 0 건
번호 제목 글쓴이 날짜 추천 비추천 조회
2860 [잡담]  목마른 나머지 우물팝니다. 컴맹의 게임제작기-6.1- +2 hot 라르트 03-28 0 1 398
2859 [잡담]  현재 AA게시판에서 쓰고 있는 시리즈물에 bgm을 추가했습니다. +4 link hot 플라잉란코 03-26 0 2 430
2858 [잡담]  모바일로 창작 게시판 쪽도 최신글 모아볼 수 있게 욌었으면.... +2 hot MIXIE 03-24 0 0 432
2857 [잡담]  창작 게시판/이 사이트 활성화 방안을 떠올려보았습니다. +14 hot 플라잉란코 03-24 0 9 609
2856 [잡담]  요즘 창작 게시판이 전체적으로 침체되어 있는 것 같네요. +12 hot 황제의철퇴 03-23 4 0 819
2855 [잡담]  복선 깔기의 즐거움 +3 hot 인서울 03-22 0 0 454
2854 [잡담]  [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-6- +6 hot 라르트 03-20 0 0 396
2853 [잡담]  [Lawmaker Guardian 관련]루트에 대한 결과에 대해..... hot 김기선 03-19 1 0 244
2852 [잡담]  [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-5- +11 hot 라르트 03-19 2 0 276
2851 [잡담]  아무래도 저는 글 쓰는게 까다로운 타입인가 보네여.. +4 hot 셍튜므 03-17 0 2 387
2850 [고민]  꿈을 너무 크게 잡고 시작하는건가... +1 hot JucundaBibliotheca 03-17 1 3 287
2849 [잡담]  [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-4- +4 hot 라르트 03-17 1 0 245
2848 [잡담]  [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-3- +4 hot 라르트 03-16 0 0 247
2847 [잡담]  [이미지 데이터 주의] 목마른 나머지 우물팝니다. 컴맹의 게임제작기-2- +13 hot 라르트 03-15 1 0 649
2846 [잡담]  드디어 얼추 전환점을 넘었네요. +2 hot 허무정 03-14 0 1 383
처음  1  2  3  4  5  6  7  8  9  10  다음  맨끝
Powered by Sir OpenCode 마이위트 DNS Powered by DNSEver.com 통큰아이
광고·제휴문의  |  이용약관  |  개인정보취급방침  |  책임의한계와법적고지  |  이메일주소무단수집거부  |  운영자에게  |  사이트맵(XML) 
타입문넷
SINCE
2003. 12. 25
타입문넷에 게재되는 모든 컨텐츠의 저작권은 해당 저작권자에게 있습니다.
타입문넷에 등록 된 모든 게시물의 권리와 책임은 해당 게시물의 게시자에게 있으며,
게시물에 의해 발생하는 문제에 대해 타입문넷은 일체 책임지지 않습니다.

타입문넷의 로고 및 배너는 백묵서체연구소의 0020-!백묵-갈잎체(견중) 서체를 사용중입니다.



Copyright ⒞ 2007 TYPEMOON.NET All Rights Reserved.
SSL certificates