Windows CE용 퍼즐맞추기 게임..관심 좀 가져 주십시오.ㅠㅠ
한참을 책과의 전쟁을 거치고.. 드디어.. 초보탈출을 위한.. 첫 발걸음으로..
어렸을때 하던 퍼즐 맞추기 게임을 ce로 구현해보자 하는 것이었습니다..
자세히는 못하고.. bmp로 받아들여.. 9등분해서.. 퍼즐을 맞추는 간단하게 생각했던 것이..
몇일 몇주가 되도록 고심하고 있네요..
책과 인터넷의 정보를 뒤져가며 만들고 있는데요.. 여기서 제가 몇일 고생하고 있습니다..
제 눈에는 더이상 잘못되어진 것이 없다고 생각하는데요..
자꾸 오류가 생기는 겁니다..ㅠㅠ 두 군데만 해결 잘하면 될꺼같은데요.ㅠㅠ;
이렇게 조금이나마 정보를 얻을 수 있지 않을까 하는 생각에 글을올립니다..
작업은 vs2005 입니다..ㅠㅠ
#include
#include "stdafx.h"
#include "퍼즐게임.h"
const TCHAR szAppName[]=TEXT("PUZZLE");
HINSTANCE hInst;
int gGameBoard[9];
//////////////////////MsinWindowProc용 메시지 분배 해주는 테이블인데요..ㅠㅠ 이게 오류가..ㅠㅠ
const struct decodeUINT MainMessages[]={
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_LBUTTONDOWN, DoMouseMain,
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
MSG msg;
int rc=0;
HWND hwndMain;
hwndMain=InitInstance(hInstance, lpCmdLine, nCmdShow);
if (hwndMain==0) return 0x10;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return TermInstance(hInstance, msg.wParam);
}
HWND InitInstance(HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
HWND hWnd;
hInst=hInstance;
#if defined(WIN32_PLATFORM_PSPC)
hWnd=FindWindow(szAppName, NULL);
if(hWnd){
SetForegroundWindow((HWND)(((DWORD)hWnd)|0x01));
return 0;
}
#endif
wc.style=0;
wc.lpfnWndProc=MainWndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=NULL;
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=szAppName;
if(RegisterClass(&wc)==0) return 0;
hWnd=CreateWindow(szAppName, TEXT("Image Puzzle"), WS_VISIBLE | WS_CAPTION | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if(!IsWindow(hWnd)) return 0; //
srand(0);
int count=1;
int temp;
while (true){
temp=rand()%9;
if(gGameBoard[temp]==0){
gGameBoard[temp]=count;
count++;
}
if(count==9) break;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return hWnd;
}
int TermInstance(HINSTANCE hInstance, int nDefRC)
{
return nDefRC;
}
//////////////콜백함수에서 for문이 이상하게 에러가 자꾸 납니다..
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
int i;
for (i=0; i
if (wMsg==MainMessages[i].Code)
return(*MainMessages[i].Fxn)(hWnd, wMsg, wParam, lParam);
}
return DefWindowProc(hWnd, wMsg, wParam, lParam);
}
LRESULT DoPaintMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
RECT rect;
HDC hdc, memDC;
HBITMAP newBitmap, oldBitmap;
GetClientRect(hWnd, &rect);
static const int WIDTH = rect.right/3;
static const int HIGHT = rect.bottom/3;
hdc=BeginPaint(hWnd, &ps);
newBitmap=SHLoadDIBitmap(TEXT("\\image.bmp"));
memDC=CreateCompatibleDC(hdc);
oldBitmap=(HBITMAP)SelectObject(memDC, newBitmap);
BITMAP bmp;
GetObject(newBitmap, sizeof(BITMAP), &bmp);
static const int BITMAP_WIDTH=bmp.bmWidth/3;
static const int BITMAP_HIGHT=bmp.bmHeight/3;
for (int i=0; i<9; i++){
if (gGameBoard[i]==8) continue;
StretchBlt(hdc, WIDTH*(i%3), HIGHT*(i/3), WIDTH, HIGHT, memDC,
BITMAP_WIDTH*(gGameBoard[i]%3),
BITMAP_HIGHT*(gGameBoard[i]/3),
BITMAP_WIDTH, BITMAP_HIGHT, SRCCOPY);
}
SelectObject(memDC, oldBitmap);
DeleteDC(memDC);
DeleteObject(newBitmap);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT DoDestroyMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
LRESULT DoMouseMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
RECT rect;
GetClientRect(hWnd, &rect);
static const int WIDTH=rect.right/3;
static const int HIGHT=rect.bottom/3;
int x=LOWORD(lParam)/WIDTH; //
int y=HIWORD(lParam)/WIDTH; //
int index=y*3+x;
/*
0 1 2
3 4 5
6 7 8
*/
switch(index){
case 0:
if(gGameBoard[1]==8){
SwapIndex(index, 1);
}
else if(gGameBoard[3]==8){
SwapIndex(index, 3);
}
else return 0;
break;
case 1:
if(gGameBoard[0]==8){
SwapIndex(index, 0);
}
else if(gGameBoard[2]==8){
SwapIndex(index, 2);
}
else if(gGameBoard[4]==8){
SwapIndex(index, 4);
}else return 0;
break;
case 2:
if(gGameBoard[1]==8){
SwapIndex(index, 1);
}
else if(gGameBoard[5]==8){
SwapIndex(index, 5);
}
else return 0;
break;
case 3:
if(gGameBoard[0]==8){
SwapIndex(index, 0);
}
else if(gGameBoard[4]==8){
SwapIndex(index, 4);
}
else if(gGameBoard[6]==8){
SwapIndex(index, 6);
}else return 0;
break;
case 4:
if(gGameBoard[1]==8){
SwapIndex(index, 1);
}
else if(gGameBoard[3]==8){
SwapIndex(index, 3);
}
else if(gGameBoard[5]==8){
SwapIndex(index, 5);
}else if(gGameBoard[7]==8){
SwapIndex(index, 7);
}
else return 0;
break;
case 5:
if(gGameBoard[2]==8){
SwapIndex(index, 2);
}
else if(gGameBoard[4]==8){
SwapIndex(index, 4);
}
else if(gGameBoard[8]==8){
SwapIndex(index, 8);
}
else return 0;
break;
case 6:
if(gGameBoard[3]==8){
SwapIndex(index, 3);
}
else if(gGameBoard[7]==8){
SwapIndex(index, 7);
}
else return 0;
break;
case 7:
if(gGameBoard[4]==8){
SwapIndex(index, 4);
}
else if(gGameBoard[6]==8){
SwapIndex(index, 6);
}
else if(gGameBoard[8]==8){
SwapIndex(index, 8);
}
else return 0;
break;
case 8:
if(gGameBoard[5]==8){
SwapIndex(index, 5);
}
else if(gGameBoard[7]==8){
SwapIndex(index, 7);
}
else return 0;
break;
}
if(isEnd())
{
MessageBox(hWnd, TEXT("Game is END"), TEXT("SUCCESS"), MB_OK);
PostQuitMessage(0);
}
InvalidateRect(hWnd, &rect, true);
return 0;
}
void SwapIndex(int num1, int num2)
{
int temp=gGameBoard[num1];
gGameBoard[num1]=gGameBoard[num2];
gGameBoard[num2]=temp;
}
bool isEnd()
{
for (int i=0; i<9; i++){
if (gGameBoard[i] != i) return false;
}
return true;
}
소스를 다 올리셔도
소스를 다 올리셔도 이걸 다 읽을 사람은 별로 없습니다.
급하신건 알겠지만 PC도 아니고 WinCE 플랫폼에서 돌아가는 소스인데 컴파일을 해볼수도 없고
온전히 컴파일 되는 소스도 아닌데 많고도 많은 종류의 오류중에 그냥 오류가 난다고 하면 어찌 알겠나요.
급하실수록 차분히 무엇이 문제가 되는지 최대한 자세하게 써주시는 편이 답하는 사람도 바로 알려드릴수도 있고
질문하시는 분도 빠르게 답변을 얻을수 있는 방법입니다. 모호한 답변은 대부분의 사람들은 답변이 의무가 아니므로 그냥 지나치게 됩니다.
오류가 났으면 어느 부분에서 어떤 오류가 났는지를 먼저 알려주시고 소스는 첨부파일로
올려주시는 편이 더 좋을것 같네요.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
일단 PC에서
일단 PC에서 개발하시면 PC에서 돌아가는 게임을 만들어보시고 CE로 돌아가도록하는 것이 어떨까요?
소스도 다 안올라왔군요
for 문이 중간에 끊겨있네요~
-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr
코딩하시기 전에 해보면 좋은 것들
개인적인 의견이지만 개발 규모에 관계없이,
1. 게임의 시나리오 작성
2. 규모의 산정
3. 자료 수집
4. 의사코드 작성을 통한 알고리즘의 작성
5. 개발툴, 언어, 라이브러리의 선정
위의 사항을 간단한 노트에 정리해 보세요.
코딩은 마지막에 하는 것임을 느끼게 되실 겁니다.
댓글 달기