
행동 트리 태스크 및 시퀸스이제 AI가 실제로 앞뒤로 이동하도록 만들어보자.이를 위해 행동 트리에서 태스크를 생성해주어야 한다.이번 강의에서는 단순 이동을 테스트 할 것이기 때문에 Move To 태스크를 사용해보자. 이렇게 생성한 태스크는 시퀸스 아래에 위치하게 된다.시퀸스 아래에 할당한 태스크들은 해당 시퀸스 차례가 되면 순서대로 할당된 태스크들을 실행하게 된다. Move To 태스크를 더 자세히 살펴보면 어디로 이동할 것인지 위치 설정이 가능하다.여기서 우리가 전에 만들었던 블랙보드 키를 이용하여 PlayerLocation 지정이 가능하다. 이동 후에 잠깐 멈췄다가 다시 이동하는 것을 원하므로 Wait 태스크도 생성해주자.Wait 태스크 또한 얼마나 멈출 것 인지에 대한 값 할당이 가능하다. 플레이어..
문제링크 : https://www.acmicpc.net/problem/12852 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int dp[1000001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=1; i 기본적인 초기화는 3번 조건에 해당하는 값으로 설정해준다.이에 따라 각 idx에 해당 하는 값은 idx-1의 횟수를 필요로 하므로 이에 맞게 초기화를 진행했다. 이후 1, 2번 조건에 대해 체크하며 더 작은 경우를 확인해준다.또 이어서 기존 3번 조건과 1, 2번 조건을..
문제 링크 : https://www.acmicpc.net/problem/2502 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int D, K;int A[31];int B[31];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> D >> K; A[0] = 1; A[1] = 0; //A, B B[0] = 0; B[1] = 1; for(int i=2; i 먼저 간단하게 규칙을 찾아보면 다음과 같다.i = 0A (= A*1 + B*0)i = 1B (= B*0 + B*1)i = 2A + Bi = 3A + ..
문제 링크 : https://www.acmicpc.net/problem/1263 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, a, b;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({b, a}); } sort(v.begin(), v.end(), greater()); //일을 끝내야 하는 시간이 큰 값부터 정렬 int cur = v[0].first - v[0].second; //현..
문제링크 : https://www.acmicpc.net/problem/3151 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> arr[i]; sort(arr, arr+N); ll result = 0; for(int i=0; i 3가지 합이 0이 되는 경우를 찾아야 한다.이를 위해 2가지 값을 고정 (2가지 값의 합) 시켜 놓고 나머지 1개의 값을 이분 탐색을 통해 찾아준다...
문제링크 : https://www.acmicpc.net/problem/2141#include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;ll sum = 0;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({a, b}); sum+=b; } sort(v.begin(), v.end()); ll tmp = 0; for(int i=0; i= (sum+1)/2) //정렬된 상태의 중앙값 출력 ..
문제링크 : https://www.acmicpc.net/problem/19598 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, B, C; //강의 갯수, 시작 시간, 종료 시간int cnt=1; //최소 강의실vectorv;priority_queue, greater> pq;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> B >> C; v.push_back({B, C}); } sort(v.begin(), v.end()); for(int i=..
문제링크 : https://www.acmicpc.net/problem/1374 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, A, B, C; //강의 갯수, 강의 번호, 시작 시간, 종료 시간int cnt=1; //최소 강의실vectorv;priority_queue, greater> pq;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> A >> B >> C; v.push_back({B, C}); } sort(v.begin(), v.end());..
문제링크 : https://www.acmicpc.net/problem/5545 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, A, B, C; //토핑 갯수, 도우 가격, 토핑 가격, 도우 열량int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> A >> B >> C; for(int i=0; i> arr[i]; } sort(arr, arr+N, greater()); //토핑 열량이 높은 순서대로 비교 int result = C/A; //1원당 열량 (최고)..
문제링크 : https://www.acmicpc.net/problem/20044 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N;int arr[10001];int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> arr[i]; } sort(arr, arr+2*N); //정렬 int score = MAX; for(int i=0; i 2*N 만큼 입력받고, 입력받은 값을 정렬시켜준다.이후 인덱스를 옮겨가며 배열의 양 끝값을 더해주고 이중 제일 작은..
문제링크 : https://www.acmicpc.net/problem/15970 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int x, y, N, dis;vectorv[5001];int arr[5001]; //색 갯수 저장int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> x >> y; v[y].push_back(x); arr[y]++; //색 갯수 카운팅 } for(int i=1; i 브루트포스 방식의 정렬문제이다.점과 색깔을 입력할 때, 입..

C++로 블랙보드 키 설정하기이제 블랙보드에서 게임플레이의 상태를 설정해서 AI가 그에 따라 행동할 수 있게 설정하는 블랙보드 키를 C++을 통해 직접 설정해보자.우선 블랙보드 창을 보면 다음과 같이 기본 키를 볼 수 있다. 그리고 VScode에서 GetBlackboardComponent() 함수를 통해 블랙보드 키 값을 설정하는 것이 가능하다.해당 함수를 사용하기 위해서는 관련 헤더를 포함시켜주어야 한다.해당 함수를 통해 플레이어의 위치를 벡터값으로 받아와보자. 이제 설정한 키를 새롭게 할당해보자.상단 New Key를 눌러서 할당하며, VScode 상에서 할당한 이름과 타입을 정확히 일치시켜주어야 한다.이후 실행을 시켜보면 해당 키에 다음과 같이 플레이어 위치 좌표가 뜨는 것을 볼 수 있다. 제대로 ..
문제링크 : https://www.acmicpc.net/problem/14469 #include using namespace std;typedef long long ll;typedef pair pii;const int MAX = INT_MAX;int N, a, b;vectorv;int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i=0; i> a >> b; v.push_back({a, b}); } sort(v.begin(), v.end()); int time = v[0].first + v[0].second; for(int i=1; i 간단한 정렬문제이다.처음 도착시간을 기준으로..

행동 트리 및 블랙보드언리얼에서 정교한 AI 행동을 위해서는 보통 행동 트리를 생성한다.이에 행동 트리와 여러 가지 변수를 저장하고 AI의 메모리와 비슷한 기능을 하는 블랙 보드도 같이 생성해주자. 이제 행동 트리를 확인해보면 다음과 같다. 우측 디테일 패널에서 생성했던 블랙 보드를 확인할 수 있고, 우측 상단에서 해당 블랙 보드 모드로 전환도 가능하다. 이제 해당 행동 트리와 블랙 보드를 통해서 우리가 기존에 구현했던 AI 기능을 구현하도록 할 것이다.이를 위해 기존에 작성했던 VScode의 내용은 주석처리해놓고, 행동 트리를 위한 변수를 하나 선언해주자. 해당 행동 트리를 실행하는 함수는 RunBehaviorTree이다.실행하기에 앞서 해당 행동 트리가 유효한 지부터 체크를 해주자. 그리고 언리얼로 ..

AI 시선 확인하기전 강의에서 AI 시선 문제와, AI의 시야에서 벗어나게 되면 더 이상 AI가 쫓아오지 못하도록 해보자.AI의 시야를 체크하기 위해서는 LineOfSightTo 함수를 사용하게 된다.해당 함수를 통해 AI가 다른 액터(플레이어)를 볼 수 있는 지 없는 지에 대해 체크하고 이를 bool 타입으로 반환하게 된다. 만약 보이는 대상(플레이어)이 있다면 해당 대상에 포커스를하고 해당 대상을 향해 움직이게 되고,만약 보이는 대상(플레이어)이 없다면 포커스를 지우고 움직임 또한 멈추게 하자. 포커스를 지우는 방법은 ClearFocus() 함수를 통해 할 수 있다.여기에 매개변수로 포커스 우선순위에 대한 값이 들어간다.우리는 기존에 GamePlay를 기본 우선순위로 사용했기에 해당 값을 넣어주게 된..