Microsoft PowerPoint - 09-CE-25-오목게임

Similar documents
Microsoft PowerPoint - 09-CE-24-채팅 프로그램

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

Microsoft PowerPoint - 09-CE-14-리스트콤보박스

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

Microsoft PowerPoint - 09-CE-7-선과 도형

2009년 상반기 사업계획

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

제1장 Unix란 무엇인가?

04장 메시지 처리 유형

Chapter 1. MFC 시작하기

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

vi 사용법

1장 윈도우 프로그래밍 들어가기

PowerPoint 프레젠테이션

MFC 프로그래밍

K&R2 Reference Manual 번역본

제1장 Unix란 무엇인가?

The Pocket Guide to TCP/IP Sockets: C Version

윈도우즈 프로그래밍

9장 윈도우 소켓 프로그래밍

본 강의에 들어가기 전

hd132x_k_v1r3_Final_.PDF

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 중부대학교정보보호학과

Microsoft PowerPoint PythonGUI-socket

Microsoft PowerPoint - 04-UDP Programming.ppt

윈도우 프로그래밍

슬라이드 1

본 강의에 들어가기 전

Microsoft PowerPoint - 04windows.ppt

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

PowerPoint 프레젠테이션

슬라이드 1

목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

Microsoft PowerPoint - 09-EDU-15-채팅 프로그래밍

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint - 03-TCP Programming.ppt

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

Microsoft PowerPoint - hci2-lecture1.ppt

슬라이드 1

untitled

Microsoft PowerPoint - CSharp-15-채팅

윈도우즈 프로그래밍

Microsoft PowerPoint - 15-EmbedSW-10-Socket

PowerPoint 프레젠테이션

예제와 함께 배워보는 OllyDbg사용법

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

<33372DC0A9B5B5BFECC7C1B7CEB1D7B7A1B9D62E687770>

Microsoft PowerPoint - C++ 5 .pptx

untitled

Microsoft PowerPoint - hci2-lecture1.ppt

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

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

유저영역후킹탐지시스템 팀 명 : D.N.F (Do Not Fishing) 지도교수 : 유승재교수님 팀 장 : 신동순 팀 원 : 서현찬이치목 중부대학교정보보호학과

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft PowerPoint C-구조체

UI TASK & KEY EVENT

윈도우즈 프로그래밍

Microsoft Word - Network Programming_NewVersion_01_.docx

chap 5: Trees

Microsoft PowerPoint - CSharp-10-예외처리

C프로-3장c03逞풚

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

<4D F736F F D2034C0E52D554E495820BCD2C4CF20C0C0BFEB20C7C1B7CEB1D7B7A1B9D6>

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

Microsoft PowerPoint PythonGUI-network

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

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관련된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에

KNK_C_05_Pointers_Arrays_structures_summary_v02

쉽게 풀어쓴 C 프로그래밍

03_queue

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

목 차 1. 포트스캐닝 (Port Scanning) 이란? 2. 포트 (Port) 란? 3. 스캔 (Scan) 의종류 4. 포트스캐너 (Port Scanner) 구현 5. 포트스캔 (Port Scan) 구현 6. 참조

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

Microsoft PowerPoint - es-arduino-lecture-03

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

PowerPoint 프레젠테이션

윈도우 프로그래밍의 개념

11장 포인터

03장.스택.key

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 제11장 포인터(강의)

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

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

윈도우 프로그래밍의 개념

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

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

Transcription:

순천향대학교컴퓨터학부이상정 1 학습내용 단순오목게임 인터넷오목게임 승부판정오목게임 순천향대학교컴퓨터학부이상정 2

단순오목게임 순천향대학교컴퓨터학부이상정 3 예제 49: 단순오목게임 스크린에바둑판을그리고, 스크린을터치하면해당위치에흰돌또는검은돌만표시 승부는판정하지않음 메뉴 ID_START, ID_EXIT 순천향대학교컴퓨터학부이상정 4

예제 49: 코드 (1) #define MAXLINE 19 // 바둑판줄수 #define DELTALINE 12 // 바둑판줄간격 #define STARTX 10 // 바둑판시작 X 좌표 #define STARTY 60 // 바둑판시작 Y 좌표 HBRUSH WhiteBrush, BlackBrush; enum SITE NONE, BLACK, WHITE ; SITE Board[MAXLINE-2][MAXLINE-2]; BOOL WhTurn = FALSE; // 흰돌, 검은돌브러시 // 바둑돌없음, 검은돌, 휜돌 // 바둑판상태배열 // 다음둘차례, TRUE: 흰돌, FALSE: 검은돌 void InitOmok(); void LbuttonDownEvent(HWND hwnd, int x, int y); void DrawOmok(HWND hwnd); void DrawSite(HWND hwnd, int x, int y, SITE dol); // 오목게임초기화 // 스크린터치이벤트함수 // 바둑판과돌화면에표시 // 바둑돌표시 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) switch (message) case WM_LBUTTONDOWN: LbuttonDownEvent(hWnd, LOWORD(lParam), HIWORD(lParam)); 순천향대학교컴퓨터학부이상정 5 예제 49: 코드 (2) case WM_LBUTTONDOWN: LbuttonDownEvent(hWnd, LOWORD(lParam), HIWORD(lParam)); case WM_COMMAND: wmid = LOWORD(wParam); wmevent = HIWORD(wParam); switch (wmid) case ID_START: /// 오목게임초기화 InitOmok(); InvalidateRect(hWnd, NULL, TRUE); case ID_EXIT: /// 게임종료 MessageBox(hWnd,L"Game is over!!", L"", NULL); SendMessage(hWnd, WM_CLOSE, 0, 0); case IDM_HELP_ABOUT: 순천향대학교컴퓨터학부이상정 6

예제 49: 코드 (3) case WM_CREATE: /// 오목초기화 InitOmok(); g_hwndcommandbar = CommandBar_Create(g_hInst, hwnd, 1); CommandBar_InsertMenubar(g_hWndCommandBar, g_hinst, IDR_MENU1, 0); CommandBar_AddAdornments(g_hWndCommandBar, 0, 0); case WM_PAINT: hdc = BeginPaint(hWnd, &ps); /// 바둑판화면에표시 DrawOmok(hWnd); EndPaint(hWnd, &ps); 순천향대학교컴퓨터학부이상정 7 예제 49: 코드 (4) /// 오목초기화 void InitOmok() // 브러시생성 WhiteBrush = CreateSolidBrush(RGB(255,255,255)); BlackBrush = CreateSolidBrush(RGB(0,0,0)); 0 0)); // 바둑판상태배열초기화 for (int x = 0; x < MAXLINE-2; x++) for (int y = 0; y < MAXLINE-2; y++) Board[x][y] = NONE; /// 스크린터치이벤트함수 void LbuttonDownEvent(HWND hwnd, int x, int y) int ix, iy; // 바둑판상태배열인덱스 ix = (x-startx) / DELTALINE; iy = (y-starty) / DELTALINE; // 경계범위위반조사 if (ix < 0 ix >= MAXLINE-2 iy < 0 iy >= MAXLINE-2 ) return; 순천향대학교컴퓨터학부이상정 8

예제 49: 코드 (5) if (Board[ix][iy] == NONE) // 해당위치에돌이없으면 // 다음돌선택하고화면에표시 Board[ix][iy] = WhTurn? WHITE : BLACK; DrawSite(hWnd, ix, iy, Board[ix][iy]); // 돌차례바꿈 WhTurn =!WhTurn; /// 바둑판과돌화면에표시 void DrawOmok(HWND hwnd) HDC hdc = GetDC(hWnd); int px, py, endx, endy; int deltax, deltay; // 선간격, 끝좌표지정 deltax = deltay = DELTALINE; endx = STARTX +(MAXLINE-1)*deltaX; endy = STARTY + (MAXLINE-1)*deltaY; 순천향대학교컴퓨터학부이상정 9 예제 49: 코드 (6) // 가로줄표시 for (int y = 0; y < MAXLINE; y++) py = STARTY + y*deltay; // 그려질 y 좌표 MoveToEx(hdc, STARTX, py, NULL); LineTo(hdc, endx, py); // 세로줄표시 for (int x= 0; x < MAXLINE; x++) px = STARTX + x*deltax; // 그려질 x 좌표 MoveToEx(hdc, px, STARTY, NULL); LineTo(hdc, px, endy); // 바둑돌표시 for (int x = 0; x < MAXLINE-2; x++) for (int y=0; y < 19; y++) DrawSite(hWnd, x, y, Board[x][y]); 순천향대학교컴퓨터학부이상정 10

예제 49: 코드 (7) /// 바둑돌표시 void DrawSite(HWND hwnd, int x, int y, SITE dol) HDC hdc = GetDC(hWnd); int px, py; // 타원시작점 px = STARTX+x*DELTALINE+DELTALINE/2+1; py = STARTY+y*DELTALINE+DELTALINE/2+1; if (dol!= NONE) // 돌이없으면 if (dol == BLACK) // 검은돌 SelectObject(hdc, BlackBrush); Ellipse(hdc, px, py, px+deltaline-2, py+deltaline-2); DeleteObject(BlackBrush); else // 흰돌 SelectObject(hdc, WhiteBrush); Ellipse(hdc, px, py, px+deltaline-2, py+deltaline-2); DeleteObject(WhiteBrush); 순천향대학교컴퓨터학부이상정 11 인터넷오목게임 순천향대학교컴퓨터학부이상정 12

예제 50: 인터넷오목게임 예제 49 의단순오목게임을수정하여인터넷에연결하여상대방과오목게임 기존의오프라인게임에네트워크게임기능추가 네트워크게임메뉴 ID_SERVER: 서버, 흰돌 ID_CONNECT: 클라이언트, 검은돌, 연결요청시작 ID_STOP: 네트워크게임중지 에디트, 버튼컨트롤 ID_IP, ID_PORT: IP 주소, 포트번호 ID_BUTTON: 연결버튼 클라이언트로동작시화면에표시 PC 용으로실행시에는일부수정 MyRegisterClass() 함수에서 IDR_MENU1 메뉴로드 바둑판크기, DELTALINE 20 create_gui() 함수에서 CreateWindow() 함수매개변수 hinst #pragma comment(lib,"ws2_32.lib") 순천향대학교컴퓨터학부이상정 13 예제 50: 실행결과 (1) PC 는서버, 실습보드는클라이언트로동작하는예 순천향대학교컴퓨터학부이상정 14

예제 50: 실행결과 (2) 순천향대학교컴퓨터학부이상정 15 예제 50: 서버동작 WM_CREATE 메시지에서 initwinsock() 호출하여윈속초기화 서버동작 메뉴 ID_SERVER 에서서버쓰레드함수 ServerStart() 생성하고실행 ServerStart() 쓰레드함수 서버소켓생성, socket() 주소 / 포트연결지정, bind() 클라이언트접속대기, listen() 클라이언트접속, accept() 바둑판그림, InvalidateRect() 데이터수신쓰레드함수 ReceiveData() 실행 ReceiveData() 쓰레드함수 recv() 함수사용하여상대방의바둑돌 x,,y 좌표수신 Drawsite() 호출하여바둑판에표시 순천향대학교컴퓨터학부이상정 16

예제 50: 클라이언트동작 클라이언트동작 ID_CONNECT 메뉴에서 create_gui() 함수호출 create_gui() 함수 IP, 포트에디트컨트롤, 연결버튼생성하고화면에표시 ID_BUTTON 메뉴에서 ConnectClick() 함수호출 Connect() 함수호출하여서버에연결요청 Connect() 함수 소켓생성, socket() 접속할서버주소 / 포트지정및연결, connect() 데이터수신쓰레드함수 ReceiveData() 실행 메인윈도우에서버튼, 에디트컨트롤제거 바둑판그림, InvalidateRect() 순천향대학교컴퓨터학부이상정 17 예제 50: 데이터송신 WM_LBUTTONDOWN 메시지에서 LbuttonDownEvent() 함수호출 LbuttonDownEvent() 함수 바둑돌위치계산하고 Drawsite() 호출하여바둑판에표시 네트워크연결이면 SendData() 함수호출하여위치 x, y 송신 SendData() 함수 send() 함수사용하여바둑돌 x, y 좌표를상대방에게송신 순천향대학교컴퓨터학부이상정 18

예제 50: 코드 ATOM MyRegisterClass(HINSTANCE hinstance, LPTSTR szwindowclass) /// ATOM MyRegisterClass(HINSTANCE hinstance) wc.lpszmenuname = 0; /// wcex.lpszmenuname = MAKEINTRESOURCE(IDR_MENU1); MENU1); // PC 용 //// 오목관련선언 #define MAXLINE 19 // 바둑판줄수 #define DELTALINE 12 // 바둑판줄간격 /// #define DELTALINE 20 // PC 용 #define STARTX 10 // 바둑판시작 X 좌표 #define STARTY 60 // 바둑판시작 Y 좌표 HBRUSH WhiteBrush, BlackBrush; enum SITE NONE, BLACK, WHITE ; SITE Board[MAXLINE-2][MAXLINE-2]; bool WhTurn = false; // 흰돌, 검은돌브러시 // 바둑돌없음, 검은돌, 휜돌 // 바둑판상태배열 // 다음둘차례, true: 흰돌, false: 검은돌 void InitOmok(); void LbuttonDownEvent(HWND hwnd, int x, int y); void DrawOmok(HWND hwnd); void DrawSite(HWND hwnd, int x, int y, SITE dol); 순천향대학교컴퓨터학부이상정 19 // 오목게임초기화 // 스크린터치이벤트함수 // 바둑판과돌화면에표시 // 바둑돌표시 예제 50: 코드 //// 네트워크관련선언 #include <Winsock2.h> #pragma comment(lib,"ws2.lib") // #pragma comment(lib,"ws2_32.lib") #define ID_IP IP 500 #define ID_PORT 501 #define ID_BUTTON 502 HWND hip, hport, hconnect; // 컨트롤핸들 HANDLE hserverthread, hrecvthread; // 쓰레드핸들 bool IsGameStart = false; // true: 게임시작하여진행중 WCHAR szip[20], szport[20]; // 에디트컨트롤버퍼 bool IsConnected = false, // 연결상태표시플래그 IsClient = false; // 클라이언트로실행중임을표시 SOCKET server, client; // 소켓 bool initwinsock(); void create_gui(hwnd hwnd); void ConnectClick(HWND hwnd); bool Connect(HWND hwnd); DWORD WINAPI ServerStart(LPVOID pdata); DWORD WINAPI ReceiveData(LPVOID pdata); void SendData(int x, int y); void NetworkStop(); 순천향대학교컴퓨터학부이상정 20 // 윈속초기화 // 에디트컨트롤, 버튼생성 // Connect 버튼클릭함수 // 서버에연결요청함수 // 채팅서버시작쓰레드함수 // 메시지수신쓰레드함수 // 데이터송신함수 // 네트워크중지함수

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) int wmid, wmevent; PAINTSTRUCT ps; HDC hdc; switch (message) case WM_LBUTTONDOWN: if (IsGameStart == true) // 게임진행중이면 LbuttonDownEvent(hWnd, LOWORD(lParam), HIWORD(lParam)); case WM_COMMAND: wmid = LOWORD(wParam); wmevent = HIWORD(wParam); switch (wmid) case ID_START: /// 오목초기화 InitOmok(); IsGameStart = true; InvalidateRect(hWnd, NULL, true); 순천향대학교컴퓨터학부이상정 21 // 게임시작 case ID_EXIT: /// 게임종료 MessageBox(hWnd,L"Game is over!!", L"", NULL); SendMessage(hWnd, WM_CLOSE, 0, 0); case ID_SERVER: // 서버시작 /// 서버쓰레드생성하고실행 hserverthread = CreateThread(NULL, 0, ServerStart,(PVOID)hWnd, 0, NULL); case ID_CONNECT: /// GUI 표시후연결요청 /// GUI 컨트롤생성 create_gui(hwnd); case ID_BUTTON: // Connect 버튼 // 버튼클릭함수호출 ConnectClick(hWnd); case ID_IP: // IP 주소 if (wmevent == EN_CHANGE) GetWindowText(hIP, szip, 20); case ID_PORT: // 포트번호 if (wmevent == EN_CHANGE) GetWindowText(hPort, szport, 20); case ID_STOP: NetworkStop(); // 네트워크중지함수 MessageBox(hWnd,L"Game is over!!", L"", NULL); SendMessage(hWnd, WM_CLOSE, 0, 0); case IDM_HELP_ABOUT: 순천향대학교컴퓨터학부이상정 22

임베디드 case 소프트웨어 WM_CREATE: /// 오목초기화 InitOmok(); /// 윈속초기화 if (initwinsock() == false) return 0; g_hwndcommandbar = CommandBar_Create(g_hInst, hwnd, 1); CommandBar_InsertMenubar(g_hWndCommandBar, g_hinst, IDR_MENU1, 0); CommandBar_AddAdornments(g_hWndCommandBar, 0, 0); case WM_PAINT: hdc = BeginPaint(hWnd, &ps); /// 오목판그림 if (IsGameStart == true) DrawOmok(hWnd); EndPaint(hWnd, &ps); //////// 오목관련루틴 /// 오목초기화 void InitOmok() WhiteBrush = CreateSolidBrush(RGB(255,255,255)); BlackBrush = CreateSolidBrush(RGB(0,0,0)); for (int x = 0; x < MAXLINE-2; x++) for (int y = 0; y < MAXLINE-2; y++) Board[x][y] = NONE; 순천향대학교컴퓨터학부이상정 23 /// 스크린터치이벤트함수 void LbuttonDownEvent(HWND hwnd, int x, int y) int ix, iy; ix = (x-startx) / DELTALINE; iy = (y-starty) / DELTALINE; // 경계범위조사 if (ix < 0 ix >= MAXLINE-2 iy < 0 iy >= MAXLINE-2) return; if (Board[ix][iy] == NONE) // 다음돌표시하고화면표시 Board[ix][iy] = WhTurn? WHITE : BLACK; DrawSite(hWnd, ix, iy, Board[ix][iy]); if (IsConnected!= true) // 차례바꿈 WhTurn =!WhTurn; else // 네트워크연결이면 SendData(ix,iy); // 네트워크연결이아니면 /// 바둑판과돌화면에표시 void DrawOmok(HWND hwnd) HDC hdc = GetDC(hWnd); int px, py, endx, endy; int deltax, deltay; 순천향대학교컴퓨터학부이상정 24

임베디드 // 선소프트웨어간격, 끝좌표지정 deltax = deltay = DELTALINE; endx = STARTX + (MAXLINE-1)*deltaX; endy = STARTY + (MAXLINE-1)*deltaY; // 가로줄표시 for (int y = 0; y < MAXLINE; y++) py = STARTY + y*deltay; // 그려질 y 좌표 MoveToEx(hdc, STARTX, py, NULL); LineTo(hdc, endx, py); // 세로줄표시 for (int x= 0; x < MAXLINE; x++) px = STARTX + x*deltax; MoveToEx(hdc, px, STARTY, NULL); LineTo(hdc, px, endy); // 바둑돌표시 for (int x = 0; x < MAXLINE-2; x++) for (int y=0; y < MAXLINE-2; y++) DrawSite(hWnd, x, y, Board[x][y]); /// 바둑돌그림 void DrawSite(HWND hwnd, int x, int y, SITE dol) HDC hdc = GetDC(hWnd); int px, py; // 그려질 x 좌표 // 타원시작점 px = STARTX+x*DELTALINE+DELTALINE/2+1; py = STARTY+y*DELTALINE+DELTALINE/2+1; 순천향대학교컴퓨터학부이상정 25 if (dol!= NONE) // 돌이없으면 if (dol == BLACK) // 검은돌 SelectObject(hdc, BlackBrush); Ellipse(hdc, px, py, px+deltaline-2, py+deltaline-2); DeleteObject(BlackBrush); else // 흰돌 SelectObject(hdc, WhiteBrush); Ellipse(hdc, px, py, px+deltaline-2, py+deltaline-2); DeleteObject(WhiteBrush); //////////////////////////////////// //////// 네트워크관련루틴 /// 윈속초기화 bool initwinsock() WSADATA wsadata; int retval; retval = WSAStartup(MAKEWORD(2,2), ( &wsadata); if (retval!= 0) MessageBox(NULL,L"WSAStartup Fail",L"", MB_ICONERROR); return false; return true; 순천향대학교컴퓨터학부이상정 26

임베디드 void create_gui(hwnd 소프트웨어 hwnd) // 에디트컨트롤생성 hip = CreateWindow(L"edit", edit, NULL, WS_CHILD WS_BORDER WS_VISIBLE, 10, 40, 120, 20, hwnd, (HMENU)ID_IP, g_hinst, NULL); hport = CreateWindow(L"edit", NULL, WS_CHILD WS_BORDER WS_VISIBLE, 150, 40, 50, 20, hwnd, (HMENU)ID_PORT, g_hinst, NULL); // 버튼생성 hconnect = CreateWindow(L"button", L"Connect", WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 10, 65, 120, 20, hwnd, (HMENU)ID_BUTTON, g_hinst, NULL); /// 채팅서버시작, 클라이언트의접속을받고, 메시지를수신 DWORD WINAPI ServerStart(LPVOID pdata) sockaddr_in addr; int retval; HWND hwnd = (HWND)pData; /// 서버소켓생성 server = socket(af_inet, SOCK_STREAM, 0); if (server == INVALID_SOCKET) MessageBox(hWnd,L"SocketCreate Fail",L"", MB_ICONERROR); return 0; /// 주소 / 포트지정및연결 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(inaddr_any); // 서버의 IP 주소 addr.sin_port = htons(7000); // 서버포트를 7000으로지정 retval = bind(server, (struct sockaddr *)&addr, sizeof(addr)); 순천향대학교컴퓨터학부이상정 27 임베디드 if (retval 소프트웨어 == SOCKET_ERROR) MessageBox(hWnd,L"Bind Fail",L"", MB_ICONERROR); return 0; /// 클라이언트접속대기 retval = listen(server, SOMAXCONN); // 클라이언트개수를최대로설정 if (retval == SOCKET_ERROR) ERROR) MessageBox(hWnd,L"Listen Fail",L"", MB_ICONERROR); return 0; /// 메시지출력 MessageBox(hWnd,L"Server Start... r n",l"", MB_OK); /// 클라이언트접속 sockaddr_in client_addr; int addrlen; addrlen = sizeof(client_addr); client = accept(server, (struct sockaddr *)&client_addr, &addrlen); if (client == INVALID _ SOCKET) ) MessageBox(hWnd,L"Accept Fail",L"", MB_ICONERROR); return 0; IsConnected = true; /// 접속한클라이언트 IP 주소출력 CHAR bip[50]; WCHAR ip[50], szmsg[80]; strcpy(bip, inet_ntoa(client_addr.sin_addr)); // 숫자 IP주소를문자열로변환 mbstowcs(ip, bip, strlen(bip)+1); // ASCII 문자를유니코드로변환 wsprintf(szmsg, L"Start game with IP %s r n", ip); 순천향대학교컴퓨터학부이상정 28

MessageBox(hWnd,szMsg, L"", MB_OK); // 바둑판그림 IsGameStart = true; WhTurn = true; // 서버는흰돌 InvalidateRect(hWnd, NULL, true); /// Receive 쓰레드생성및실행 hrecvthread = CreateThread(NULL, 0, ReceiveData,(PVOID)hWnd, 0, NULL); return 0; /// Connect 버튼클릭함수 void ConnectClick(HWND hwnd) if (IsClient == false) // 서버에접속할경우 if (Connect(hWnd)( == false) // 서버에연결요청 MessageBox(hWnd,L"Connect Fail",L"", MB_ICONERROR); else IsClient = true; else // 이미접속된경우 MessageBox(hWnd,L"Already connected",l"", MB_ICONERROR); 순천향대학교컴퓨터학부이상정 29 // 서버에연결요청함수 bool Connect(HWND hwnd) sockaddr_in serveraddr; CHAR bip[20]; int retval, port; /// 소켓생성 client = socket(af_inet, SOCK_STREAM, 0); if (client == INVALID_SOCKET) return false; /// 접속할서버주소 / 포트지정및연결 wcstombs(bip, szip, wcslen(szip)+1); // 유니코드를 ASCII 문자로변환 port = _wtoi(szport); // 포트번호문자열을정수로변환 memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_ addr.s_ addr = inet_ addr(bip); // 서버의 IP 주소 serveraddr.sin_port = htons(port); // 포트번호 retval = connect(client, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if (retval == SOCKET_ERROR) return false; IsConnected = true; /// Receive 쓰레드생성및실행 hrecvthread = CreateThread(NULL, 0, ReceiveData,(PVOID)hWnd, 0, NULL); 순천향대학교컴퓨터학부이상정 30

/// 버튼, 에디트제거 DestroyWindow(hIP); DestroyWindow(hPort); DestroyWindow(hConnect); /// 메시지출력 MessageBox(hWnd,L"Start game r n",l"", MB_OK); /// 바둑판그림 IsGameStart = true; WhTurn = false; // 클라이언트는검은돌 InvalidateRect(hWnd, NULL, true); return true; /// 데이터송신함수 void SendData(int x, int y) CHAR ix[4], iy[4]; *(UINT *)ix = htonl(x); () // host-to-network 바이트변환 send(client, ix, 4, 0); // x 데이터송신 *(UINT *)iy = htonl(y); // host-to-network 바이트변환 send(client, iy, 4, 0); // x 데이터송신 순천향대학교컴퓨터학부이상정 31 /// 메시지수신쓰레드함수 DWORD WINAPI ReceiveData(LPVOID pdata) CHAR ix[4], iy[4]; int x, y, size; HWND hwnd = (HWND)pData; // 핸들인수 while (IsConnected == true) // x 데이터수신 size = recv(client, ix, 4, 0); // x 데이터수신 if (size!= SOCKET_ERROR) x = ntohl(*(uint *)ix); // nework-to-host 바이트변환 // y 데이터수신 recv(client, iy, 4, 0); // x 데이터수신 if (size!= SOCKET_ERROR) y = ntohl(*(uint *)iy); // nework-to-host 바이트변환 if (Board[x][y] == NONE) // 다음돌표시하고화면표시 Board[x][y] =!WhTurn? WHITE : BLACK; // 상대편돌표시 DrawSite(hWnd, x, y, Board[x][y]); [][]) return 0; 순천향대학교컴퓨터학부이상정 32

예제 50: 코드 /// 네트워크중지함수 void NetworkStop() if (IsConnected == true) // 클라이언트연결상태이면 IsConnected = false; // Receive 쓰레드종료 closesocket(client); // 소켓해제 closesocket(server); MessageBox(NULL,L"Connection is closed. r n",l"stop", MB_OK); 순천향대학교컴퓨터학부이상정 33 과제 17 예제 50 의인터넷오목게임에승부를판정하는기능을추가하여라 최근에놓인돌을기준으로같은색의돌이수직, 수평, 대각선으로 5 개연속해서놓여있는지조사 수평조사 현재위치의 x 좌표기준으로좌 (--x) x), 우 (++x) 로다른색의돌을만날때까지개수카운트하여 5개이면승리 수직조사 현재위치의 y 좌표기준으로상 (--y), 하 (++y) 로다른색의돌을만날때까지개수카운트하여 5개이면승리 대각선조사 현재위치의 x,y 좌표기준으로좌상 (--x, --y), 우하 (++x, ++y) 로다른색의돌을만날때까지개수카운트하여 5개이면승리 현재위치의 x,y 좌표기준으로좌하 (--x, ++y), 우상 (++x, --y) 로다른색의돌을만날때까지개수카운트하여 5개이면승리 순천향대학교컴퓨터학부이상정 34