------

[ AD ] Port Monitor ( Try to use a Best WebSite Monitoring Tool )

------

'온라인게임 > SRPG' 카테고리의 다른 글

네버엔딩 사가 2007.11  (0) 2010.10.02






'온라인게임 > SRPG' 카테고리의 다른 글

국대 최대 온라인 TCG  (0) 2010.10.02

[공격자 준비

-자신의 덱을 자신의 오른쪽에 놓은후 덱에서 6장의 카드를 핸드로 가져옵니다.
- - 매턴의 시작마다 핸드의 카드가 6장이 되도록 모자란 카드를 덱에서 핸드로 가져옵니다.

- 매터의 시작마다 LP(지형을 내려 놓을 수 있는 포인트)를 1씩 증가 시킵니다.
- 공격턴에 지형을 놓고, 유니트, 마법을 놓고, 아이템을 유니트에 장착시키는 등의 행동을 하고
   자신이 원하는 순서로 배치 시킵니다.
- 공격 플레이어는 마법 소환시에는 뒷면으로 깔아 놓습니다.
- 공격 플레이어는 유닛과 아이템 지형앞면으로 놓게 됩니다.
- 공격 플레이어는 배치를 완료한후 방어 플레이어에게 "준비 완료"라고 알려줍니다.

*** 준비 완료 전에 어느 시점이라도 카드를 소각( 무덤에 버리는 일)을 할 수 있습니다.
      (소울을 사용한 지형은 소각불가)

[방어자 준비

- 방어턴에 지형을 놓고, 유니트, 마법을 놓고, 아이템을 유니트에 장착시키는 등의 행동을 하고 자신이 원하는
  순서로 배치 시킵니다. ( 지형->유니트->마법->아이템(유니트) )
- 마법은 뒷면으로 놓고, 나머지 카드는 앞면으로 놓습니다.
- 배치를 완료한후 "준비 완료"라고 알려 줍니다.

[배틀 시작
= 공격 처리 턴(배틀 턴)

0 유니트 vs 유니트 
   유니트와 유니트가 대치 하게 되면 공격 유니트의 공격이 먼저 있게 됩니다.
   방어 유니트가 공격을 버티었다면 반격을 하게 됩니다.

0 마법 vs 마법
   마법과 마법이 대치하게 되면 레벨이 낮은 마법이 먼저 발동 됩니다.

0 마법 vs 유니트
  마법과 유니트가 대치하게 된 경우에는 어느쪽이든 마법카드가 먼저 필드에 올라가 발동하게 됩니다.
  그 후에 유니트 카드는 다음 카드와 대치하게 됩니다.

0 유니트 vs 없음
  공격하는 유니트를 방어할 마법이나 유니트 카드가 없는 경우에는
  공격자 유니트는 자신의 레벨(소환소울)만큼 덱의 카드를 파괴합니다.

*** 전투시 카드의 공격/발동 순서를 확인하세요
     상대의 덱 카드를 전투중에 0장까지 파괴하면 이기게 됩니다.

- 자신이 배치했던 마법 카드를 뒷면에서 앞면으로 바꾸어 공개합니다.
- 자신이 배치한 순서대로 유닛과의 전투를 실행합니다.
- - 공격하는 유닛은 공격턴에 한번의 공격만 실행합니다.
- - 방어하는 유닛은 자신이 파괴되는 순간까지 방어를 실행합니다.
- - 유닛과의 전투에서 코인을 이용하여 유닛의 바뀐 능력치를 적용합니다.(코인은 1회만 적용)
- 마법의 발동은 유닛의 행동보다 먼저 실행합니다.
- - 마법의 발동은 작은 레벨의 마법이 먼저 발동하게 됩니다.
- - 공격 마법과 방어 마법의 레벨이 같은 경우는 공격 마법이 먼저 발동되게 됩니다.
- - 공격 마법의 레벨이 크고 방어 마법의 레벨이 작은 경우 방어 마법이 먼저 발동되게 됩니다.
- - 공격 마법의 레벨이 작고 방어 마법의 레벨이 큰 경우에는 공격마법이 먼저 발동되게 됩니다.

[소울 코스트
- 소울코스트 단계에 유지비를 지불하는 유닛의 소울 코스트를 지불합니다.
- 소울코스트 단계에 유지비를 지불하지 못하면 지불하지 못하는 수만큼 덱을 소각장애 버립니다.
   (라이프제 인 경우 라이프를 감소시킵니다.)
- 덱수와 라이프를 체크합니다.

[턴 종료처리
- 공격과 방어를 전환합니다.
- 턴수를 1 증가 시킵니다.(마법에 의해 턴수 변경의 효과를 받은 경우 이 시점에 적용 합니다.)
- 승리와 패배의 조건을 검토하고 처리합니다.(공격자 시작시 먼저 자신의 손에 받을 카드가 없으면 패배하게 됩니다.)

[온라인과 다른점
1. 사용한 지형은 오른쪽으로 꺽어서 표현
2. LP와 턴증가 표기는 종이와 연필을 이용
3. 마법의 사용은 뒷면으로 소환 시킨뒤 배틀시 공개
4. 공간의 제약

  - 프론트 필드 : 마법, 유닛,아이템등을 소환하여 전투를 치르는 주 전장을 말합니다.
                       (프론트 필드는 5장까지만을 한번에 놓을 수 있습니다.)
  - 백 필드 : 소울의 원천이 되는 지형을 내려 놓는 곳을 말합니다.
                  (백 필드에는 지형을 10장까지만 놓을 수 있습니다.)
  - 핸드 : 마스터가 사용하는 마법을 가지고 있는 곳을 말합니다.
             ( 핸드에는 카드를 6장까지만 가지고 있을 수 있습니다.)

'온라인게임' 카테고리의 다른 글

모바일 게임 기획  (0) 2010.10.05
WinSock 2 client server  (0) 2010.10.03
RPG 들  (0) 2010.10.02
온라인 게임 서버 프로그래밍 벤치마크 - jacking.tistory.com  (0) 2010.10.02
게임 서버  (0) 2010.10.01

RPG게임에는 크게 SRPG, MRPG로 구성

<RPG>
 는 Role Playing Game 의 약자이다.

우리나라 말로 역할수행(체험/대리만족)게임 이라고 할 수 있다.
여러가지 게임 장르중의 하나이고 일반적으로 다른 게임 장르와 다음과 같은 차이점이 있다. 

1. 캐릭터가 성장한다. 보통 캐릭터의 레벨이 존재한다. 
2. 캐릭터의 직업구별이 뚜렸한 경우가 일반적이다. 그리고 직업에 따른 능력차이(속성,특기)도 뚜렷하다. 
3. 아이템으로 캐릭터의 능력치를 향상시킬 수 있다. (보완재)
4. 일정한 스토리(결말)를 가진다. 캐릭터의 자유도는 높은 편이고  캐릭터의 활동(선택)에 따라 스토리를 바꿀 수 있다. 
5. 다른 플레이어와 협력해서 스토리(결말)를 전개해 나갈수 있다.

<SRPG>
1) SRPG
풀이하자면 Simulation Role Playing Game을 말한다.
흔히 말하는 삼국지시리즈의 롤플레잉 게임인 영걸전, 공명전, 조조전 등이 이에 속한다.

이런 게임들은 게임을 진행해 나가면서 RPG의 기본 방식인 자기 캐릭들의 레벨업을 할 수 있어 롤플레잉 게임이긴 한데
전투에서 전략시뮬레이션의 특징이 강하게 나타나 SRPG 라 부른다.

정통 RPG와 달리 전투에 전략시뮬레이션의 형식을 도입한 것이 SRPG(Simulation RPG)이다.
캐릭터마다 이동력이나 공격, 마법의 범위 등과 같은 독특한 특성이 있고 캐릭들의 능력과 지형을 이용한 전략
사용한 전투를 즐길 수 있다.
국산RPG중에 가장 유명한 소프트맥스의 '창세기전'이 대표적인 SRPG라 할 수 있다.
이런 류의 게임들은 RPG의 특징답게 자기를 대신할 수 있는 어떤 역할들을 하는 캐릭들을 키울수 있다.
뭐 레벨업이 안되고 그냥 미션, 미션에 미션만 계속 되면
일반전략세뮬레이션과 뭐가 다르겠냐만은 그래서 시뮬레이션게임과의 차별성인
SRPG는 게임의 기본 방식은 롤플레잉의 형식을 취하고
전투는 시뮬레이션적으로 진행해 나가는 것이다
 

-MRPG에 대해.
2) MRPG

이건 내가 뭔지 몰라 인터넷 검색 좀 했는데 이 게임은 수동 RPG (MRPG - Manual RPG)라 한다.

수동 RPG라는 것은 말 그대로 사람이 직접 조작하는 RPG,

즉 사람이 모든 수단을 조절하고 상황을 진행시키며 결정하는 RPG를 말합니다.

보통 사람들이 TRPG(table-Talking RPG)라느니, 원래의 RPG라느니 하는 것들을 말합니다.

(제가 이 홈페이지에서 주로 다룰 것도 바로 이 수동 RPG를 말합니다.)

대표적인 예로 D&D(오락실의 그것의 원래의 것), AD&D, GURPS, 소드월드 등이 있습니다.

이런 설명이라면 요즘 거의 대다수 인터넷 온라인 롤플레잉 게임이 여기에 속한다.

리니지1,2 나 유저 본인이 스스로 캐릭을 거의 처음부터 끝까지 컴퓨터의 지시에 따르지 않고 키우는 게임이다.


http://user.chollian.net/~purhme33/rpg/rpg_is.html

purzo.egloos.com 

파랑매 / 푸르매


1. 자동 RPG (ARPG- Automatic RPG)

자동 RPG라는 것은 말 그대로 사람이 직접 조작하지 않아도 진행하는 RPG, 즉 컴퓨터나 전자게임기 등을 통해서 즐길 수 있는 RPG를 말합니다. 보통 말하는 RPG게임 이란게 이런 것이죠. 요즘은 이 자동 RPG들도 너무 많은 종류와 수준이 있어서 이런 말로밖에는 표현이 않되는군요.
대표적인 예로 FF(파이널판타지)시리즈, YS시리즈나 Ultima 시리즈,

근래의 예로는
Baldus' Gate (이것은 따로 설명을 하여합니다. 내용이나 게임의 설정등이 TRPG에서 온 것) 등이 있죠.

2. 수동 RPG (MRPG - Manual RPG)

수동 RPG라는 것은 말 그대로 사람이 직접 조작하는 RPG, 즉 사람이 모든 수단을 조절하고 상황을 진행시키며 결정하는 RPG를 말합니다. 보통 사람들이 TRPG(table-Talking RPG)라느니, 원래의 RPG라느니 하는 것들을 말합니다.
(제가 이 홈페이지에서 주로 다룰 것도 바로 이 수동 RPG를 말합니다.)

대표적인 예로 D&D(오락실의 그것의 원래의 것), AD&D, GURPS, 소드월드 등이 있습니다. 

3. TRPG ( Table-Talking RPG, True RPG)

여기서 말하는 알피지는 자동 알피지에 속하는 것이다.
이 용어는 처음에 일본에 알피지를 도입한 사람들이 기존의 PC나 게임기 게임
(너무나도 많이 RPG라고 불려서 사람들이 RPG라고 하면 이것을 생각하는!) 과 구분하기 위해서 만들었다고 합니다.

조어법은 Table-Talking RPG(하지만 저는 True RPG라는 쪽이 더 맞다고 생각합니다만.) 라고 억지로 만든 말이죠.
뭐 개념 설명에는 상당히 유용합니다만.


알피지란 수십년 전에 워게임(전쟁게임 - 전쟁의 상황을 상정하여 특정한 룰하에서 진행되는 게임, 체스등이 원형)에서 갈라져 나와서 만들어진 이 RPG라는 게임은 다른 게임과 달리 게임자가 하나의 개체에 이입하여 그 개채의 행동을 결정하는 것을 기본으로 하는 게임이다. (초기의 RPG의 기원에 관한 글은 하이텔 RPG동호회에서 한글 번역본을 구할 수 있다.)


[첨부파일]
D&D 3.5판용 아방스 시트 1.20N

HWP 버젼 D35ST120N.hwp
D35ST120N.hwp

'온라인게임' 카테고리의 다른 글

WinSock 2 client server  (0) 2010.10.03
오프라인 게임 절차  (0) 2010.10.02
온라인 게임 서버 프로그래밍 벤치마크 - jacking.tistory.com  (0) 2010.10.02
게임 서버  (0) 2010.10.01
개요  (0) 2010.09.22
2008.5 jacking.tistory.com 게임서버 소프트웨어




http://jacking.tistory.com/15

1. OS 및 일반 프로그래밍 관련

응용 운영 체제 개념(Applied Operating System Concepts)

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200302080008 )

: 책이 두꺼운 만큼 매일 조금씩 공부하기를 권합니다. 그리고 이 책을 보면 자료구조가 어떻게 활용 되는지도 알 수 있습니다.

 

CODE COMPLETE 2/E

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200504110013 )

: Coding과 관련된 것인데 개인적으로 필독서 라고 생각합니다. 이것도 두꺼우므로 매일 조금씩 보기를 권합니다.

 

Debugging Applications for Microsoft .NET and Microsoft Windows

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200403190013 )

: Windows 플랫폼에서의 디버깅에 대해서 잘 가르쳐주는 책입니다. 특히 덤프를 남기게 하는 방법과 보는 방법은 꼭 배워야 서버 비정상 종료가 되어도 문제를 찾아 낼 수가 있습니다.


2. Network Programming

UNIX Network Programming Vol.1 : The Sockets Networking API 제3

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200507010009 )

: 네트웍 프로그래머로 한번쯤은 봐야 될 책이라고 생각합니다. Socket의 구조의 프로그래밍 방법에 대해서 잘 나와 있습니다.

 

Network Programming for Windows 2/E (한국어판)

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200212040002 )

: Windows 플랫폼에서 네트웍 프로그래밍을 한다면 꼭 가지고 있어야 되는 책입니다. 특히 IOCP에 대해서 잘 나와 있습니다. 7장까지만 보셔도 좋습니다.

 

온라인 게임 서버 프로그래밍

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200611270001 )

: 게임서버를 어떻게 만들지 응용에 대해서 잘 나와 있는 책입니다. 이 책을 보면 게임서버를 어떻게 만들어야 될지 감이 잡히지 않을까 생각합니다.

 

TCP/IP 인터네트워킹 - 원리, 프로토콜, 아키텍처, 5

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200611240004 )

: 책도 두껍고 내용도 쉽지는 않지만 좋은 내용이 많습니다. 내용이 어려운 만큼 이 책을 보기 전에 좀 더 보기 쉬운 것으로 TCP/IP에 대한 지식을 쌓기를 권합니다.

 

Effective TCP/IP Programming: 네트워크 프로그램을 향상시키는 44가지 Tips

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200307110004 )

: TCP/IP 프로그래밍을 할 때 이슈가 될만한 것들을 대한 좋은 Tip이 나와 있습니다.




3. DB

소설처럼 읽는 DB 모델링 이야기

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200606010011 )

: DB에 대한 기본 지식과 모델링을 하기 전에 요구 사항을 어떻게 이끌어 내고 정리해야 되는 것 등도 나와 있었어 무척 좋습니다. 그리고 책의 내용도 딱딱하지 않게 잘 구성 되어 있습니다.

 

SQL SERVER 2005 완벽가이드

( http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200710050034 )

: , 중급자용 책으로 자세하게 나와 있습니다. 다만 간혹 기본적인 부분에 대한 설명이 없었어 조금 난감할 때도 있습니다. 2005에 대한 것 중 가장 초급자용으로는 괜찮은 책이라고 생각합니다.




'온라인게임 > vc++' 카테고리의 다른 글

C++ Beginner's Guide 2  (0) 2010.10.03
표준 c++ / C++ 시작 1  (0) 2010.10.02
vs 2010 (vc++ 10)  (0) 2010.10.01
온라인 게임 서버  (0) 2010.10.01
알고리즘 bresenham  (0) 2010.09.16





소켓 이벤트 핸들링

IOCP
Overlapped Callback
select
WSAAsyncSelect
WSAEventSelect

Accept 방식

AcceptEx + Pooling

AcceptEx + No Pooling - TimeOut

WSAAccept + Loop - TimeOut

Database 인터페이스

ODBC
OLE DB
ADO

'온라인게임' 카테고리의 다른 글

오프라인 게임 절차  (0) 2010.10.02
RPG 들  (0) 2010.10.02
게임 서버  (0) 2010.10.01
개요  (0) 2010.09.22
바다 교육 'bada application 개발 기본 과정'  (0) 2010.09.20
VC++ IDE의 진화
vs 2008(vc++ 9)까지의 IDE는 구시대의 환경을 기반
2008년대 초반에 비해 하드웨어 사양이 크게 바뀌었음
vs 2010은 새로운 vs 시리즈의 시작

개선된 인텔리센스
덩치큰 ncb파일 제거, 임베디드 db를 사용하는 sdf 파일 사용

#include auto completion
Call Hierarchy
Red Squiggles(불규칙한 곡선)
Find All References
Class Winzard

C++ 0x Core Language features
auto
지역 변수를 정의때 명시적으로 type을 지정하지 않아도 됨
컴파일 타임때 type을 결정
코딩이 간편해지고, 코드 가독성이 좋아짐

static_assert
assert와 비슷한 조건 조사를 할 수 있음
컴파일 타임때 사용하여 프로그램 실행 전에 문제를 찾을 수 있음
템플릿 프로그래밍에 사용하면 특히 유용

decltype
템플릿 타입(type)이랑 템플릿 메타 프로그래밍 등에서 함수의 반환 형이
복잡하게 정의 되어 있는 경우 타입을 단순하게 기술 할 수 없다
C++ 0x 에서는 이런 문제를 풀기 위해 auto와 decltype 두 개를 제공
decltype은 auto 처럼 식의 타입을 컴파일 할 때 결정할 수 있다

nullptr
널 포인터를 가리키는 키워드
char* ch = nullptr;
STL 개선
STL을 새로 만듬
c++ 0x의 새로운 기능의 이점을 가졌고, 성능을 향상 시킴
mask_shart<T>() 함수 추가
c++ 0x 규격에 새로 생긴 min/max element, iota, is_sorted 등의 새로운 알고리즘 추가
STL에 UTF-8이나 UTF-16으로 변환할 수 있는 기능 추가
New Concurrency Runtime and Libraries
병렬 프로그래밍을 위한 라이브러리
스레드 관리 기능
스레드을 쉽게 사용(시스템 프로그래밍을 몰라도, 손쉽게 성능이 좋은 스레드)
패턴화된 스레드(PPL)과 컴포넌 단위 스레드(AAL)
PPL - Parallel Patterns Library
AAL - Asynchronous Agents Library
SDS - Synchronization Data Structures
(Task Scheduler, Resource Manager, OS)

Build and Project Systems
멀티 카겟 빌드 가능 (vc++ 8, vc++ 9 , 단 vs 2005, vs 2008 설치 필요)
vc#과 동일한 기능을 갖도록 MSbuild 개선
배포방식에 central deployment, local deployment 추가
Faster Compilation and Better Performance
X64 플랫폼용 프로그램 코드 크기를 3-10% 줄여 성능 향상
Build Great Applications on Windows7
리스타트 매니저
태스크 대화 상자
Multi-Touch, Ribbon UI

- 새로 만들기 - 프로젝트

- 새 프로젝트

추가  새 항목

새 항목 추가

소스 코드 작성 하기

디버그 디버깅하지 않고 시작

실행 화면

visual studio 2010 실행 화면

'온라인게임 > vc++' 카테고리의 다른 글

표준 c++ / C++ 시작 1  (0) 2010.10.02
게임 서버  (0) 2010.10.02
온라인 게임 서버  (0) 2010.10.01
알고리즘 bresenham  (0) 2010.09.16
파란 배경 Direct 3D 윈도우  (0) 2010.09.03

개발 툴은 Visual Studio 2008을 사용합니다. / STL

외부 라이브러리 중 boost를 사용

회사에서는 Unit Test를 사용하여 품질 좋은 프로그램을 만들기를 권장
리팩토링
Unit Test 프레임웍으로는 Google Test를 사용

서버 플랫폼은 Windows이며, 100% 확정은 아니지만 Windows 2008을 사용할 예정

개발 PC에 Windows 7(32비트 or 64비트)을 사용

온라인 게임 서버   
8.5
| 네티즌리뷰 2건
편집부  저 한국게임산업개발원 2005.06.30 기본정보 더보기

책소개

이 책은 초보자를 대상으로 쓰여지지 않았다. 기본적으로 C, C++, STL(STANDARD TEMPLATE LIBRARY), WINDOWS API를 알아야하고 윈도우즈 소켓 프로그래밍에 대해 1년 정도 경험이 있어야 책을 읽는 데 수월할 것이다. 그리고 윈도우즈 플래폼에 맞추어 쓰여져 있어서 유닉스?

 

목차

1장 온라인 게임 서버(시작편)
1.1 시작하기 전에
1.2 온라인 게임 서버 개요

2장 온라인 게임 서버(기초편)
2.1 소켓
2.2 윈속(Winsock)
2.3 쓰레드(Thread)
2.4 동기화
2.5 윈도우즈 I/O 모델

3장 온라인 게임 서버(응용편)
3.1 네트워크 라이브러리 - 들어가기전에
3.2 네트워크 라이브러리 - DLL(Dynamic Linking Library)
3.3 네트워크 라이브러리 만들기 - 설계
3.4 네트워크 라이브러리 만들기 - cMonitor class
3.5 네트워크 라이브러리 만들기 - cSingleton class
3.6 네트워크 라이브러리 만들기 - cRingBuffer class
3.7 네트워크 라이브러리 만들기 - cThread class
3.8 네트워크 라이브러리 만들기 - cVBuffer class
3.9 네트워크 라이브러리 만들기 - cQueue class
3.10 네트워크 라이브러리 만들기 - cLog class
3.11 네트워크 라이브러리 만들기 - cConnection class
3.12 네트워크 라이브러리 만들기 - clocpServer class
3.13 네트워크 라이브러리 만들기 - 채팅 서버

4장 온라인 게임 서버(실전편)
4.1 게임서버
4.2 NPC서버

5장 온라인 게임 서버(그 외 고려되어야 할 사항)
5.1 디버깅
5.2 방어적인 코드 작성법
5.3 예외 처리
5.4 테스트 시나리오

[YES24 제공]

'온라인게임 > vc++' 카테고리의 다른 글

표준 c++ / C++ 시작 1  (0) 2010.10.02
게임 서버  (0) 2010.10.02
vs 2010 (vc++ 10)  (0) 2010.10.01
알고리즘 bresenham  (0) 2010.09.16
파란 배경 Direct 3D 윈도우  (0) 2010.09.03

제공: 한빛 네트워크
저자: 최흥배
이전기사: 이전 기사에서는 함수 템플릿에 대해 설명을 했으니 이번에는 클래스 템플릿에 대해서 설명하려고 합니다.

 

경험치 변경 이력 저장

기획팀에서 유저들이 게임에 접속하여 다른 유저들과 100번의 게임을 했을 때 유저들의 경험치가 변경 되는 이력을 볼 수 있기를 요청 하였습니다.

기획팀의 요구를 들어주기 위해서 저는 게임이 끝날 때마다 경험치를 저장합니다.
또 경험치 이력 내역을 출력할 때 가장 최신에서 가장 오랜 된 것을 보여줘야 되기 때문에 스택(stack)이라는 자료 구조를 사용합니다.
스택은 자료 구조 중의 하나로 가장 마지막에 들어 온 것을 가장 먼저 꺼내는 LIFO(Last In First Out) 형식으로 되어 있습니다. 데이터를 넣을 때를 push, 빼낼 때는 pop이라는 이름을 일반적으로 사용한다.
경험치 이력을 저장하는 클래스의 구현과 이것을 사용하는 것은 아래와 같습니다.

// 경험치를 저장할 수 있는 최대 개수
const int MAX_EXP_COUNT = 100;

// 경험치 저장 스택 클래스
class ExpStack
{
public:
  ExpStack()
  {
    Clear();
  }

  // 초기화 한다.
  void Clear()
  {
    m_Count = 0;
  }

  // 스택에 저장된 개수
  int Count()
  {
    return m_Count;
  }

        // 저장된 데이터가 없는가?
  bool IsEmpty()
  {
    return 0 == m_Count ? true : false;
  }

  // 경험치를 저장한다.
  bool push( float Exp )
  {
    // 저장할 수 있는 개수를 넘는지 조사한다.
    if( m_Count >= MAX_EXP_COUNT )
    {
      return false;
    }

    // 경험치를 저장 후 개수를 하나 늘린다.
    m_aData[ m_Count ] = Exp;
    ++m_Count;

    return true; 
  }

  // 스택에서 경험치를 빼낸다.
  float pop()
  {
    // 저장된 것이 없다면 0.0f를 반환한다.
    if( m_Count  < 1 )
    {
      return 0.0f;
    }

    // 개수를 하나 감소 후 반환한다.
    --m_Count;
    return m_aData[ m_Count ];
  }

private:
  float  m_aData[MAX_EXP_COUNT];
  int    m_Count;
};

#include 

using namespace std;

void main()
{
  ExpStack kExpStack;
  
  cout << "첫번째 게임 종료- 현재 경험치 145.5f" << endl;
  kExpStack.push( 145.5f );

  cout << "두번째 게임 종료- 현재 경험치 183.25f" << endl;
  kExpStack.push( 183.25f );

  cout << "세번째 게임 종료- 현재 경험치162.3f" << endl;
  kExpStack.push( 162.3f );


  int Count = kExpStack.Count();
  for( int i = 0; i < Count; ++i )
  {
    cout << "현재 경험치->" << kExpStack.pop() << endl;
  }
}
실행 결과

그림1

실행 결과를 보면 알 수 있듯이 스택 자료구조를 사용하였기 때문에 제일 뒤에 넣은 데이터가 가장 제일 먼저 출력 되었습니다.

게임 돈 변경 이력도 저장해 주세요

경험치 변경 이력을 저장하고 출력하는 기능을 만들어서 기획팀에 보여주니 이번에는 게임 돈의변경 이력도 보고 싶다고 말합니다.

위에서 경험치 변경 이력 저장 기능을 만들어 보았으니 금방 할 수 있는 것이죠. 그래서 이번에는 이전 보다 훨씬 더 빨리 만들었습니다.

// 돈을 저장할 수 있는 최대 개수
const int MAX_MONEY_COUNT = 100;

// 돈 저장 스택 클래스
class MoneyStack
{
public:
  MoneyStack()
  {
    Clear();
  }

  // 초기화 한다.
  void Clear()
  {
    m_Count = 0;
  }

  // 스택에 저장된 개수
  int Count()
  {
    return m_Count;
  }

  // 저장된 데이터가없는가?
  bool IsEmpty()
  {
    return 0 == m_Count ? true : false;
  }

  // 돈을 저장한다.
  bool push( __int64 Money )
  {
    // 저장 할 수 있는 개수를 넘는지 조사한다.
    if( m_Count >= MAX_MONEY_COUNT )
    {
      return false;
    }

    // 저장후 개수를 하나 늘린다.
    m_aData[ m_Count ] = Money;
    ++m_Count;

    return true; 
  }

  // 스택에서 돈을 빼낸다.
  __int64 pop()
  {
    // 저장된 것이 없다면 0을 반환한다.
    if( m_Count  < 1 )
    {
      return 0;
    }

    // 개수를 하나 감소 후 반환한다.
    --m_Count;
    return m_aData[ m_Count ];
  }

private:
  __int64  m_aData[MAX_MONEY_COUNT];
  int  m_Count;
};

 

ExpStack 클래스와 MoneyStack 클래스가 비슷합니다

게임 돈 변경 이력 저장 기능을 가지고 있는 MoneyStack 클래스를 만들고 보니 앞에 만든 ExpStack와 거의 같습니다.
저장하는 데이터의 자료형만 다를뿐이지 모든 것이 같습니다.

그리고 기획팀에서는 게임 캐릭터의 Level 변경 이력도 저장하여 보여주기를 바라는 것 같습니다.
이미 거의 똑같은 클래스를 두개 만들었고 앞으로도 기획팀에서 요청이 있으면 더 만들 것 같습니다.

이렇게 자료형만 다른 클래스를 어떻게 하면 하나의 클래스로 정의 할수 있을까요? 이와 비슷한 문제를 이전의 "함수 템플릿"에서도 나타나지 않았나요? 그때 어떻게 해결했죠?(생각나지 않는 분들은 앞의 "함수 템플릿"을 다시 한번 봐 주세요 ^^)

템플릿으로 하면됩니다.

기능은 같지만 변수의 자료형만 다른 함수를 템플릿을 사용하여 하나의 함수로 정의했듯이 이번에는 템플릿을 사용하여 클래스를 정의합니다. 클래스에서 템플릿을 사용하면 이것을 클래스 템플릿이라고 합니다.

클래스 템플릿을 사용하면 위에서 중복된 클래스를 하나의 클래스로 만들 수 있습니다.

클래스 템플릿을 사용하는 방법

클래스 템플릿을 정의하는 문법은 아래와 같습니다.

그림2

정의한 클래스 템플릿을 사용하는 방법은 아래와 같습니다.

그림3 


....


Stack 템플릿 클래스

지금까지 만들었던 ExpStack 과 MoneyStack을 클래스 템플릿으로 만든 코드는 아래와 같습니다.

const int MAX_COUNT = 100;

template <typename T> 
class Stack
{
public:
  Stack()
  {
    Clear();
  }

  // 초기화 한다.
  void Clear()
  {
    m_Count = 0;
  }

  // 스택에 저장된 개수
  int Count()
  {
    return m_Count;
  }

  // 저장된 데이터가 없는가?
  bool IsEmpty()
  {
    return 0 == m_Count ? true : false;
  }

  // 데이터를 저장한다.
  bool push( T data )
  {
    // 저장 할수 있는 개수를 넘는지 조사한다.
    if( m_Count >= MAX_COUNT )
    {
      return false;
    }

    // 저장후 개수를 하나 늘린다.
    m_aData[ m_Count ] = data;
    ++m_Count;

    return true; 
  }

  // 스택에서 빼낸다.
  T pop()
  {
    // 저장된 것이 없다면 0을 반환한다.
    if( m_Count  < 1 )
    {
      return 0;
    }

    // 개수를 하나 감소 후 반환한다.
    --m_Count;
    return m_aData[ m_Count ];
  }

private:
  T  m_aData[MAX_COUNT];
  int    m_Count;
};

#include 

using namespace std;

void main()
{
  Stack<float> kStackExp;
  
  cout << "첫번째 게임 종료- 현재 경험치 145.5f" << endl;
  kStackExp.push( 145.5f );

  cout << "두번째 게임 종료- 현재 경험치 183.25f" << endl;
  kStackExp.push( 183.25f );

  cout << "세번째 게임 종료- 현재 경험치 162.3f" << endl;
  kStackExp.push( 162.3f );


  int Count = kStackExp.Count();
  for( int i = 0; i < Count; ++i )
  {
    cout << "현재 경험치->" << kStackExp.pop() << endl;
  }

  cout << endl << endl;

  Stack<__int64> kStackMoney;
  
  cout << "첫번째 게임 종료- 현재 돈 1000023" << endl;
  kStackMoney.push( 1000023 );

  cout << "두번째 게임 종료- 현재 돈 1000234" << endl;
  kStackMoney.push( 1000234 );

  cout << "세번째 게임 종료- 현재 돈 1000145" << endl;
  kStackMoney.push( 1000145 );


  Count = kStackMoney.Count();
  for( int i = 0; i < Count; ++i )
  {
    cout << "현재 돈->" << kStackMoney.pop() << endl;
  }
}
실행 결과

그림4

클래스 템플릿으로 Stack을 구현하여 앞으로 다양한 데이터를 사용할 수 있게 되었습니다.

...


위의 것은 기본형이고 기본 기능만 내장된거 같나...???????


...

그래서 부족한 점들을 채워 보자..........


.............

클래스 템플릿에서 non-type 파라메터 사용

위에서 만든 Stack 클래스는 데이터를 저장할 수 있는 공간이 100개로 정해져 있습니다.

Stack의 크기는 사용하는 곳에 따라서 변동될 수 있어야 사용하기에 적합합니다.

함수 템플릿을 설명할 때도 non-type이 나왔는데 사용 방법이 거의 같습니다. 템플릿 파라메터를 기본 데이터 형으로 합니다. 아래의 사용 예를 보시면 금방 이해가 갈 것입니다.

// 템플릿 파라메터중 int Size가 non-type  파라메터입니다.
template<typename T, int Size> 
class Stack
{
public:
  Stack()
  {
    Clear();
  }
...
 

템플릿 파라메터 디폴트 값 사용

일반 함수에서 함수 인자의 디폴트 값을 지정하듯이 클래스 템플릿의 파라메터도 디폴트 값으로 할 수 있습니다.

// 템플릿 파라메터중 int Size가 non-type 파라메터입니다. 
// Size의 디폴트 값을 100으로 합니다.
template<typename T, int Size=100> 
class Stack
...
 

스택 클래스의 크기를 클래스 생성자에서 지정

클래스 템플릿에 대한 설명을 계속 하기 위해 현재까지 만든 스택 클래스를 변경합니다. 스택의 크기를 클래스 템플릿 파라메터가 아닌 생성자에서 지정하도록 변경하겠습니다.

template<typename T, int Size=100> 
class Stack
{
public:
  explicit Stack( int size )
  {
    m_Size = size;
    m_aData = new T[m_Size];

    Clear();
  }
...
 

클래스 템플릿 전문화

기획팀에서 새로운 요구가 들어왔습니다. 이번에는 게임을 할 때 같이 게임을 했던 유저의 아이디를 저장하여 보여주기를 원합니다. 지금까지 만든 Stack 클래스는 기본 자료형을 사용하는 것을 전제로 했는데 유저의 아이디를 저장하려면 문자열이 저장되어야 하므로 사용할 수가 없습니다. 

기본 자료형으로 하지 않고 문자열을 사용한다는 것만 다르지 작동은 비슷하므로 Stack이라는 이름의 클래스를 사용하고
싶습니다. 
 
기존의 Stack 클래스 템플릿과 클래스의 이름만 같지 행동은 다른 Stack 클래스를 구현 하려고 합니다. 
이때 필요한 것인 클래스 템플릿의 전문화라는 것입니다. 
 
클래스 템플릿 전문화는 기존에 구현한 클래스 템플릿과 
이름과 파라메터 개수는 같지만 파라메터를 특정한 것으로 지정합니다. 

전문화된 클래스 템플릿 정의는 다음과 같은 형태를 가진다.
 
template <> 
class 클래스 이름<지정된 타입>
{
   ……………….
};
아래의 코드는 문자열을 저장하기 위해 char* 으로 전문화한 Stack 클래스입니다. 

// ID 문자열의 최대 길이(null 문자포함)
const int MAX_ID_LENGTH = 21;

// char* 를 사용한 Stack 클래스(List 6) 템플릿 전문화
template<> 
class Stack
{
public:
  explicit Stack( int size )
  {
    m_Size = size;

    m_ppData = new char *[m_Size];
    for( int i = 0; i < m_Size; ++i )
    {
      m_ppData[i] = new char[MAX_ID_LENGTH];
    }

    Clear();
  }
...
 

클래스 템플릿 부분 전문화

클래스 템플릿은 템플릿 파라메터 중 일부를 구체적인 형(type)을 사용, 또는 템플릿 파라메터를 포인터나 참조를 사용하여 부분 전문화를 할 수 있습니다.

- 구체적인 형 사용에 의한 부분 전문화
template< typename T1, typename T2 > class Test { …. };
의 T2를 float로 구체화 하여 부분 전문화를 하면 다음과 같습니다.
template< typename T1 > class Test { ….. };
코드는 다음과 같습니다.

template< typename T1, typename T2 >
class Test
{
public:
  T1 Add( T1 a, T2 b )
  {
    cout << "일반 템플릿을 사용했습니다." << endl;
    return a;
  }
};

// T2를 float로 구체화한 Test의 부분 전문화 템플릿
template< typename T1 > 
class Test
{
public:
  T1 Add( T1 a, float b )
  {
    cout << "부분 전문화 템플릿을 사용했습니다." << endl;
    return a;
  }
};

#include 

using namespace std;

void main()
{
  Test test1;
  test1.Add( 2, 3 );

  Test test2;
  test2.Add( 2, 5.8f );
}
그림9
..
 

싱글톤 템플릿 클래스

클래스 상속을 할 때 템플릿 클래스를 상속 받음으로 상속 받는 클래스의 기능을 확장할 수 있습니다. 

저의 경우 현업에서 클래스 템플릿을 가장 많이 사용하는 경우가 클래스 템플릿을 사용한 싱글톤 클래스
템플릿을 사용하는 것입니다. 

어떠한 객체가 꼭 하나만 있어야 되는 경우 싱글톤으로 정의한 클래스 템플릿을 상속 받도록 합니다.
싱글톤은 
싱글톤 패턴을 말하는 것으로 어떤 클래스의 인스턴스가 꼭 하나만 생성되도록 하며, 
전역적인 접근이 가능하도록 합니다. 어떤 클래스를 전역으로 사용하는 경우 복수개의 인스턴스가 생성되지 않도록 싱글톤 패턴으로 생성하는 것을 권장합니다.
사용하는 방법은 베이스 클래스를 템플릿을 사용하여 만듭니다. 그리고 이것을 상속 받는 클래스에서 
베이스 클래스의 템플릿 파라메터에 해당 클래스를 사용합니다. 즉 싱글톤 클래스 템플릿은 이것을 상속 받는 
클래스를 싱글톤으로 만들어줍니다. 

위에서 설명한 클래스 템플릿에 대하여 이해를 하셨다면 의 코드를 보면 이해를 할 수 있으리라 생각합니다.
싱글톤 클래스 템플릿은 직접 생성을 하지 않으므로 주 멤버들을 static로 만들어줍니다. 
그리고 생성자를 통해서 _Singleton를 생성하지 않고 GetSingleton()을 통해서만 생성하도록 합니다. 

#include 
using namespace std;


// 파라메터 T를 싱글톤이 되도록 정의 합니다.
template <typename T>
class MySingleton
{
public:
    MySingleton() {}
    virtual ~MySingleton() {}

    // 이 멤버를 통해서만 생성이 가능합니다.
    static T* GetSingleton()
    {
        // 아직 생성이 되어 있지 않으면 생성한다.
        if( NULL == _Singleton ) {
            _Singleton = new T; 
        }

       return ( _Singleton );
    }

    static void Release()
    {
        delete _Singleton;
        _Singleton = NULL;
    }

private:
    static T* _Singleton;
};

template <typename T> T* MySingleton ::_Singleton = NULL;

// 싱글톤 클래스 템플릿을 상속 받으면서 파라메터에 본 클래스를 넘깁니다.
class MyObject : public MySingleton
{
public:
MyObject() : _nValue(10) {}

void SetValue( int Value ) { _nValue = Value;}  
int GetValue() { return _nValue; }

private :
int _nValue;
};

void main()
{
   MyObject* MyObj1 = MyObject::GetSingleton();

   cout << MyObj1->GetValue() << endl;

   // MyObj2는 Myobj1과 동일한 객체입니다.
   MyObject* MyObj2 = MyObject::GetSingleton();
   MyObj2->SetValue(20);

   cout << MyObj1->GetValue() << endl;
   cout << MyObj2->GetValue() << endl;
}

'온라인게임 > stl' 카테고리의 다른 글

Standard Template Library (STL), 1 of n  (0) 2010.10.07
함수 템플릿 Template 2-1  (0) 2010.10.01
STL이 무엇인지 알고 계십니까? 1  (0) 2010.10.01

+ Recent posts