C 自制拼图游戏.docx
《C 自制拼图游戏.docx》由会员分享,可在线阅读,更多相关《C 自制拼图游戏.docx(30页珍藏版)》请在冰豆网上搜索。
C自制拼图游戏
//编译环境VC++6.0.程序和资源一共15M.
//需要的留个EMAIL.... 能上传到这里供大家下载吗?
谁知道告诉我
//自制-拼图游戏 作者:
高坤 转载请标明出处 谢谢
//代码笨拙 高手勿笑 欢迎批评指正
#include
#include
#include
#include
#include"resource.h"
HINSTANCEhInst;
HBITMAPpic,empty,compare_pic,pict[8],compare_pict[8],other; //所有图的变量名
HDChdc,mdc; //DC名
intmouse_x,mouse_y,n=0,line=3,high3=100,high4=200,high5=300; //鼠标XY移动步数难度记录
charstr[10]=""; //字符串,显示步数和记录时用
boolfin=false,new3=true,new4=false,new5=false; //完成难度三四五的重绘
structPoint
{
intx;
inty;
intnum;
}point[26]; //块
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
voidMyPaint(); //显示
voidChange_Block(intblock1,intblock2); //交换两块的属性
voidSave(); //保存记录
voidGetPos(); //为重绘做的随机排列
intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)
{
MSGmsg;
MyRegisterClass(hInstance);
if(!
InitInstance(hInstance,nCmdShow)) //如果实例化失败,退出
{
returnFALSE;
}
while(GetMessage(&msg,NULL,0,0)) //消息循环,一直获取消息,直到消息返回值为假
{
TranslateMessage(&msg); //翻译消息
DispatchMessage(&msg); //将消息发到适当的对象上
}
returnmsg.wParam;
}
ATOMMyRegisterClass(HINSTANCEhInstance) //注册窗口类,通知你要建的窗口是什么样的.可以有多个,用类名来区分
{
WNDCLASSEXwcex; //类名
wcex.cbSize=sizeof(WNDCLASSEX); //类的长度 cb...表示存储空间
wcex.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //窗口风格 水平horizontal.垂直vertical.重画redraw
wcex.lpfnWndProc =(WNDPROC)WndProc; //指向函数的一个指针指向WndProc
//LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
wcex.cbClsExtra =0; //类变量占用的存储(cb表示存储空间的前缀)
wcex.cbWndExtra =0; //实例变量占用的存储
wcex.hInstance =hInstance; //定义该类的应用程序实例的句柄
wcex.hIcon =LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); //图标对象的句柄
wcex.hCursor =LoadCursor(NULL,IDC_ARROW); //光标图像的句柄
wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); //用于擦掉用户区的刷子的句柄
wcex.lpszMenuName =(LPCSTR)IDR_MENU1; //标识选单对象的字符串
wcex.lpszClassName ="CAN"; //该类名字的字符串 lpsz长指针,以\0结束
wcex.hIconSm =NULL; //
returnRegisterClassEx(&wcex); //定义完类的各个对象后注册
}
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
hInst=hInstance;
charfilename[30]="";
hWnd=CreateWindow("CAN","游戏窗口",WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX&~WS_THICKFRAME,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!
hWnd) //类名,用于标识创建的窗口属于哪个类.
{
returnFALSE;
}
MoveWindow(hWnd,80,100,1087,526,true);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hdc=GetDC(hWnd);
mdc=CreateCompatibleDC(hdc); //创建缓存
empty=(HBITMAP)LoadImage(hInstance,"Source\\pic\\empty.bmp",IMAGE_BITMAP,687,526,LR_LOADFROMFILE);
for(intm=0;m<=7;m++)
{
sprintf(filename,"Source\\pic\\pic%d.bmp",m); //读图,没什么好说的
pict[m]=(HBITMAP)LoadImage(hInstance,filename,IMAGE_BITMAP,600,480,LR_LOADFROMFILE);
compare_pict[m]=(HBITMAP)LoadImage(hInstance,filename,IMAGE_BITMAP,450,360,LR_LOADFROMFILE);
}
pic=pict[0];
compare_pic=compare_pict[0];
FILE*fp; //读入record文件中的记录
if((fp=fopen("Source\\record","ab+"))==NULL)
{
MessageBox(NULL,"不能打开record文件,可能被删除,请在Source中重新建立.","",NULL);
returnfalse;
}
else
{
fread(&high3,sizeof(high3),1,fp);
fread(&high4,sizeof(high4),1,fp);
fread(&high5,sizeof(high5),1,fp);
fclose(fp);
}
MyPaint();
returnTRUE;
}
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
PAINTSTRUCTps;
intblock_num=0; //用于鼠标所指的块的编号,非NUM号要区分
switch(message)
{
caseWM_PAINT:
//显示
hdc=BeginPaint(hWnd,&ps);
hdc=GetDC(hWnd);
MyPaint();
EndPaint(hWnd,&ps);
break;
caseWM_COMMAND:
//菜单命令
switch(LOWORD(wParam))
{
caseID_NEWGAME:
fin=0;n=0;
switch(line)
{
case3:
new3=true;break; //读图后要重排图
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC0:
pic=pict[0]; //读入大图
compare_pic=compare_pict[0]; //读入参照图
fin=0;n=0;
switch(line)
{
case3:
new3=true;break; //读图后要重排图
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC1:
pic=pict[1];
compare_pic=compare_pict[1];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC2:
pic=pict[2];
compare_pic=compare_pict[2];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC3:
pic=pict[3];
compare_pic=compare_pict[3];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC4:
pic=pict[4];
compare_pic=compare_pict[4];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC5:
pic=pict[5];
compare_pic=compare_pict[5];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC6:
pic=pict[6];
compare_pic=compare_pict[6];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC7:
pic=pict[7];
compare_pic=compare_pict[7];
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
break;
caseID_PIC8:
if(LoadImage(NULL,"Source\\pic\\other.bmp",IMAGE_BITMAP,600,480,LR_LOADFROMFILE)) //成功载入other.bmp
{
pic=(HBITMAP)LoadImage(NULL,"Source\\pic\\other.bmp",IMAGE_BITMAP,600,480,LR_LOADFROMFILE);
compare_pic=(HBITMAP)LoadImage(NULL,"Source\\pic\\other.bmp",IMAGE_BITMAP,450,360,LR_LOADFROMFILE);
fin=0;n=0;
switch(line)
{
case3:
new3=true;break;
case4:
new4=true;break;
case5:
new5=true;break;
default:
;
}
MyPaint();
}
elseMessageBox(hWnd,"pic文件夹中无other.bmp文件.","说明",NULL); //未成功载入other.bmp
break;
caseID_THREE:
new3=true;new4=false;new5=false;line=3;fin=0;n=0; //如果选难度三,则要重排图,不许四,五重排.难度设为三,标记未完成,n从0记数.
MyPaint();
break;
caseID_FOUR:
new3=false;new4=true;new5=false;line=4;fin=0;n=0;
MyPaint();
break;
caseID_FIVE:
new3=false;new4=false;new5=true;line=5;fin=0;n=0;
MyPaint();
break;
caseID_INTRODUCE:
MessageBox(hWnd,"鼠标点击移动,拼完整即胜利!
\n\n如果想自添加图需要用BMP格式,文件名为other.bmp。
并放入pic文件夹中.","说明",NULL);
break;
caseID_ABOUT:
MessageBox(hWnd,"如发现BUG或有好的建议。
请致信EMAIL:
29648634@。
谢谢!
\n\n\t SpecialThank老婆--悦对我的大力支持!
\n\n\t\t\t\t\t作者:
高坤","说明",NULL);
break;
caseID_EXIT:
DestroyWindow(hWnd);
break;
default: