'분류 전체보기'에 해당되는 글 52건

  1. 오리지날 고전게임
  2. 마방진 원리 및 문제 4
  3. 뮤텍스를 이용한 프로그램 중복실행 방지
  4. 2012 OLC Center 무료 공개 SW강좌
  5. 일정 날짜 기준 로그파일 제거 1
  6. 로컬 IP주소 얻기
  7. unquenchable 다른 연상법
  8. 유니코드 ↔ 안시 변환함수
  9. 폴더선택 다이얼로그와 초기폴더경로 설정
  10. 명경기 2012 GSL Season2 송현덕P vs 박현우P


혹시 오리지날 고전게임이라는 사이트를 알고계시나요 ^^?

2000년도 초반에 운영했던 사이트 였으나 트래픽문제로 인해 접게된 사이트입니다.



당시 오리지날 고전게임 사이트(http://original.maru.net)에 접속하면 보았던 트래픽 초과 알림


고전게임을 좋아하고 고전게임의 리소스또한 풍부하게 갖고 있어서

운영에 자신감은 있었지만 점차 회원수가 많아짐에 따라 당시 고등학교 신분이였던 저는 트래픽을 감당하지 못하고

결국 사이트를 접게 되었습니다.

1~2년만 더 버틸수 있었다면 가장 영향력 있는 고전게임 사이트중 하나가 되었을 것인데 말이죠...


중간중간 너무 아쉬워 다시 복원하고 싶은 마음은 굴뚝 같았지만 

바쁜 사회생활은 다시금 저를 포기하게 만들게 되었습니다.


그리고 지금 예전만큼의 명성은 아니지만 소소하게 갖고 있는 고전게임의 지식과

리소스를 블로그를 통해 하나하나 공유해가고자 합니다 ^^

공유되는 자료는 윈도우7 64비트에서 이상에서도 실행이 되는 것, 즉 호환이 좋은 게임들 위주로 올릴 것입니다.


혹여나 점차 자료가 방대해지고 반응이 좋아지면 다시 사이트로도 도전해볼 생각입니다.

그럼 Start !!!



  • 마방진?

마방진이란 아래 그림과 같이 가로, 세로, 및 대각선에 있는 각각의 합이 같도록 배열한 것을 의미



  • 문제

위의 3 * 3 마방진을 구현하시오. 화면에 출력.

(For문 또는 While문, if문, 배열, 함수 사용)


  • 원리



  • 코드보기

마방진.cpp


헤더파일: App Class (.h)

  
// 뮤텍스 핸들 선언
protected:
	HANDLE m_hMutex;


소스파일: App Class (.cpp)

  
#define STRING_MUTEX_NAME		"뮤텍스 이름"
#define STRING_CAPTION_NAME		"프로그램 이름(Caption)"

//
// 생성자 뮤텍스 핸들 초기화
//
CClassApp::CClassApp()
{
	m_hMutex = NULL;
}

//
// 프로그램 중복실행 방지
//
CClassApp::InitInstance()
{
	if(NULL == ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, STRING_MUTEX_NAME))
	{
		// 중복실행이 아니므로 뮤택스 생성
		m_hMutex = ::CreateMutex(NULL, FALSE, STRING_MUTEX_NAME);
		if(m_hMutex == NULL)
		{
			AfxMessageBox(_T("프로그램 실행에 실패하였습니다."), MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
	}
	else
	{
		// 중복실행일 경우 기존 열려있는 창을 맨 앞으로 보여줌
		// 만약, 창이 최소화 상태라면 최소화 상태 해제
		CWnd*  pWnd = NULL;
		pWnd = CWnd::FindWindow(NULL, STRING_CAPTION_NAME);
		if(pWnd != NULL)
		{
			if(pWnd->IsIconic()) 
				pWnd->ShowWindow(SW_RESTORE);
			else     
				pWnd->SetForegroundWindow();
		}
		else
		{
			pWnd = CWnd::FindWindow(NULL, STRING_CAPTION_NAME);
			if(pWnd != NULL)
			{
				if(pWnd->IsIconic()) 
					pWnd->ShowWindow(SW_RESTORE);
				else     
					pWnd->SetForegroundWindow();
			}
		}
		return FALSE;
	}  

	// 기존 코드
}


'개발이야기 > MFC' 카테고리의 다른 글

fopen_s 파일읽기와 저장  (0) 2012.06.14
MFC 디렉토리 생성과 삭제  (0) 2012.05.25
일정 날짜 기준 로그파일 제거  (1) 2012.05.17
로컬 IP주소 얻기  (0) 2012.05.17
유니코드 ↔ 안시 변환함수  (0) 2012.05.16


본 코드는 30일이 지난 로그파일을 삭제합니다.

강조된 부분의 코드수정을 통해 제거 일정 기준을 변경시킬 수 있습니다.

  
//
// 폴더 경로 얻음
//
CString GetFolderPath(CString path)
{
	if(path.Right(1) == _T('\\'))
	{
		return path;
	}
	else
	{
		CString strFolderPath;
		strFolderPath = path.Left(path.ReverseFind(_T('\\'))+1);
		return strFolderPath;
	}
}

//
// 일정 날짜 기준 로그파일 제거
//
void DeleteLogfiles()
{
	// 로그파일 형태 20111116.log
	// 30일 기준 로그파일 삭제
	CTime CurTime = CTime::GetCurrentTime();
	CTime Day30Time;
	Day30Time = CurTime - CTimeSpan(30, 0, 0, 0); // 일, 시, 분, 초
	CString path, file_path, file_name;
	path.Format(_T("%s*.*"), _("로그디렉토리경로\\"));
	CFileFind finder;
	BOOL bRes;
	bRes = finder.FindFile(path);
	while(bRes)
	{
		bRes = finder.FindNextFile();
		if(!finder.IsDirectory()) // 폴더가 아니고 파일일 경우
		{
			// 삭제 상태 변수 초기화
			bool bDelete = false;
			// 현재 정보가 파일인 경우, file_data.cFileName에 파일이름이 들어있다.
			file_name = finder.GetFileName();
			file_path = GetFolderPath(path) + file_name;
			CString strLogDate;
			strLogDate = file_name.Left(8);
			// 문자 길이가 맞고, 숫자로만 구성되었는지 확인
			if(strLogDate.GetLength() == 8 && IsStringDigit(strLogDate))
			{
				int nLogYear = _ttoi(strLogDate.Left(4));
				int nLogMonth = _ttoi(strLogDate.Mid(4, 2));
				int nLogDay = _ttoi(strLogDate.Right(2));
				CTime LogTime(nLogYear, nLogMonth, nLogDay, 0, 0, 0, 0);
				if(LogTime < Day30Time)
					bDelete = true;
			}
			else
			{
				// 예외사항
				bDelete = true;
			}    
			if(bDelete)
			{
				// 30일이 지난 로그파일은 삭제
				DeleteFile(file_path);
			}
		}
	}
}



로컬 IP주소를 얻을 수 있는 함수입니다.

CString 타입으로 _T("xxx.xxx.xxx.xxx")와 같이 반환합니다.

  
#include <afxsock.h>
CString GetIPAddress()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	char name[255];
	CString ip; // 여기에 lcoal ip가 저장됩니다.
	PHOSTENT hostinfo;
	wVersionRequested = MAKEWORD( 2, 0 );
	if ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) 
	{
		if( gethostname ( name, sizeof(name)) == 0)
		{
			if((hostinfo = gethostbyname(name)) != NULL)
			{
				ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
			}
		}      
		WSACleanup( );
	} 
	return ip;
}



경선식에듀에 "unquenchable 다른 연상법" 글 작성한 내용입니다.



수강후기 게시판인데 여기다 적어도 되는지 모르겠네요 ^^; 

강의를 들으면서 연상이 잘 안되는건 직접 만들어 보기도 하는데 

특히 unquenchable 이 단어는 '억누를 수 없는'의 뜻이 

연상이 잘 안되더라구요... 

그래서 계속 생각하다 다른 연상법이 떠올라 적어봅니다.

 

quench (갈증을) 풀다, (불 등을) 끄다 

unquenchable (불 등을) 끌 수 없는, 억누를 수 없는

  

기존의 연상법은 quench 부터 

목마를 때 캔을 따면 '치이~'하고 거품이 일죠? 캔을 마시며 갈증을 푸는 모습에서 

갈증을 풀다, 불 등을 끄다의 뜻이 연상됩니다. 

그리고 unquenchable로 넘어가서 un이 not을 의미하는 접두사 이니 

불을 끌 수 없는, 갈증을 풀수 없는이 두 뜻이 연상됩니다. 

하지만 여기서, 억누를 수 없는 이라는 뜻을 연결해야되는데 

저는 쉽지 않았습니다... 

따라서, 다른 연상법을 찾아보았고 생각한 연상법은 다음과 같습니다. 

  

우리나라의 명물 청량고추를 누군가 먹었습니다.

너무나 매워서 물을 찾았지만 주위에 보이는건 캔음료 뿐이었습니다.

급히 캔을 따 (치이~ 소리와 함께) 벌컥벌컥 들이 마십니다.

(여기서 quench 뜻이 연상됩니다. 고추먹은 속의 불과 동시에 갈증을 푸는 모습)

하지만 너무 매웠기에 quench 했음에도 불구하고 속이 계속 달아오릅니다.

캔음료로(un의 의미)는 속의 불을 끌 수 없었고, 매움을 억누를수가 없었습니다.

 

여기까지입니다 ~~


'영어공부' 카테고리의 다른 글

영어 시간표현 What time is it?  (21) 2012.05.12


VS2008을 사용하게되면서 UNICODE와 ANCI간의 스트링 상호변환 함수를 정리한 것입니다.

프로젝트 문자집합 속성(유니코드, 멀티바이트)에 상관없이 변환 가능합니다.

  
//
// CString → Char
//
char* StringToChar(CString str)
{
	char *szStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
	int nLen = str.GetLength() + 1;
	TCHAR *tszTemp = NULL;
	tszTemp = new TCHAR[nLen];
	memset(tszTemp, 0x00, nLen*sizeof(TCHAR));
	_tcscpy(tszTemp, str);
	// Get size (실제사용되는바이트사이즈)
	int nSize = WideCharToMultiByte(CP_ACP, 0, tszTemp, -1, NULL, NULL, NULL, NULL);
	szStr = new char[nSize];
	memset(szStr, 0x00, nSize);
	WideCharToMultiByte(CP_ACP, 0, tszTemp, -1, szStr, nSize, NULL, NULL);
	if(tszTemp)
	{
		delete [] tszTemp;
		tszTemp = NULL;
	}
#else
	int nLen = str.GetLength() + 1;
	szStr = new char[nLen];
	memset(szStr, 0x00, nLen);
	strcpy(szStr, str);
#endif
	return szStr;
}

//
// CString → TCHAR
//
TCHAR* StringToTCHAR(CString str)
{
	TCHAR *tszStr = NULL;
	int nLen = str.GetLength() + 1;
	tszStr = new TCHAR[nLen];
	memset(tszStr, 0x00, nLen*sizeof(TCHAR));
	_tcscpy(tszStr, str);

	return tszStr;
}

//
// Char → CString
//
CString CharToString(char *str)
{
	CString cStr;
#if defined(UNICODE) || defined(_UNICODE)
	int nLen = strlen(str) + 1;
	TCHAR *tszTemp = NULL;
	tszTemp = new TCHAR[nLen];
	memset(tszTemp, 0x00, nLen*sizeof(TCHAR));
	MultiByteToWideChar(CP_ACP, 0, str, -1, tszTemp, nLen*sizeof(TCHAR));
	cStr.Format(_T("%s"), tszTemp);
	if(tszTemp)
	{
		delete [] tszTemp;
		tszTemp = NULL;
	}
#else
	cStr.Format("%s", str);
#endif
	return cStr;
}

//
// Char → TCHAR
//
TCHAR* CharToTCHAR(char *str)
{
	TCHAR *tszStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
	int nLen = strlen(str) + 1;
	tszStr = new TCHAR[nLen];
	memset(tszStr, 0x00, nLen*sizeof(TCHAR));
	MultiByteToWideChar(CP_ACP, 0, str, -1, tszStr, nLen*sizeof(TCHAR));
#else
	int nLen = strlen(str) + 1;
	tszStr = new TCHAR[nLen];
	memset(tszStr, 0x00, nLen*sizeof(TCHAR));
	_tcscpy(tszStr, str);
#endif
	return tszStr;
}

//
// TCHAR → CString
//
CString TCHARToString(TCHAR *str)
{
	CString cStr;
	cStr.Format(_T("%s"), str);
	return cStr;
}

//
// TCHAR → Char
//
char* TCHARToChar(TCHAR *str)
{
	char *szStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
	int nSize = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, NULL, NULL, NULL);
	szStr = new char[nSize];
	memset(szStr, 0x00, nSize);
	WideCharToMultiByte(CP_ACP, 0, str, -1, szStr, nSize, NULL, NULL);
#else
	int nLen = strlen(str) + 1;
	szStr = new char[nLen];
	memset(szStr, 0x00, nLen);
	strcpy(szStr, str);
#endif
	return szStr;
}


'개발이야기 > MFC' 카테고리의 다른 글

일정 날짜 기준 로그파일 제거  (1) 2012.05.17
로컬 IP주소 얻기  (0) 2012.05.17
폴더선택 다이얼로그와 초기폴더경로 설정  (0) 2012.05.15
MFC Control 오픈소스 모음  (0) 2012.05.13
3D 다이아몬드  (0) 2012.05.13


//
// 폴더선택 다이얼로그를 구현하기 위해 사용되는 사용자정의 Callback 함수
//
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
	switch (uMsg) {
		// 폴더선택 다이얼로그의 초기화가 끝난 경우
	case BFFM_INITIALIZED:
		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
		break;
	}
	return 0;
}

//
// 폴더선택 다이얼로그
//
void SelectFolder()
{
	ITEMIDLIST	*pidlBrowse;
	WCHAR		pszPathname[MAX_PATH];

	BROWSEINFO	BrInfo;
	BrInfo.hwndOwner = GetSafeHwnd();
	BrInfo.pidlRoot = NULL;

	memset(&BrInfo, 0x00, sizeof(BrInfo));
	BrInfo.pszDisplayName = pszPathname;
	BrInfo.lpszTitle = _T("Select folder");
	BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;

	// 이벤트에 대한 사용자정의 함수
	BrInfo.lpfn = BrowseCallbackProc;

	// 사용자정의 함수에 넘겨질 인자로 사용자가 설정하고자 하는 경로를 설정한다.
	// 예를들어 초기폴더경로를 C드라이브로 설정하는 경우
	CString strInitPath = _T("C:\\");
	BrInfo.lParam = (LPARAM)strInitPath.GetBuffer();

	pidlBrowse = ::SHBrowseForFolder(&BrInfo);
	if(pidlBrowse != NULL)
	{
		// 선택된 폴더 경로얻음
		SHGetPathFromIDList(pidlBrowse, pszPathname);
		
		// 경로(pszPathname)를 이용하여 이후작업 추가
	}
}


'개발이야기 > MFC' 카테고리의 다른 글

로컬 IP주소 얻기  (0) 2012.05.17
유니코드 ↔ 안시 변환함수  (0) 2012.05.16
MFC Control 오픈소스 모음  (0) 2012.05.13
3D 다이아몬드  (0) 2012.05.13
MD5 Checksum 모듈  (0) 2012.05.13

2012 GSL Season2 Code S 4강 2경기입니다.

송현덕P vs 박현우P


경기보기 : http://ch.gomtv.com/460/29087/485515


2012 GSL 이전 경기들의 대부분 P vs P 일명 프로토스대 프로토스 전이 나오면 '망했다'라는 말이 많이 나왔습니다.

경기 흐름이 단조로웠고 일명 4차관 올인으로 경기가 빠르게 끝났기 때문입니다.


이번 경기는 이런 프로토스 전에 흐름이 바뀌었다라고 증명이나하듯 다채롭고 놀랄만한 재미를 선사합니다.

1경기 부터 다크템플러 러쉬를 손보이며 막혀도 운영으로 갈 수 있다라는점과 쉽사리 끝나지 않고

오히려 긴장감이 넘칠수 있다라는 느낌을 줍니다.


특히 이번 포스트에서 올린 게임은 2경기 입니다.

2경기에서는 빠른 박현우의 초반러시, 이를 빠르게 대처한 송현덕,

이후 분광기에 의한 러시, 숨막히는 컨트롤 혈전, 운과 실력에 상관없는 종이한장 차이의 승부 등을 볼수 있습니다.


게임에도 철학이 많이 담겨져 있다고 생각합니다. 

경기 이후에 안준영 해설위원이 한 얘기가 떠오르네요.


어떤 한 종족이 대세가 될때,

즉 강한힘을 발휘하고 있을때

타종족전을 잘하는것 만으로는 우승이 힘들다


항상 그런 시즌일수록 그 종족 내부를 지배하는자

중략...

이런자들이 결승의 문을 두드린다