'프로그래밍 기초'에 해당되는 글 57건

  1. 2010.06.10 영향력 분포도
  2. 2010.05.25 문자열 포인터
  3. 2010.05.25 2차원 포인터 배열
  4. 2010.05.25 배열포인터의 특징
  5. 2010.05.20 2차원 배열포인터와 대상체
  6. 2010.05.19 배열과 포인터
  7. 2010.05.19 포인터란?
  8. 2010.05.14 연결리스트를 이용한 이진트리의 순회방법
  9. 2010.05.14 트리의 배열표현 방법
  10. 2010.05.14 큐 만들기

시작할 때 밭을 구성할 때 쓰면 괜찮을 것 같은 알고리즘
이것 역시 가능한지 더 조사해봐야함~


영향력분포도 기법 – AI 에이전트가 세계에 대해 지니고 있는 지식을 공간적으로 표현한 것으로, 게임 환경의 물리적/지형적 표현과 현재의 게임 상태(유닛 배치 등등)에 기반해서 전략적 결정에 필요한 정보만을 적절히 추출한 것이다.

 

영향력분포도의 이점

1.     어디에 유닛들을 배치할 것인지, 적이 어디에 있는지(또는 어디쯤에 가면 찾을 수 있는지 알 수 있다)

2.     두 객체 사이에 전선 어디이고 가장 격력한 전투가 벌어지는 또는 벌어질 만한 곳은 어디인지 같은 전략/전술적으로 매우 유용한 정보를 얻을 수 있다.

3.     지형 지물에 관한 정보도 제공할 수 있다.(전술적 가치가 가장 높은 지점이라던가 방어의 허점이 될 만한 지점, 매복 할 지점 등을 제공 받을 수 있다.)

 

간단한 영향력분포도

-       게임이 시작되면 모든 칸들은 0으로 초기화 된다.

-       그리고 각 칸에 대해, 그 칸이 가질 수 있는 영향력 값이 배정된다.

-       전투의 효율성을 영향력 값을 간주하며, 아군 유닛은 양, 적군은 음의 값을 가진다고 한다.

 

 

 

 

 

 

+2

아군

 

 

 

 

 

-1

적군

-1

적군

 

 

 

<초기의 영향력분포>

 

 

 

 

 

 

+0.7

+1

+0.7

+0.35

+1

+2

아군

+1

+0.5

+0.7

+1

+0.7

+0.35

+0.35

+0.5

+0.35

+0.24

<영향력의 전파>

 

 

0.51

0.79

0.47

0.06

0.66

1.66

0.53

-0.06

0.07

0.40

0.03

-0.74

-0.74

-0.17

-0.25

-0.39

<최종적인 영향력분포도>

 

-       이 분포도를 보면 아군과 적군의 역관계를 확실히 알 수 있다.

-       음의 값과 양의 값이 맞부딪히는 칸들을 이으면 전선이 된다.


참고 - GameProgramming Gems2

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전알고리즘(2)  (0) 2010.06.21
유전 알고리즘  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
Posted by 아몰라

char형 포인터를 선언하였다.
문자열에 대한 간단한 이해를 해보자.

char *temp_p;
char temp;

 temp_p =  'a'; //'a'는 문자로서 아스키코드로 숫자화되있다. 이것을 temp_p에 반환하는것은 말이안된다. temp_p는 주소만을 받는 포인터이다.
 temp_p = "a";

 temp = 'a';
 temp = "a"; //문자열을 반환하게되면 첫번째 문자열이 저장된 첫번째 위치의 주소값이 반환되는데 temp는 char형이기 때문에 값을 받을 수 없다.



'프로그래밍 기초 > C포인터' 카테고리의 다른 글

2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라


출처 - 다시 체계적으로 배우는 C언어 포인터

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라
이런식으로 접근해서 2차원배열을 포인터를 이용해 사용할 수도 있다.

 int *temp;
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
temp = temp_array;      //temp는 4바이트 대상체를 가르킬수 있는 포인터 변수이다. temp_array는 배열명으로서 대상체의 크기가 24인 2차원배열이다. 오류난다.

 temp = &temp_array[0][0]; //&temp_array[0][0]는 2차원배열의 첫번째 주소를 가르키고 대상체가 4바이트이므로 성립한다. 성립한다.



다음은 연산과 연산 후 역참조 할 때의 차이점이다.
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<temp+0<<endl;
 cout<<*(temp+0)<<endl;
 cout<<sizeof(temp+0)<<endl;
 cout<<sizeof(*(temp+0))<<endl;
 cout<<temp+1<<endl; 
 cout<<*(temp+1)<<endl;
 cout<<sizeof(temp+1)<<endl;
 cout<<sizeof(*(temp+1))<<endl;


포인터에서  +1 연산을 하였으므로 8크기만큼 이동한다. (2차원배열포인터이기때문에) 만약 그냥 1차원 포인터였다면 4만큼 이동하였을꺼다. 그리고 *연산을 하게되면 값을 취하게 됐을것이다.
하지만 여기선 *를 하게 됨으로 대상체가 행 전체로 바뀌게되면서 사이즈가 8로 바뀌는것을 볼 수 있다.
(temp+1)은 그냥 주소+정수 해서 연산을해서 주소위치만 바뀌었을뿐 이다. *(temp+1)을 함으로써 대상체가 바뀌게 된다. 즉, temp+1행을 가르키게 된다.
(가르키고 있는 주소는 보는바와 같이 같다. 단, 대상체가 다를뿐)



 포인터 접근순서
int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
 temp = temp_array;
 
 cout<<*(*(temp+2)+1)<<endl;

+2를 함으로 3번째 행에 접근하였고 *연산을 하여서 해당 행을 가르키고있다. +1연산을 하여 해당 행에 2번째 열의 주소에 접근하였고 *연산을 하여 값에 접근하였다. 그래서 9가 출력된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

2차원 배열 포인터란 2차원 배열을 담는 포인터이다.

 int temp_array[3][2] = {{0,1},{3,5},{7,9}}; //2차원 배열
int (*temp)[2]; //2차원 배열포인터

temp = temp_array;

2차원 배열은 이렇게 2차원 배열포인터를 이용해서 가르킬수 있다.


아래서는 대상체에 대해서 개념을 이해해보자.
대상체란 말 그대로 가르키는 대상이 무엇이냐인데 아래를 보자.

int (*temp)[2];
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 
1. temp = temp_array;
2. temp = temp_array[0];
3. temp = &temp_array[0][0];

위와 같이 실행하게되면 되야 된다고 생각할 수 있지만 1번만 성립된다.
왜냐하면...여기서 대상체에 대한 이해가 필요하다.
우선 1,2,3번은 주소값은 모두 같다.

1번은 temp는 2개의 대상체를 가진 값을 가르킬수 있는 포인터이고 temp_array는 2차원 배열의 배열명이기 때문에 당연히 성립한다.

문제는 2번과 3번인데

2번은 temp_array[0]같은 경우 행을 대표하는 것으로서 대상 체가 1번과 같이 배열 전체가 아니라 해당 행 전체인 것이다. 그러므로 temp가 가르킬 수 없는 것이다.

3번 같은 경우도 비슷하다. &temp_array[0][0]는  대상체가 temp_array[0][0]여서 불가능하다.




이번엔 더 분명하게 대상체에 대해서 sizeof를 통해서 알아보자.

int (*temp)[2]; //*temp는 2개의 대상체를 가지고있는 배열을 가르킨다 라고 생각하자.
 int temp_array[3][2] = {{0,1},{3,5},{7,9}};
 

 temp = temp_array;

 cout<<temp_array<<endl;
 cout<<temp_array[0]<<endl;
 cout<<&temp_array[0][0]<<endl;

 cout<<sizeof(temp_array)<<endl;
 cout<<sizeof(temp_array[0])<<endl; 
 cout<<sizeof(&temp_array[0][0])<<endl;

이렇게 모두 주소가 같지만 다른 메모리 크기가 나오는것을 확인할 수 있다.






 

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
배열과 포인터  (0) 2010.05.19
포인터란?  (0) 2010.05.19
Posted by 아몰라

우선 간단히 배열이란 무엇인지 생각해봐야한다.

int temp1;
int temp2[10];

temp라는 변수명을 가진 변수는 4바이트지만
temp2는 하나의 변수명으로 무려 10개의 int형 변수를 10개를 만든 것이다.


배열의 특징 세가지를 정리하면

1. 배열명은 주소를 뜻한다.

2. 배열명은 배열의 첫번째 배열 요소의 주소를 뜻한다.

 int temp_array[3] = {1, 3, 5};
 int *temp;

 temp = temp_array;

 cout<<*temp<<endl;
 cout<<*(temp+1)<<endl;
 cout<<*(temp+2)<<endl;

 cout<<temp_array<<endl;  //배열명을 출력해보았다. 주소가 나온다.
 cout<<temp_array+1<<endl;
 cout<<temp_array+2<<endl;

 cout<<*temp_array<<endl;  //이렇게 배열명을 역참조를 해보면 값이 나온다.
 cout<<*(temp_array+1)<<endl;
 cout<<*(temp_array+2)<<endl; 



위와 같이 포인터랑 배열에 +1같은 연산을 함으로서 첫번째 배열에 있는 값이 아닌 값을 참조 할 수도 있다.


또 추가적으로

 cout<<&temp_array<<endl;
 cout<<&temp_array+1<<endl;
 cout<<&temp_array+2<<endl;

이렇게 해보면 배열명에 주소에 접근한뒤 +1 이나 +2를 하면 주소값이 12씩 증가하게 되었다.
즉, 배열명의 크기만큼 증가하게 되었다.

근데 의문이 가는게 &temp_array+1 과 temp_array+1 이 값이 다르게 나오는게 이해가 가지않는다.
temp_array랑 &temp_array는 배열명이기 때문에 어차피 똑같은 주소(0012FF58)가 나오는데 그 주소에서 +1을 하면 둘다 같아야 되는게 아닌가? 누군가에게 물어봐야겠다 -_-


3. 배열명에는 주소를 할당 할 수 없다. 배열명은 포인터변수가 아니라 배열명 자체일 뿐이다.

말 그대로 할당 할 수 없다

temp = temp_array;
temp = temp_array+1;
가능하다. 포인터에 배열의 주소값들이 들어갈수있을것이다.

temp_array = temp;
temp_array = temp+1;
불가능하다. 배열에는 포인터가 아니라 값이 들어가야 한다.


--------------------------------------------------------------------------------------------------------
알아본 결과 예전에는 temp_array 는 배열 상수일뿐이고 저장된 영역이 없기때문에 출력하라는거 자체가 말이 안되서 오류가 났다고 한다. 하지만 ANSI에서 배열명에 &연산자를 허용해주어서 에러가 안나는것이라 한다.
그러므로 &temp_array 자체가 말이안되는 것이다.  temp_array+1은 첫번째 주소에서 자료형크기만큼 &temp_array+1 는 배열명 크기만큼 커진다는 것만 이해해야겠다.

&temp_array는 어떠한 대상을 가르키고 있는것이 아닌 그냥 주소값일뿐 그래서 sizeof를 하게되면 4가나오게된다.

'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
포인터란?  (0) 2010.05.19
Posted by 아몰라

포인터란?

포인터
는 번지에 대한 기호화된 표현을 말한다.

즉, 주소를 말한다고 할 수 있다.

int temp;

temp라는 이름을 가진 변수가 선언되면

int형은 4바이트 메모리로 시스템이 할당을 해주고

각 바이트들은 다 주소가 있게 마련이다.

그 주소들이 포인터가 되는것이다.


포인터변수란?

말 그대로 포인터들을 담는 변수가 되는 것이다.

포인터변수에는 주소들만 저장할수 있게된다.

예를 들어 int *temp 이런식으로 포인터변수 정의를 할수 있는데

이렇게 되면 정수가 저장된 곳의 위치를 가르킬 수 있게 되는 것이다.

그러므로 temp = 5; 이런식의 표현은 되지않는다.

 int *temp;
 int t = 2;

 temp = &t;

cout<<*temp;  이런식으로 하면 temp포인터변수가 가르키고있는 값 2가 출력하게된다.

cout<<temp;  temp포인터변수에있는 가르키고있는 포인터가 출력된다. 즉, 주소가 출력된다.

cout<<&temp; temp포인터변수에 주소가 출력된다.

물론 주소는 4바이트니까 연속적으로
0x12FF60
0x12FF61
0x12FF62
0x12FF63
저장되지만 &temp로 출력을 하게되면 가장앞에 주소(60)가 출력되게된다.



포인터를 사용하므로서 생기는 장점은 차차 포인터를 정리하면서 마지막에 정리하겠다.

p.s  아 그리고 포인터들은 int *temp; 나 char * temp 나 다 4바이트씩 메모리를 가지게된다.






'프로그래밍 기초 > C포인터' 카테고리의 다른 글

문자열 포인터  (0) 2010.05.25
2차원 포인터 배열  (0) 2010.05.25
배열포인터의 특징  (0) 2010.05.25
2차원 배열포인터와 대상체  (0) 2010.05.20
배열과 포인터  (0) 2010.05.19
Posted by 아몰라

연결리스트를 위해 구조체를 정의하였다.


typedef struct TreeNode{
char * data;
struct TreeNode * left;
struct TreeNode * right;
}TreeNode;

그리고 3가지의 순회방법이 있는데

전위, 중위, 후위가 있다.

전위는
root-left-right
중위는
left-root-right
후위는
left-right-root


트리구조는 이렇게 만들었다.


순회를 시키면
이런 순으로 트리를 순회하는 것이다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

유전 알고리즘  (0) 2010.06.10
영향력 분포도  (0) 2010.06.10
트리의 배열표현 방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
Posted by 아몰라

우선 이진트리란 루트노드가 있으면  하나의 루트노드당 왼쪽노드와 오른쪽노드 두개의 노드만 있을 수 있는 트리 구조이다.

배열로 이진트리를 표현하는 방법은 부모 노드의 인덱스가 i라하면
왼쪽자식노드는 [i*2] 오른쪽자식노드는[i*2+1]이 된다.

반대로 자식의 부모를 알아볼려고 할 때는 [i/2]를  하여서 나온 몫이 부모가 되게 된다.
그러므로 루트노드는 1부터 시작한다. 아무리 나눠도 0으로 나눌수 없기 때문이다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

영향력 분포도  (0) 2010.06.10
연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
큐 만들기  (0) 2010.05.14
스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
Posted by 아몰라

큐는 스택과는 다르게 FIFO 방식으로 먼저 들어온 녀석이 먼저나가는 방식이다.

그냥 일반큐를 만들어보았다.

구조체를 이용해 front, rear, count, q 를 하나로 통합시켰다.

typedef struct{
 int q[QueueSize+1];
 int front;
 int rear;
 int count;
}queue;


front에서는 Dequeue할 원소를 가르키고 있고 rear에서는 삽입할 자리를 가르키고있다. 또 count를
이용해 Deque나 Enqueue가 가능한지 확인하도록 사용하였다.

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

연결리스트를 이용한 이진트리의 순회방법  (0) 2010.05.14
트리의 배열표현 방법  (0) 2010.05.14
스택만들기  (0) 2010.05.13
LCD 디스플레이  (0) 2010.05.13
여행(The Trip)  (0) 2010.05.11
Posted by 아몰라
이전버튼 1 2 3 4 5 6 이전버튼