10월, 2018의 게시물 표시

심화반 예제 (오목)

이미지
오목을 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

이 블로그의 인기 게시물

Qt Designer 설치하기

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