심화반 예제 (오목)

이미지
오목을 C++로 구현해 보았습니다. 대학교 과제로 교수님들이 많이 내는  주제입니다. 간단해 보이지만 막상 만들어 보면 그리 간단하지 않습니다. 바둑돌을 바둑판 바깥에 두었을 경우, 바둑판의 교차선위에 돌이 정확하게 놓아져야 하는 문제 등을 잘 해결해야 합니다. 판정처리에 대한 부분은 비교적 쉽습니다. 2차원 배열에서 5개 돌의 연속을 찾아서 처리하면 되지만, 가로, 세로, 대각선 방향의 판정을 모두 고려해서 판정해야 합니다. 심화반 중학생 한명이 오목 판정후 복기 기능까지 넣어서 만든 것을 보고 깜짝 놀랐습니다. 개발 과정을 요약하면 다음과 같습니다. 1. 바둑판을 19X19 크기 2차원 배열로 생성 (각 상태는 빈곳, 흑돌, 백돌 인지 3가지 값을 가짐) 2. 마우스 클릭시 현재 클릭한 화면 좌표가 바둑판의 선이 교차하는 지점에 놓아지도록 가장 가까운 배열의 인덱스를 찾는 알고리즘 구현 (바둑 돌은 바둑판의 클릭 지점에 놓이는 것이 아니라 바둑판 선의 교차점에 놓아져야만 함) 3. 흑돌, 백돌의 순서대로 놓아지도록 상태 저장, 한번 돌을 둔 곳은 다시 돌이 겹칠 수 없도록 체크 필요 4. 돌을 둘 때마다 가로, 세로, 대각선(좌상->우하, 우상->좌하) 방향에 같은 색의 바둑돌이 5개 연속되는지 검사 개발환경 : Microsoft Visual Studio 2015, Windows 10 Pro 64bit 개발언어 : C++, MFC 핵심 적용 기술, 환경  Device Context, GDI, Double Buffering (깜빡임방지) SDI (Single Document Interface) Windows Message (Timer, Mouse) 2차원 배열 (맵 구현) 돌을 놓았을때 가장 가까운 바둑판의 교차선에 놓는 문제 바둑판의 크기 변경

심화반 예제 (스네이크 게임)

이미지
구글에서 "스네이크 게임"으로 검색하면 나오는 게임을 C++로 구현해 보았습니다. 게임의 규칙은 뱀을 이동시켜 랜덤하게 등장하는 먹이를 먹으면 꼬리가 한 칸 길어지는 방식입니다. 다만 뱀이 현재 진행하는 방향의 반대쪽 (오른쪽인 경우 왼쪽)으로 이동은 불가합니다. 뱀 자신의 머리가 자신의 몸통과 부딪히는 경우는 게임종료, 맵 밖으로 뱀머리가 나가도 게임 종료됩니다. 이 게임의 팁이라면 뱀의 마디가 길어질수록 맵의 바깥쪽으로 뱀을 이동시켜 안쪽으로 향하도록 하는 것이 유리합니다. 전체 설계 과정은 아래와 같습니다. 1. 배경 맵으로 표현될 2차원 배열 만든 후, 각 셀의 좌표를 모두 저장 (차후 뱀에 해당하는 사각형을 그리기 위해) 2. 뱀의 위치를 기록해둘 좌표(배경 맵 배열의 인덱스)를 연결리스트로(std::list)로 선언 3. 게임 시작시 최초 3마디의 뱀의 좌표(배경 맵 배열의 인덱스)를 생성 후 이동 시작 4.  키보드의 상,하,좌,우 키 입력에 따라 뱀의 인덱스 위치를 변경. 상(행 감소), 하(행 증가), 좌(열 감소), 우(열 증가) 5. 뱀의 머리 좌표가 뱀의 몸통좌표에 닿았거나, 배경 맵의 위치를 벗어나지 않았는지 검사. 6. 실행흐름을 생성(쓰레드)해 마지막 키보드 방향으로 뱀을 계속 이동(배열 인덱스 변경). 7. 이동 후 바뀐 뱀의 좌표를 계속 사각형으로 그리기 마지막으로, 게임 성공 판정은 코드로 구현하지 않았습니다. 주석이 잘 되어 있으므로, 직접 한번 구현해 보는 것도 나쁘지 않습니다. ^^ 개발환경 : Microsoft Visual Studio 2015, Windows 10 Pro 64bit 개발언어 : C++, MFC 핵심 적용 기술, 환경  Device Context, GDI, Double Buffering (깜빡임방지) SDI (Single

수학의 벡터를 이용한 예제

고등학교 수학에서 배우는 벡터 (크기와 방향을 모두 가지는 어떠한 양) 를 이용해 몇 가지 예제를 C++로 구현해 보았습니다. 1. 속도와 가속도를 이용한 벡터 모션 마우스 위치를 타겟으로 멀어지면 가속도가 증가하고 가까워지면 가속이 느려지도록 만들어 보았으며, 게임에서 유도무기 등의 알고리즘으로 많이 쓰입니다. 2. 바람, 중력, 힘, 마찰력을 이용한 벡터 모션 뉴턴의 운동법칙을 코드로 비슷하게 구현해 보았으며, 약간의 바람의 힘을 오른쪽으로 가했을 경우 입니다. 3. 공기 및 유체 저항을 이용한 벡터 모션 뉴턴의 제 2 법칙 가속도는 힘을 질량으로 나눈 값과 같습니다. (A = F / M) 가속도는 물체의 질량이 작을 수록 빨리 가속하지만 아래 예제에서는 항력으로 인해 유체에서 점점 느리지는 가속을 구현해 보았습니다.  너무 질량이 작은 물체는 유체의 표면 장력으로 튕겨나간 후 다시 유체로 들어가게 됩니다. 개발환경 : Microsoft Visual Studio 2015, Windows 10 Pro 64bit 개발언어 : C++, MFC 참조 문헌 : 칸 아카데미, 다니엘 쉬프만(Daniel Shiffman)이 저술한 "The Nature of Code"

상담 시 많이 받는 질문 정리

안녕하세요. 오션코딩학원장 김주원입니다. 요즘은 벌써 여름이 끝나가는 기분이 드는 시원한 날씨입니다. 상담시 많이 물어보시는 내용을 한 번 정리해 보았습니다. 1. 교육대상 초등학교 2학년 부터 성인까지 수업하고 있습니다. 2. 교육비 엔트리 수업은 월 130,000 원, C++, 파이썬, 윈도우 프로그래밍, 심화반 수업은 월 150,000 입니다. 교육비 외 추가 비용은 없습니다. 3. 교육시간 엔트리 수업은 주 2회 수업을 실시하고 있으며 1회 수업은 60분입니다. (주말반은 주 1회 120분) C++, 파이썬, 윈도우 프로그래밍, 심화반 수업은 주 1회 120분 수업입니다. 모든 수업은 횟수는 다를 수 있으나 월 480분(4주 수업) 기준입니다. 4. 교육과정 엔트리는 초등학생 대상 이며, 블록프로그래밍 언어와 아두이노 보드를 이용해 소프트웨어 교육을 실시합니다. C++은 중,고, 성인 대상 이며, 강의서적과 Microsoft Visual Studio 2015를 이용해 C++ 프로그래밍 언어에 대해 전반적인 교육을 실시합니다. 파이썬은 초등 고학년, 중, 고, 성인 대상 이며, 강의 서적과 Microsoft Visual Studio 2015, 파이썬 언어를 이용해 파이썬의 기본문법과, PyQt를 이용한 GUI과정에 대한 교유을 실시합니다. 윈도우 프로그래밍 과정은 중, 고, 성인 대상 이며, 강의서적과 Microsoft Visual Studio 2015, C++ 언어를 이용해 윈도우 운영체제에서 소프트웨어를 개발하는 방법에 대한 교육을 실시합니다. 심화반 과정은 기본적인 프로그래밍 과정을 이수한 수강생, 또는 기본 프로그래밍 지식을 가진 수강생을 대상 으로 하며, 스스로 주제를 정하고, 주제를 완성하기 위한 개발과정을 문서화 한 후, 선생님과 함께 내가 만들고 싶은 주제를 완성시켜나가는 방식의 수업입니다. 5. 수업시간표 수업시간표는 매월 바뀌며, 사전에 공지드리고 있습니다. 한번 등록한 시간은 거

심화반 예제 (팩맨)

이미지
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) Wi

심화반 예제 (그림판)

이미지
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개 생성

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)