목록프로그래밍 (42)
INDIES
auto의 의도치 않은 타입추론 대처하기item 5에서 auto가 굉장히 다양한 장점을 갖고 있다고 이야기했지만, 가끔씩 auto가 의도치 않은 방향으로 동작할 때가 있다. 가장 간단한 예로 std::vector이 있다.std::vector vb = {true, true, true}; auto vb2 = vb[2]; //vb2의 타입은 bool이겠지?안타깝지만 vb2의 타입은 bool이 아니다. std::vector의 경우 내부적으로 효율성을 위해 1비트당 하나의 값을 저장한다(bool은 1비트면 저장 가능하므로). 따라서 vb[2]같은 경우 어떤 지점에서 2비트 뒤의 주소 같은 건 가져올 수 없으므로 bool& 타입을 리턴하는 것이 아니라 std::vector::reference 타입을 리턴한다. 이 ..
auto를 쓰자!auto의 장점들auto를 이용하는 게 명시적으로 타입을 서명해주는 것보다 나은 점이 굉장히 많다.간결함auto를 쓰면 길고 복잡한 타입을 간단히 표기할 수 있으니 손가락도 덜 아프고 보기도 좋다. 특히 STL을 쓰다보면 iterator를 써야하는 경우가 굉장히 많은데 iterator 관련 타입들은 하나같이 타입 이름이 길어서 일일히 쓰다보면 지치기도 지치고 보기도 안 좋다. 이럴 때 auto를 이용하면 코드가 훨씬 깔끔해진다.template void f(It a) { typename std::iterator_traits::value_type currValue = *b; //극혐 }해당 반복자가 가리키는 값의 타입을 얻어 오기 위해선 위 코드처럼 굉장히 장황한 코드를 써야한다. 하지만 a..
추론된 타입 보는 법요즘 IDE는 워낙 성능이 좋아 auto, template등에서 타입이 어떻게 추론됐는지 궁금하다면 그냥 그 위에 마우스만 갖다대도 알려준다(visual studio).하지만 위 스크린샷에서도 볼 수 있듯이 std::vector가 std::vector라고 뜬다. 일반적으로 잘 쓰지 않는 형태의 타입으로 보여줄 때가 많기 때문에 어떤 타입의 경우 길이가 너무 길어져서 보기 힘들어진다.그럴 땐 아래 몇 가지 방법을 활용해보자.컴파일러 진단의도적으로 컴파일 에러를 일으켜서 추론된 타입을 확인하는 방법이다.//타입을 확인하기 위한 템플릿 클래스. template class TD; auto k = &v[3]; TD kType;위 코드에서 k의 타입이 궁금해 마우스를 올렸다간 아래 사진처럼 심히..
decltype 이해하기decltype의 동작 및 활용decltype은 declared type의 의미로 해당 식이 나타내는 타입을 그대로 돌려준다. 어떤 이름(name)이나 표현식(expression)을 decltype에 집어넣으면 decltype은 해당 이름이나 표현식의 타입을 알려준다.item 1,2에서 다뤘던 auto나 template에서의 타입 추론과 decltype이 다른 점은, decltype은 해당 표현식이나 이름의 타입을 있는 그대로 돌려준다는 점이다.const int i = 0; // decltype(i) => const int // decltype(&i) => const int* const int& ri = i; // decltype(ri) => const int& int f(int ..
Item 1,2parameter와 argument의 차이parameter(매개 변수)는 함수의 선언에 쓰이는 형식인수를 지칭하는 말이고, argument(인자)는 함수를 호출할 때 실질적으로 들어가는 실인수를 지칭하는 말이다.예시 코드void f(int a, int b); //a와 b는 parameter이다. int main() { int k = 5; f(k,3); //여기서 실제 함수 호출에 들어간 k와 3은 argument이다. } lvalue, rvalueC++에서 lvalue와 rvalue의 의미는 다음과 같다.lvaue : 일반적으로 할당될 수 있는 값을 의미한다. 해당 식이 끝나고 나서도 계속 남는 값이며, 주소를 가진다.rvalue : 일반적으로 할당될 수 없는 값을 의미한다. 식이 끝나면 ..
http://www.codingame.com/games 처음 프로그래밍 배울 때 꽤 재밌게 연습할 수 있는 사이트인 것 같다. 게임 구성이나 문제들이 프로그래밍을 상당히 흥미롭게 접할 수 있게 해주는 듯.
▲ 게임 파일 Global Game Jam이 언제 하는 지도 모르고 있다가 참가할 타이밍을 놓치고 나서야 친구한테 24일부터 Global Game Jam이 열린다는 걸 들었다. 근데 그냥 지나가긴 또 아쉽고 하여 그냥 혼자 게임잼한다고 생각하고 만 48시간 안에 게임 하나 완성하는 걸 목표로 열심히 달림. 결국 어째 어째 완성하긴 했다. 최우선 목표가 48시간 내에 완성하기였기 때문에 결과물이 썩 만족스럽진 않지만, 그래도 만 48시간 내에 플레이 가능한 게임을 만들어 내긴 했으니 이 정도면 충분하다고 생각함. 이번 게임잼 주제가 "What do we do?" 였는데, 내가 만든 게임은 핵전쟁 등으로 인해 멸망 위기가 된 인류를 슈퍼 컴퓨터의 입장이 되어서 인류가 멸망하지 않도록 잘 이끄는 게임이다. 컴..
도전! 초난문이라는 스마트폰 게임이 있다. 하루에 한 문제씩 어려운 문제가 주어지고 이 문제를 풀면 되는 굉장히 심플한 게임이다. 문제의 룰도 간단하다. 위의 그림과 같은 8x8의 보드에서, 상하좌우 4방향으로 흰색 블록을 옮기는 과정을 반복하여 모든 흰색 블록이 검은 테두리의 회색 블록에 들어가게 하면 된다. 말로 설명하는 것보다 한 번 플레이해보는게 이해하기 쉬우니 궁금하신 분들은 다운로드 추천. 다운 받기 귀찮으시다면 아래 동영상을 한 번 해보시면 바로 어떤 룰의 게임인지 이해할 수 있을 것이다. 이 걸 몇 번 플레이하다가, 갑자기 최단거리를 찾아내는 프로그램을 만들고 싶어져서 한 번 그 프로그램을 만들어 보았다. 1. 접근 방법 처음의 접근 방법은 심플했다. '목표에 도달할 때까지 각 step별 ..
1. cocos2d-x에서의 입력 처리1-1. keyboard 입력기본적으로 모든 cocos2d-x에서 입력에 관련된 처리는 event-driven 방식을 이용한다. 즉 각 클래스가 입력이 들어왔을 때 어떤 처리를 수행할지를 정의하는 콜백 함수를 만들어두고, 이 함수를 엔진에 등록하면 엔진이 게임 루프를 돌다 해당 입력이 들어왔을 때 자동으로 등록된 함수를 호출하여 각 클래스가 입력에 따른 처리를 수행할 수 있게 한다.Keyboard 입력 처리 함수의 원형void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event); void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode..
BattleShip Game AI 만들기 10. 몬테 카를로 알고리즘 이전 편에서 마지막에 언급했던 것처럼 우선 수학적으로 확실히 확률을 구해 배의 위치를 찾는 알고리즘을 만들어보았다. 처음에는 현재 배 상황에서 만들 수 있는 모든 종류의 게임판을 다 만들어 그 결과를 종합하여 확률을 계산하려 했으나, 만들어질 수 있는 게임판의 종류라는게 정말 말도 안 될 정도로 많아서(만들어서 돌려보니 한 게임 끝내는데 삼십분은 넘게 걸릴 듯 했다. 너무 길어서 중간에 껐지만.) 포기하고 몬테 카를로 방법을 이용해서 근사치를 구하기로 했다. 좀 자세히 설명하자면 현재 내가 알아놓은 보드 상황에 맞게 남아있는 적 배를 100번정도 배치해보고 이 배치해본 결과 값을 이용해 가장 확률이 높은 쪽을 찍는 것이다. 그럴싸하게 ..