gamE/C2010. 1. 22. 17:53






3-1. 덧셈 프로그램 구현을 위해 필요한 + 연산자

#include <stdio.h>

int main(void)
{
 3+4;
 return 0;

}

- 잘못된 코드


- 위의 + 기호처럼 연산을 요구할 때 사용되는 기호를 가리켜 연산자라 한다.


3-2. C언어는 데이터 저장을 위해 변수를 제공한다.
 1. 변수를 이용한 데이터의 저장
 - 변수란?
 > 데이터를 저장할 수 있는 메모리 공간에 붙여진 이름을 의미한다.



#include <stdio.h>

int main(void)
{
 int result; //변수 선언
 result=3+4; //덧셈 결과 저장

 printf("덧셈 결과 : %d \n", result);
 printf("%d 더하기 %d는 %d 입니다. \n", 3, 4, result);
 printf("변수 result에 저장된 값 : %d \n", result);

 return 0;

}

결과

덧셈 결과 : 7
3 더하기 4는 7 입니다
변수 result에 저장된 값 : 7



3-3. C언어에는 다양한 연산자가 존재한다.
 1. C언어가 제공하는 다양한 종류의 연산자들
 -대입 연산자(=)와 산술 연산자(+,-,*,/,%)

 연산자  연산자의 의미
 =  오른쪽에 있는 값을 왼쪽에 대입한다.
ex) a = 20
 +  왼쪽과 오른쪽에 있는 값을 더한다.
ex) a = 4+3
 -  왼쪽에 있는 값에서 오른쪽에 있는 값을 뺀다.
ex) a =4-3
 *  왼쪽과 오른쪽에 있는 값을 곱한다
ex) a= 4*3
 /  왼쪽에 있는 값을 오른쪽에 있는 값으로 나눈다
ex) a = 4/3
 %  왼쪽에 있는 값을 오른쪽에 있는 값으로 나눠서 나머지를 반환한다.
ex) a= 4%3



#include <stdio.h>

int main(void)
{
 int val1=4;
 int val2=2;

 printf("두 수의 덧셈: %d \n", val1+val2);
 printf("두 수의 뺄셈: %d \n", val1-val2);
 printf("두 수의 곱셈: %d \n", val1*val2);
 printf("두 수의 나눗셈: %d \n", val1/val2);
 printf("두 수의 나머지: %d \n", val1%val2);

 return 0;

}


결과

두 수의 덧셈: 6
두 수의 뺼셈: 2
두 수의 곱셈: 8
두 수의 나눗셈: 2
두 수의 나머지: 0




 2. 기타 대입 연산자(+=, -=, *=, /=, %=)
 - a = a + b;                 =               a +=b;
 - 위는 같은 의미


#include <stdio.h>

int main(void)
{
 int val1=2;
 int val2=4;
 int val3=6;

 val1+=3; //val1=val1+3;
 val2*=4; //val2=val2*4;
 val3%=5; //val3=val3%5;

 printf("result : %d %d %d \n", val1, val2, val3);
 
 return 0;

}

결과

result : 5 16 1


 3. 부호 연산으로서의 +와 -연산자

#include <stdio.h>

int main(void)
{
 int val1=2;
 int val2=-4;
 
 val1=-val1; //val1-=val1과 혼동 하지 말 것.
 printf("val1=-val1 연산 이후 val1은 %d \n", val1);
 
 val2=-val2;
 printf("val2=-val2 연산 이후 val2은 %d \n", val2);

 return 0;

}

결과

val1=-val1 연산 이후 val1은 -2
val2=-val2 연산 이후 val2은 4



 4. 증가, 감소 연산자
 

 연산자  연산자의 의미
 ++a  값을 1 증가 후 연산을 진행
ex) printf("%d", ++a)
 a++  연산을 진행한 후 값을 1 증가
ex) printf("%d", a++)
 -b  값을 1 감소 후 연산을 진행
ex) printf("%d, --b)
 b-  연산을 진행한 후 값을 1 감소
ex) printf("%d", b--)




#include <stdio.h>

int main(void)
{
 int val1=10;
 int val2=10;

 printf("선 연산 후 증가 : %d \n", val1++);
 printf("다시 한번 출력 : %d \n", val1);

 printf("선 증가 후 연산 : %d \n", ++val2);
 printf("다시 한번 출력 : %d \n", val2);

 


 return 0;

}


결과

선 연산 후 증가 : 10
다시 한번 출력 : 11
선 증가 후 연산 : 11
다시 한번 출력 : 11






#include <stdio.h>

int main(void)
{
 int val1=10;
 int val2=(val1--)+2;

 printf("val1 : %d \n", val1);
 printf("val2 : %d \n", val2); 

 return 0;

}


결과

val1 : 9
val2 : 12




5. 관계 연산자(비교 연산자)

 연산자  예  의미
 <  a<b  a가 b보다 작은가?
 >  a>b  a가 b보다 큰가?
 ==  a==b  a와 b가 같은가?
 !=  a!=b  a와 b가 같지 않은가?
 <=  a<=b  a가 b보다 작거나 같은가?
 >=  a>=b  a가 b보다 크거나 같은가?



#include <stdio.h>

int main(void)
{
 int val1=10;
 int val2=12;
 int result1, result2, result3;

 result1=(val1==val2);
 result2=(val1<=val2);
 result3=(val1>val2);

 printf("result1 : %d \n", result1);
 printf("result2 : %d \n", result2);
 printf("result3 : %d \n", result3);

 return 0;

}



결과

result1 : 0
result2 : 1
result3 : 0



6. 논리 연산자
- 논리 연산자란 and, or, not을 표현하는 연산자이다.

 연산자  연산자의 의미
 &&  피연산자가 모두 참이면 true를 반환(and의 의미)
 ex) a && b
 ||  피연산자 중 하나라도 참이면 true를 반환(or의 의미)
 ex) a||b
 !  피연산자가 true면 false를, false면 true를 반환
 (not의 의미)
 ex) !a



#include <stdio.h>

int main(void)
{
 int val1=10;
 int val2=12;
 int result1, result2, result3;

 result1=(val1==10 && val2==12);
 result2=(val1<12||val2>12);
 result3=(!val1);

 printf("result1 : %d \n", result1);
 printf("result2 : %d \n", result2);
 printf("result3 : %d \n", result3);

 return 0;

}


결과

result 1 : 1
result 2 : 1
result 3 : 0



7. 비트 단위 연산자

~, &, ^, |, <<, >>

8. 콤마(,)연산자

#include <stdio.h>

int main(void)
{
 int a=1, b=2;
 printf("Hello "), printf("World! \n");

 a++, b++;
 printf("%d ", a), printf("%d ", b), printf("\n");

 return 0;

}


결과

Hello World!
2 3

 연산순위  연산자
 1  (), [], ->, .
 2  sizoof, &, ++, ==, ~, !,
 *(간접 지정 연산자), +(단항 연산자), -(단항 연산자)
 3  *(곱셈 연산자), /, %
 4  +(이항 연산자), -(이항 연산자)
 5  <<,>>
 6  <,<=,>=,>
 7  ==,!=
 8  &
 9  ^
 10  |
 11  &&
 12  ||
 13  ?;(삼항 연산자)
 14  =, +=, *=, /=, &=, &=, ^=, |=, <<=, >>=
 15  ,(콤마 연산자)


3-4 키보드로부터 데이터를 입력 받고 싶다!

1] scanf를 이용해서 키보드로부터 정수를 입력받기 원한다면?

#include <stdio.h>

int main(void)
{
 int result;
 int val1, val2;

 printf("첫 번째 숫자: ");
 scanf("%d", &val1); //첫 번째 데이터 입력

 printf("두 번째 숫자: ");
 scanf("%d", &val2); //두 번째 데이터 입력

 result=val1+val2; //덧셈 연산.
 printf("%d + %d = %d \n", val1, val2, result);

 return 0;

}


결과

첫 번째 숫자 : A
두 번째 숫자 : B
A + B = C



2] scanf를 이용하면 입력 형태를 다양하게 지정하는 것이 가능하다.

#include <stdio.h>

int main(void)
{
 int result;
 int val1, val2;

 printf("숫자 둘을 입력 하세요 : ");
 scanf("%d %d", &val1, &val2);

 result=val1+val2;
 printf("%d + %d = %d \n", val1, val2, result);

 return 0;

}


결과

숫자 둘을 입력하세요 : A B
A + B = C



'C 프로그래밍' ~80P



'gamE > C' 카테고리의 다른 글

C - Chapter 2. 프로그램의 기본 구성  (0) 2010.01.20
C - Chapter1. 이것이 C언어다.  (1) 2010.01.19
Posted by 생선날개





게임밸런스
- 게임 밸런스에는 다음과 같이 크게 세 가지의 유형으로 나누어서 생각해 볼 수 있다.
1. 플레이어/플레이어 밸런스는 게임을 공평하게 만들어서, 승패를 겨루는 플레이어에게 실력을 제외한 모든 조건이 동등하게 주어지도록 구성하는 것이다. 게임에 운이 작용할 수도 있지만, 이것은 모든 플레이어에게 동일하게 적용되어야 한다.
2. 플레이어/게임플레이 밸런스는 플레이어의 학습곡선에 따라 그에 상응하는 보상을 주어서 계속 게임을 플레이하도록 유도하는 것을 말한다. 플레이어가 게임을 적으로 인식할 정도로 게임 진행의 난이도가 너무 높거나 임의적이어서는 안된다.
3. 게임플레이/게임플레이 밸런스는 게임 안의 요소들간의 밸런스를 맞추는 것이다. 예를 들어 '타부의 검' 이 다른 무기에 비해 2배의 공격력을 갖는다면, 그 가격을 다른 무기의 2배로 설정하는 식으로 다른 요소들이 보정되어서 밸런스가 맞춰져야 한다.

*역자노트 5.1 학습곡선
-학습량, 학습시간, 반응시간, 정밀도, 오류 등을 측도로 하여 행동의 변화를 표시한 그래프. 게임에서는 플레이어의 게임에 대한 숙련도가 향상되는 과정을 뜻한다. 즉 게임 초반에는 플레이어의 숙련도가 늦지만 게임이 진행될수록 점점 숙련도가 높아지는 것을 말한다.

1) 플레이어/플레이어 밸런스
- 하나의 캐릭터가 다른 캐릭터보다 조금 더 쎄다고 해서 너무나도 큰 문제가 되진 않는다. WOW를 예로 든다면, 도적이 PVE에서 엄청난 데미지를 보인다고 해서 흑마들이 좌절하거나 하기싫거나 이런 면보단, 흑마로써 도적을 이기고 싶다 라는 도전이나 새로운 목표와 같은 점이 생길 것이다.

 1. 대칭
 - 게임에서는 플레이어가 제어하지 못하는 요인 때문에 승패가 결정되어서는 안된다.

 2. 레벨 디자인에서의 대칭성
 - 각 플레이어가 똑같은 입장이 되도록 만들면, 대칭성을 유지하기가 쉽다. 하지만 너무 뻔하기 때문에 플레이어들이 쉽게 질릴 수 있다. 조금 더 바람직한 방법으로는 레벨이 기능적으로는 대칭을 이루지만, 그것이 대칭이라는 사실이 한눈에 드러나지 않도록 구성하는 것이 가장 바람직하다.

 3. 게임 디자인에서의 대칭성
 - 게임 디자인에서의 대칭성이란 모든 플레이어에게 주어지는 선택사항이 기능적으로 동일하다는 것을 뜻한다. 이것은 공정한 게임을 만들기 위한 가장 쉬운 방법이다. 더 어려운 방법으로는, 플레이어들에게 서로 다른 선택사항을 제공하되 그 선택사항들 간의 밸런스를 잡아서 각 플레이어가 우승할 확률을 비슷하게 만드는 것이다.

ex)
워크레프트 2 : 기본적으로 대칭구조를 이루고 있지만, 오크쪽의 오우거메이지는 광전사의 분노와 폭발 부적을 사용하지만, 인간쪽에서는 동료들을 치료하거나 언데드 유니트를 파괴할 수 있는 능력을 가진 팔라딘이 있다.

2) 플레이어/게임플레이 밸런스
- 플레이어/게임플레이 밸런스는 게임의 상호작용 요소에 관련된 일이다. 게임이라면 당연히 모든 플레이어에게 공정하고, 그 안의 모든 요소와 기능들이 의미를 갖어야겠지만, 동시에 플레이어와 게임 간의 관계에 대해 생각해보아야 한다. 게임이 보상을 얻기 위해 너무 많은 고생을 요구한다면, 플레이어의 관심은 그리 오래가지 못 할 것이다.

- 플레이어/게임플레이 밸런스 조정은 다음 세 가지의 간단한 규칙을 따른다.
>플레이어에게 보상을 주어라
>잡일은 컴퓨터에게 시켜라
>플레이어가 즐길 게임을 만들어야지, 적이 되어서는 안된다

 1. 플레이어에게 보상을 주어라
 - 일단은 게임 하는 법을 익히며 시작할 것이다. 하지만 완벽하게 게임 조작을 익힐 때까지 플레이어는 자주 실수를 저지를 것이며, 그 때마다 힘이 빠질 것이다. 따라서 플레이어가 무언가 새로운 것을 배울 때마다 약간의 보상을 제공해서 실수 때문에 생긴 실망감을 상쇄시켜야만 한다.
 - 단순히 수치가 높아지는 보상보다는, 게임 안에서의 선택의 폭이 넓어지는 보상이 바람직하다. "가위차기 기술을 배우려고 무진장 노력했지. 이제 드디어 익혔어. 멋진 기술이지." 라고 말하면 단순히 사용가능한 기술의 갯수가 늘어난 것이지만, "가위차기를 배우고 나니까, 그것과 연계시켜서 리버스 펀치를 활용할 방법이 생각났어." 라고 말한다면 새로운 기술을 배웠을 뿐 아니라 기존의 기술들까지도 새롭게 활용할 수 있게 된 것이다.

 2. 잡일은 컴퓨터에게 시켜라
 - 예를 들어 예전 CRPG게임 패키지 안에 모눈종이와 연필이 들어 있어, 던전을 탐험할 때마다 지도를 그려야 했다. 판단력을 요구하는 의사결정 이외의 다른 작업은 컴퓨터의 AI가 알아서 처리하도록 만들어야 한다. 플레이어를 귀찮게 하면 안된다.

 3. 플레이어가 즐길 게임을 만들어야지, 적이 되어서는 안된다
 - 세이브라는 것은 현실에서 일이 생겨서 저장을 하는 도구가 되어야 하지, 게임을 공략하기 위한 도구가 되어서는 안된다. 만약 세이브가 없이 공략하기 어려운 게임이라면, 그 게임은 밸런스가 제대로 잡혀 있지 않은 게임이다.

3) 게임플레이/게임플레이 밸런스
- 게임플레이에서의 밸런스를 위해서 해결해야 될 문제로는 다음의 세 가지를 생각해 볼 수 있다.
>절대우위의 단일한 의사결정보다는 다양한 의사결정이 가능하도록 해야 한다
>상대방의 의사결정에 따라 자신이 내릴 수 있는 최적의 의사결정을 제공하기란 생각만큼 쉽지 않다
>각각의 선택가능한 결정들 중에서 각각이 채택되는 빈도수를 파악하기 힘들다.그럼에도 불구하고 게임의 밸런스를 잡기 위해서는 그것을 알아내야만 한다

 1. 구성요소와 속성 밸런스
 - 게임을 이루는 요소들 간의 밸런스 조정은 두 가지 수준에서 이루어져야 한다.
 >구성요소 밸런스, 속성 밸런스

 2. 비순차적인 게임 규칙은 밸런스를 보장한다
 - 가위, 바위, 보가 최고의 예
  가위  바위  보 
 바위  -1 0
 보  1 -1 
 가위  0 -1 

- 가위, 바위, 보와 비슷한 예로, 하단차기, 상단차기, 내려찍기가 있다.
- 위의 타격기를 더욱 재미있게 추가할 수 있는 것은 콤보기를 넣고, 보상값을 더 크게 구성하면 된다.

 3. 지나치게 복잡한 조합
 - 너무 많은 가위바위보의 관계를 유지 한다면, 경험에 입각한 전략을 세우기가 불가능한 게임이 되고 만다.

 4. 게임 디자인의 규모. 그리고 또 다른 비순차적 관계
 - 가위바위보의 규칙에 확장을 한다면, 홀수가 되어야 한다. (3, 5, 7, 9..)
 - 한가지 예를 들어 보자. 아래의 5방향 가위바위보 보상값을 보았을 때, 5가지의 캐릭터중에 한가지의 캐릭터만 제외 한다고 하면, 바로 밸런스의 차이가 생긴다. 1가지의 캐릭터는 매우 강하게 특화될 것이고, 1가지의 캐릭터는 매우 쓸모가 없어질 것이다.

ex)가위바위보의 예

- 3방향 가위바위보 보상값 표
  가위  바위  보 
 바위  -1 0
 보  1 -1 
 가위  0 -1 

- 4방향 가위바위보 보상값 표(홀수 방향 보상값과는 달리 비대칭이라 어떻게 보면 더 매력적이다)
   궁수(a) 전사(w) 야만인(b)  마법사(s) 
 궁수(a)  0   +1  -1  0
 전사(w)  -1  0  +1  +1
 야만인(b)  +1  -1  0  -1
 마법사(s)  0  -1  +1  0
 위의 표를 정리해보자면,
 1. a + w + b + s = 1
 2. A = w - b
 3. W = b + s
 4. B = a - w - s
 5. S = b = w
 6. A + W + B + S = 0

 - 5방향 가위바위보 보상값 표
   무사 승려  보병   궁수 자객 
 무사 +1  +1  -1  -1 
 승려 -1  +1  +1  -1 
 보병 -1 -1  +1  +1 
 궁수 +1  -1  -1  +1 
 자객 +1 +1  -1  -1 


- 5방향이지만 유저의 눈에 보이지 않는 가위바위보 보상값 표
 (탱크는 탱크킬러를 제외한 모든 유니트에게 이기고, 탱크킬러는 탱크를 제외한 모든 유니트에게 패배한다.
  또한 보병, 장갑차, 포병은 일반적인 가위바위보 관계를 이룬다.)
   탱크  보병  포병  장갑차  탱크 킬러
 탱크  0  +1  +1  +1  -1
 보병  -1  0  +1  -1  +1
 포병  -1  +1  0  +1  +1
 장갑차  -1  +1  -1  0  +1
 탱크킬러  +1  -1  -1  -1  0

 겉으로 보기에는 많은 사용자들이 탱크와 탱크 킬러의 게임이 유지될거라 보이겠지만,
 줄여 본다면,
 
   탱크  그 외  탱크 킬러
 탱크  0  +1  -1
 그 외(가위바위보유지)  -1  0(평균값)  +1
 탱크 킬러  +1  -1  0

이렇게 된다면, 각 유니트의 사용 빈도는
 유니트 종류  탱크  보병  포병  장값차  탱크 킬러
 사용 빈도  1/3  1/9  1/9  1/9  1/3

 이 예는 각 유니트들의 가격이 동일하다는 전제하에 이런 빈도가 나오지만,
 만약 탱크의 값을 다른 유닛에 비해 2배로 올린다면? 탱크와 보병의 수치와 결과에 따라 보상값을 조정한다면, 이 공식은 알맞는 밸런스를 맞출 수 있고, 게임을 만들기도 쉬울 것이다.

4) 게임밸런스 체크리스트
- 플레이어/플레이어 밸런스에서의 황금률 : 실수를 범하지 않은 플레이어가 이길 수 없는 상황에 놓이는 경우가 없어야 한다.
- 플레이어/게임플레이 밸런스의 황금률 : 게임을 플레이하는 것만큼이나 게임을 배우는 과정 또한 재미있어야 한다. 그리고 게임에 숙달될수록 점점 더 재미있어져야 한다.
- 게임플레이/게임플레이 밸런스의 황금률 : 게임 내의 모든 옵션은 이따금이라도 쓸모가 있어야 하며, 각 옵션을 사용할 때의 순 비용은 그것을 사용했을때 얻는 보상값에 비례해야 한다.




'게임아키텍처디자인' 120p~154p




Posted by 생선날개
gamE/C2010. 1. 20. 15:10




함수란?
ex)

3X + 4 = Y

인자 전달 - 입력 X를 전달하는 행위
함수 호출 - 입력 X를 전달하면서 정의된 함수의 실행을 요구하는 행위

main
- 주 프로그램임을 의미. 함수의 이름

괄호{}
- 함수 main()의 실행 범위. main 몸체 시작과 종료.

printf()
- 문자열을 화면에 출력하기 위한 함수

return 0
- 함수를 빠져나온다는 의미
- 함수를 호출 한 영역으로 값을 반환한다는 의미

%d
- 서식 문자. 10진수 정수형으로 출력



특수 문자

기능

 \a

벨소리

 \b

왼쪽으로 1칸이동

 \f

한 페이지 전진

 \n

줄바꿈

 \r

Enter

 \t

Tab

 \v

수직 Tab

 \\

\를 출력

 \'

작은 따옴표 출력

 \"

큰 따옴표 출력

 \0

아무 동작하지 않음

 %%

% 기호 출력

 ;

문장 구별하기

 /* */

주석문(자신만의 문장.출력되지 않음)

 //

한줄 주석 


연습문제 1.

#include <stdio.h>
int main(void)
{
 printf("홍\n홍길\n홍길동\n");
  return 0;
}


결과


홍길
홍길동




연습문제 2.

#include <stdio.h>
int main(void)
{
 printf("이름\n아무개\n");
 printf("주소\n어딘가에\n");
 printf("전화번호\n123456789\n");
  return 0;
}


결과

이름
아무개
주소
어딘가에
전화번호
123456789




연습문제 3.


#include <stdio.h>

int main(void)
{
 printf("Hello Everybody \n");
 printf("%d\n", 1234);
 printf("%d %d \n", 10, 20);
 return 0;

}

결과

Hello Everybody
1234
10 20


연습문제 4.

#include <stdio.h>

int main(void)
{
 printf("my age : %d \n", 20);
 printf("%d is my point \n", 100);
 printf("good \nmorning \neverybody\n");

 return 0;

}

결과

my age : 20
100 is my point
good
morning
everybody





연습문제 5.

#include <stdio.h>

int main(void)
{
 printf("저의 이름은 홍길동입니다. \n");
 printf("저의 나이는 %d살이고요. \n", 20);
 printf("제가 사는 번지수는 %d-%d번지입니다.\n", 111, 222);

 return 0;

}

결과

저의 이름은 홍길동입니다.
저의 나이는 20살이고요
제가 사는 번지수는 111-222번지입니다.





연습문제 6.

#include <stdio.h>

int main(void)
{
 printf("%d * %d = %d\n", 2, 3, 6);
 printf("%d * %d = %d\n", 2, 4, 2*4);

 return 0;

}


결과

2 * 3 = 6
2 * 4 = 8




'C 프로그래밍' ~51P



'gamE > C' 카테고리의 다른 글

C - Chapter 3. 변수와 연산자  (0) 2010.01.22
C - Chapter1. 이것이 C언어다.  (1) 2010.01.19
Posted by 생선날개