10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

Similar documents
그래픽 프로그래밍

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

K&R2 Reference Manual 번역본

슬라이드 1

08장 윈도우에서의 그리기

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

C프로-3장c03逞풚

MFC 프로그래밍

C++ Programming

PowerPoint 프레젠테이션

슬라이드 1

BMP 파일 처리

歯Lecture2.PDF

C# Programming Guide - Types

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap05-제어문.pptx

윈도우시스템프로그래밍

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - chap10-함수의활용.pptx

제8장 자바 GUI 프로그래밍 II

OCW_C언어 기초

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

PowerPoint 프레젠테이션

PowerPoint Presentation

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

졸업논문 되어자전거의현재정보를알려주게된다 시스템의동작절차그림 3-1 리더에서의자전거정보조회동작절차위에동작절차에서알수있듯이리더에서하는동작절차에서는크게 부분으로나눌수있다 리더에서에너지를보내 로부터데이터가전송되면자전거의정보를확인한다 여기서도난당한자전거인

Lab 3. 실습문제 (Single linked list)_해답.hwp

윈도우 프로그래밍의 개념

Microsoft PowerPoint - chap01-C언어개요.pptx

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Programming hwp

chap 5: Trees

윈도우 프로그래밍의 개념

Windows 8에서 BioStar 1 설치하기

PowerPoint Presentation

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

chap01_time_complexity.key

Microsoft PowerPoint - es-arduino-lecture-03

03_queue

어댑터뷰

untitled

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

금오공대 컴퓨터공학전공 강의자료

윈도우시스템프로그래밍

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint - 11주차.pptx

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

슬라이드 1

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Java ...

Frama-C/JESSIS 사용법 소개

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

UI TASK & KEY EVENT

Microsoft PowerPoint - CPP_chap3

Chapter 4. LISTS

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

Microsoft PowerPoint - hci2-lecture11.ppt

윈도우 프로그래밍의 개념

Microsoft PowerPoint - chap06-1Array.ppt

신림프로그래머_클린코드.key

Chapter 4. LISTS

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

C++ Programming

PowerPoint Presentation

Microsoft PowerPoint - 07-Data Manipulation.pptx

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

설계란 무엇인가?

슬라이드 1

untitled

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

GDI 와 DC GDI (Graphics Device Iterface) 응용프로그램이하드웨어를제어할수있도록윈도우 OS 가제공하는모든기능 윈도우가출력장치에대한정보를스스로판단하고분석하여, 실제로사용할드라이버를불러옴 이를이용할경우, 하드웨어독립적인프로그래밍을할수있음 Widw

슬라이드 1

C 언어 프로그래밊 과제 풀이

chap x: G입력

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

PowerPoint 프레젠테이션

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

Microsoft PowerPoint - hci2-lecture11.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

09-interface.key

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

rmi_박준용_final.PDF

Chapter #01 Subject

Microsoft PowerPoint - chap06-5 [호환 모드]

설계란 무엇인가?

PowerPoint 프레젠테이션

Chapter 4. LISTS

03장.스택.key

제 1 장 기본 개념

Transcription:

10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다. (6) 둘다이동할수없으면, 경기가종료된다. (7) 가장많은세균을가진사람이이긴다. 10.2 기초지식 - 이벤트발생횟수를카운트한다. (0= 사람이이동준비, 1= 이동, 2= 컴퓨터가이동준비, 3= 이동 ) - 세균은그림판으로그린다. (50x50픽셀) - 컴퓨터는타이머함수를사용한다. - 컴퓨터는 brute-force방식으로이동위치를정한다. 10.3 새프로젝트를생성한다. - 프로젝트명 =Vacteria, 응용프로그램 =SDI, - 유니코드라이브러리사용 ( 체크해제 ) 또는프로젝트속성 -> 일반 -> 문자집합 = 멀티바이트 10.4 세균비트맵을그림판으로만들어리소스에등록한다. - Resource -> Import Vacteria.bmp -> IDB_BITMAP1 ( 빈칸, 세균 1, 세균 2, 세균 1, 세균 2 순서 ) 10.5 말판변수를선언하고, 초기값을넣어준다. public: int m_nvac[6][6]; enum VAC EMPTY, VAC_1, VAC_2, VAC_3, VAC_4 ; CVacteriaView::CVacteriaView() memset(m_nvac, EMPTY, sizeof(m_nvac)); m_nvac[0][0] = m_nvac[0][1] = m_nvac[1][0] = m_nvac[1][1] = VAC_1; m_nvac[4][4] = m_nvac[4][5] = m_nvac[5][4] = m_nvac[5][5] = VAC_2; 10.5 말판을그린다.

void CVacteriaView::OnDraw(CDC* pdc) CBitmap bitmap; bitmap.loadbitmap(idb_bitmap1); CDC memdc; memdc.createcompatibledc(pdc); memdc.selectobject(&bitmap); for (int i=0; i<6; i++) for (int j=0; j<6; j++) int x=50+50*j, y=50+50*i; pdc->bitblt(x, y, 50, 50, &memdc, 50*m_nVac[i][j], 0, SRCCOPY); for (int i=0; i<=6; i++) pdc->moveto(50, 50+50*i); pdc->lineto(50+50*6, 50+50*i); for (int j=0; j<=6; j++) pdc->moveto(50+50*j, 50); pdc->lineto(50+50*j, 50+50*6); memdc.deletedc(); bitmap.deleteobject(); 10.6 마우스의왼쪽버튼으로옮길세균과목표빈칸을지정한다. public: int m_ncount; CPoint m_ptmove1, m_ptmove2; enum TURN HUMAN_PREPARE, HUMAN_MOVE, COMPUTER_PREPARE, COMPUTER_MOVE ; CVacteriaView::CVacteriaView() m_ncount = 0; void CVacteriaView::OnLButtonDown(UINT nflags, CPoint point) int i = point.y / 50-1; int j = point.x / 50-1; if (i<0 i>=6 j<0 j>=6) return; // 말판바깥을찍으면 skip switch (m_ncount%4) case HUMAN_PREPARE: // 옮길세균을선택한다 if (m_nvac[i][j] == EMPTY) // 빈칸을찍으면안된다 m_ptmove1 = CPoint(j, I); m_nvac[i][j] += 2; // 모양을바꾼다 // 화면을갱신한다 case HUMAN_MOVE: // 옮길위치를선택한다 if (m_nvac[i][j]!= EMPTY) // 빈칸으로만옮겨갈수있다 if ((abs(i - m_ptmove1.y)>2) (abs(j - m_ptmove1.x)>2)) // 2칸이상은불허한다 m_nvac[m_ptmove1.y][m_ptmove1.x] -= 2; // 원래모양으로되돌린다 m_ptmove2 = CPoint(j, I); MoveVacteria(); // 세균을이동한후 // 화면을갱신한다 SetTimer(0, 500, NULL); // 컴퓨터는타이머함수를사용한다

10.7 세균을이동하는함수를만든다. public: void MoveVacteria(void); void CVacteriaView::MoveVacteria() int i1 = m_ptmove1.y; int j1 = m_ptmove1.x; int i2 = m_ptmove2.y; int j2 = m_ptmove2.x; int nvac = m_nvac[i2][j2] = m_nvac[i1][j1]; if (abs(i1-i2)>1 abs(j1-j2)>1) m_nvac[i1][j1] = EMPTY; for (int i=i2-1; i<=i2+1; i++) for (int j=j2-1; j<=j2+1; j++) if (i<0 i>=6 j<0 j>=6) continue; if (m_nvac[i][j]!= EMPTY) m_nvac[i][j] = nvac; 10.8 컴퓨터는최적위치를찾는다.

public: int FindBestMoving(int nvac); int CVacteriaView::FindBestMoving(int nvac) // brute-force search method 를사용하여최선의위치를찾는다. int nmaxcount = 0; for (int i1=0; i1<6; i1++) for (int j1=0; j1<6; j1++) if (m_nvac[i1][j1]!= nvac) continue; for (int di=-2; di<=2; di++) for (int dj=-2; dj<=2; dj++) int i2=i1+di, j2=j1+dj; if (i2<0 i2>=6 j2<0 j2>=6) continue; if (m_nvac[i2][j2]!= EMPTY) continue; int ncount = 0; for (int zi=-1; zi<=1; zi++) for (int zj=-1; zj<=1; zj++) int i3=i2+zi, j3=j2+zj; if (i3<0 i3>=6 j3<0 j3>=6) continue; if (m_nvac[i3][j3] == EMPTY) continue; if (m_nvac[i3][j3]!= nvac) ncount += 2; if ((abs(di)<2) && (abs(dj)<2)) ncount++; if (ncount > nmaxcount) nmaxcount = ncount; m_ptmove1 = CPoint(j1, i1); m_ptmove2 = CPoint(j2, i2); return nmaxcount; 10.9 해당세균을찾았으면그세균을움직이고, 사람차례로바꾼다.

void CVacteriaView::OnTimer(UINT_PTR nidevent) switch (m_ncount%4) case COMPUTER_PREPARE: if (FindBestMoving(VAC_2) == 0) m_ncount += 2; m_nvac[m_ptmove1.y][m_ptmove1.x] += 2; SetTimer(0, 1000, NULL); case COMPUTER_MOVE: m_nvac[m_ptmove1.y][m_ptmove1.x] -= 2; MoveVacteria(); KillTimer(0); 10.10 각세균수를점수판에표시한다. void CVacteriaView::OnDraw(CDC* pdc) int nsum[5]; memset(nsum, 0, sizeof(nsum)); for (int i=0; i<6; i++) for (int j=0; j<6; j++) nsum[m_nvac[i][j]]++; nsum[vac_1] += nsum[vac_3]; nsum[vac_2] += nsum[vac_4]; // 옮길세균도포함한다 CString str; str.format(_t("%d : %d"), nsum[vac_1], nsum[vac_2]); pdc->drawtext(str, CRect(50, 0, 50+50*6, 50), DT_CENTER DT_VCENTER DT_SINGLELINE); 10.11 움직일세균이없으면종료한다.

public: bool IsMovable(int nvac); void CVacteriaView::OnDraw(CDC* pdc) if (nsum[empty]==0 nsum[vac_1]==0 nsum[vac_2]==0 (!IsMovable(VAC_1) &&!IsMovable(VAC_2))) if (nsum[vac_1] > nsum[vac_2]) AfxMessageBox(_T("You win!")); else if (nsum[vac_1] < nsum[vac_2]) AfxMessageBox(_T("I win!")); else AfxMessageBox(_T("Try Again?")); bool CVacteriaView::IsMovable(int nvac) for (int i1=0; i1<6; i1++) for (int j1=0; j1<6; j1++) if (m_nvac[i1][j1]!= nvac) continue; for (int di=-2; di<=2; di++) for (int dj=-2; dj<=2; dj++) int i2=i1+di, j2=j1+dj; if (i2<0 i2>=6 j2<0 j2>=6) continue; if (m_nvac[i2][j2] == EMPTY) return TRUE; return FALSE; 10.12 효과음을넣는다. (1) 멀티미디어라이브러리를등록한다. 프로젝트속성 - > 구성요소 -> 링크 -> 종속성 =winmm.lib (2) 소리파일을 res 폴더에복사한다. C:\Windows\Media\ding.wav (tada.wav, chimes.wav, ringout.wav,...) #include <MMsystem.h> void CVacteriaView::OnLButtonDown(UINT nflags, CPoint point) sndplaysound( res/ding.wav ), SND_SYNC); // 소리가종료될때까지프로그램은중지 10.13 저작권정보를기록한다. (1) 도움말대화상자의문자열을수정한다. Resource.rc -> Dialog -> IDD_ABOUTBOX -> Vacteria, 버전 1.0, 안재형교수제작 (2) 리소스창에서버전정보를수정한다. (Resource.rc -> Version) CompanyName TODO: < 안재형교수 > LegalCopyright TODO: < 충북대학교 >. 모든권리보유. ProductName TODO: < 세균전 >