MFC 기반 팩맨게임 만들기

이미지
1980년 5월 일본의 남코라는 회사에서 만든 팩맨 게임을 C++을 이용해 만든 예제입니다. 심화반 고등학생이 정한 주제를 저도 함께 만들어 보았으며, 생각보다 좀 어려웠습니다. 기억나는 몇 가지 어려웠던 부분은, 맵의 크기를 너무 작게 설정하면, 팩맨과 적군의 움직임을 부드럽게 표현하기 어려워, 개발 도중 배경맵의 크기를 키운점. 적군이 팩맨을 추격하는 간단한 인공지능 만들기. 적군이 팩맨에게 죽었을때 적군아지트로 이동시키기 위해 경로 탐색알고리즘이 필요했던 부분 등. 개발 과정을 요약해 정리해 보겠습니다. 1. 배경 맵을 2차원 배열로 만들어 각 셀 별로 상태를 저장 (빈곳, 벽, 먹이가 있는 곳 등) 2. 그래픽을 처리하기 위해 각 셀의 좌표를 모두 저장 (팩맨, 벽, 빈공간, 적군, 먹이, 등을 그리기 위함) 3. 적군과 팩맨을 위한 부모 클래스 생성(추상화 클래스) 4. 적군, 팩맨 자식 클래스를 상속을 통해 구현 (자신의 좌표, 팩맨의 공격모드 인지 저장 등) 5. 게임 시작시 팩맨과 적군을 배치하고 남는 공간에 먹이를 배치 6. 팩맨의 이동을 키보드 이벤트를 통해 처리 (현재 위치의 좌표에서 다음 이동방향으로 이동가능한지 판단 후, 벽이아니라면 좌표이동 등) 7. 적군의 이동을 만들어 내기 위한 2가지 알고리즘 생성 (확율에 기반한 팩맨 쫓아가기, 적군이 아지트에 있는 경우는 아지트 탈출하기) 8. 팩맨과 적군의 접촉 감지 (팩맨은 큰 먹이를 먹으면 적군을 잡아먹을 수 있으므로 상황에 맞...

처음 접하는 프로그래밍

이미지
처음 프로그래밍을 접할 때 어렵다고 느낄 수 있습니다. x 프로그래밍을 하려면 컴퓨터에 명령하기 위해 프로그래밍 언어(C++, JAVA, 파이썬 등)를 배워야 하고,  이는 영어, 독일어 등 외국어를 배우는 것과 비슷하지만 문법적으로 조금만 틀려도 컴퓨터는 못 알아 듣고 에러를 출력하죠. 영어를 잘 못해도 외국인과 이야기 할 때는 표정이나, 손짓, 등을 통해 얼마든지 내 뜻을 표현 할 수 있지만, 컴퓨터는 이런 융통성이 부족합니다. 조금만 프로그래밍 언어의 문법에 어긋나면 (예를 들어 마침표를 찍지 않는다던지..) 바로 알아 듣지 못합니다. 사실 조금만 프로그래밍 언어에 익숙해 지면 위에서 말한 코드의 문법적 오류는 쉬운 범주에 속하는 오류라는 걸 알게되죠. 프로그래밍 언어로 만든 코드는 컴파일 과정을 거쳐 기계어에 가까운 형태로 변경되어 실행되는데 , 이 컴파일 과정에서 실수로  잘 못 작성된 코드의 문법적 오류는 컴파일러가 바로 알려주므로 조금만 익숙해지면 금방 찾을 수 있습니다. 찾기 어려운 오류는 코드 작성 시 (컴파일타임 이라고 합니다)에서 일어나는 오류가 아니라, 실행 시 (런 타임이라고 합니다) 일어나는 오류입니다. 단순한 문법적 오류가 아니라 의미상 오류(문법이 맞았지만 결과...

심화반 예제 (테트리스)

이미지
모르는 사람이 없는 테스리스 게임 소스코드, 설치파일을 소개합니다. 테트리스 게임은 1984년 구 소련의 프로그래머 알렉세이 퍼지노프가 만든 게임이라고 합니다. C++로 만든 과정은 아래와 같습니다. 1. 테트리스 블록들(총 7가지 모양)을 2차원 배열(4x4)로 만든 후 각자의 모양을 bool 타입의 변수에 저장합니다. 2. 테트리스 맵이 될 2차원 배열을 만들어 (가로 20, 세로 10) 각 셀의 배열의 위치 정보를 저장해 둡니다. 3. 프로그램 시작시 랜덤함수를 이용해 떨어질 도형 모양의 번호를 구한 후, 각 도형모양에 맞는 블록을 맵의 가장 위쪽 좌표에 그려줍니다. 4. 한단계식 아래로 이동시킵니다. (Y축의 배열 인덱스를 증가) 5. 키보드 방향키 (좌, 우)를 누르면, 떨어지는 도형의 배열을 회전 시켜 다시 그립니다. 6. 맨 아래 바닥에 닿았거나 또는 블록에 닿을때까지 계속 아래로 이동하다가 해당 조건을 만족하면 도형의 위치정보를 맵에 기록해 둡니다. 7. 3번 ~ 7번 과정을 반복합니다. 8. 만약 블록이 안착(?) 했다면 한 줄(행)이 모두 도형으로 채워졌는지 검사하고, 맞다면 해당 줄의 도형정보를 삭제한 후, 위에 쌓여진 도형들은 6번의 과정을 거쳐 아래로 내려줍니다. 실제 코드로 구현한 클래스 다이어 그램입니다. 좀 더 자세한 내용은 링크된 소스코드를 참조해서, 한번 만들어 보시기 바랍니다. 생각보다 어렵지만, 테스리스 역시 프로그래밍 공부하기 좋은 예제입니다. 버그가 있다면 알려주세요. ^^ 개발환경 : Microsoft Visual Studio 2015, Windows 10 Pro 64bit 개발언어 : C++, MFC 핵심 적용 기술, 환경  Device Context, GDI, Raster Operation, Double Buffering (깜빡임방지) SDI (Single Document Interface)...

심화반 예제 (그림판)

이미지
C++, MFC 과정을 수료 후, 심화반 학원생들이 가장 처음 만드는 그림판 프로젝트의 소스코드와 설치파일을 소개합니다. 제가 대학교 3학년 때 학과 수업으로 진행했었던 프로젝트이며, 윈도우즈 프로그래밍을 처음 접하는 개발자가 공부하기 좋은 예제입니다. 개발환경 : Microsoft Visual Studio 2017, Windows 10 Pro 64bit 개발언어 : C++, MFC 핵심 적용 기술, 환경  Device Context, GDI, Raster Operation SDI (Single Document Interface) Windows Message (Mouse, Command Message) 첨부파일  설치파일 (Installshield로 제작된 설치파일, 클릭)  소스코드 (C++ 소스코드, rar 압축파일형태, 클릭) 구글아이디로 로그인하면 다운로드 가능합니다. ...

2017 카카오 신입공채 1차 테스트 2번 문제

이번에는 2번 문제 풀이 입니다.  문제를 풀면서 출제자가 얼마나 고민해서 문제를 만들었을지 느껴졌습니다. 문제에 대한 상세 설명은 카카오블로그 를 참조 바랍니다. 2번 문제는 C++ 11에 새롭게 추가된 정규표현식을 이용해서 만들어 보았습니다 #include #include #include using namespace std; // 다트 점수 3회 const int n = 3; enum DARTITEM {DART_SCORE, DART_BONUS, DART_OPTION}; struct dartResult { int score; char bonus; char option; }; void tokenizing(string str, regex reg, DARTITEM item, dartResult dart[]); void print(dartResult dart[]); void calcscore(dartResult dart[]); int main() { while (1) { string str; cout << "다트 결과 문자열을 입력하세요 (종료는 0) : "; getline(cin, str, '\n'); if (str == "0") break; regex score("((10|[0-9])[S|D|T][*|#]?)+"); if (regex_match(str, score)) { dartResult dart[n]; for (int i = 0; i < n; i++) { dart[i].score = 0; dart[i].bonus = 0; dart[i].option = 0; } tokenizing(str, regex("(10|[0-9])"), DART_SCORE, dart); tokenizing(str, regex("[S|...

2017 카카오 신입공채 1차 테스트 1번 문제

최근에 웹서핑을 하다 흥미로운 자료을 발견했습니다. 바로 2017년도 카카오 공채 1차 코딩테스트 문제. 카카오 블로그 에 방문해보면 해당 입사 시험 문제에 대해 쉽게 이해하도록 설명하고 있습니다. 개인적으로 프로그래밍을 공부하는 사람이라면 당연히 도전해봐야겠죠. 대한민국에서 손꼽히는 프로그래머 집단에서 출제한 문제인 만큼, 독창성과 함께 기업에서 어떤 프로그래밍 지식을 요구하는지 짐작해 볼 수 있는 좋은 기회가 될 거라 생각합니다. 전체 7문항이며 5시간 안에 4문제 이상을 풀면 1차 통과입니다. 아래는 그 중 가장 난이도가 낮은 1번 문제 입니다. 자세한 내용은 카카오 블로그 에서 참조하기 바라며, 제가 C++로 작성한 코드는 아래와 같습니다. #include #include using namespace std; const int n = 5; void printmap(const bitset map1[], const bitset map2[]) { // 결과 저장용 5비트 비트셋 배열 5개 bitset resultmap[n]; for (int i = 0; i < n; i++) { // 비트 OR 연산 resultmap[i] = map1[i] | map2[i]; for (int j = n-1; j >= 0; j--) { // OR연산 결과 0이면 공백, 아니면 # 출력 if (resultmap[i][j] == 0) { cout << ' '; } else { cout << '#'; } } cout << endl; } } int main() { // 10진수 5가지를 정수형 배열에 저장 int arr1[] = { 9, 20, 28, 18, 11 }; int arr2[] = { 30, 1, 21, 17, 28 }; // 5비트 비트셋 배열 5개, 각 2개 생성...

교육 과정 안내 (세부 내용)

이미지
학원에서 교육중인 내용을 좀 더 상세히 안내 드립니다. [전체 과정 요약] [엔트리 초급 과정, 4개월] [엔트리 고급 과정, 4개월] [C++ 과정, 5개월] [윈도우 프로그래밍 과정, 5개월] [심화반 과정] 전체 과정 PDF 링크 감사합니다.

원장 프로필

이미지
약 15년간 현업에서 수행했던 주요 프로젝트와 이력을 정리해 보았습니다. 원장 프로필 (클릭) 구글 블로그는 첨부파일 업로드 할 수 없어 링크로 올렸습니다.

교육과정 안내

이미지
[학원 포스터] [학원 교육 과정 안내]

블록 프로그래밍 언어, 엔트리

이미지
제가 소프트웨어 개발자로 일하면서 사람들을 만나면 많이 듣는 이야기가 "와 어려운거 하시네요!" 입니다. 또 한가지는 "밤늦게 까지 일하시겠네요" 입니다. 그렇지 않습니다. 특히 어렵다는 이야기는 저는 어른들의 막연한 두려움, 고정관념이라고 생각합니다. 제 아이가 초등학교 1학년인데 제가 엔트리를 시험(?)삼아 한번 보여주고 가르쳐 준 적이 있습니다. 크게 기대하지 않았지만 정말 이해가 빠르더군요. 백문이 불여일견이라니 제가 한번 설명드려 보겠습니다. 엔트리는 실무에서 쓰이는 텍스트 기반 프로그래밍 언어가 아니라 아이들이 쉽게 그 개념을 이해할 수 있도록 고안된 블록 기반 프로그래밍 언어입니다 우리나라 과학기술정보 통신부 등 여려 기관이 힘을 합쳐 만들어 만든 무료 소프트웨어 입니다. 공짜니깐 꼭 댁에서 아이들과 함께 즐겁게 해보시길 추천드립니다. 먼저 엔트리는 다음 주소에서 온라인 실행 또는 오프라인 버전으로 무료 다운로드가 가능합니다. 컴퓨터나 태블릿 PC에서 사용가능합니다. 엔트리 : https://playentry.org 1. 회원가입은 하지 않아도 됩니다. (차후 작품저장이나 공유시는 필요합니다) 2. 위 메뉴에서 만들기 -> 작품만들기 버튼을 눌러 볼까요. 3. 다음은 아직 잘 모르지만 시작하기를 눌러 보아요 4. 위 화면의 엔트리봇 이라는 이미지 오브젝트가 움직이는걸 확인할 수 있습니다. 왜 움직일까요? 바로 아래와 같은 명령을 컴퓨터에 지시했기 때문입니다. 이 부분이 우리가 코딩한 소스코드이기 때문이죠. 한번 살펴보면 아주 아주 간단합니다. 1) 시작하기 버튼을 아까 눌러주었죠. 이것이 엔트리를 시작하는 명령입니다. 2) 10번 반복하기는 파란색 블럭안의 블럭을 10번간 반복해서 실행하라는 의미입니다. 3) 이동방향으로 10만큼 움직이기는 3번 그림에서  엔트리봇의 화살표를 의미합니다. 4) 10만큼은 3...

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기