#include "resource.h"

HINSTANCE hInst;

HBITMAP pic,empty,compare_pic,pict[8],compare_pict[8],other;    //所有图的变量名

HDC hdc,mdc;                                                    //DC名

int mouse_x,mouse_y,n=0,line=3,high3=100,high4=200,high5=300;   //鼠标X Y 移动步数 难度 记录

char str[10]=" ";                                               //字符串,显示步数和记录时用

bool fin=false,new3=true,new4=false,new5=false;                 //完成 难度三 四 五 的重绘

struct Point

{

int x;

int y;

int num;

}point[26];                                                     //块

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

void MyPaint();                                                  //显示

void Change_Block(int block1,int block2);                        //交换两块的属性

void Save();                                                     //保存记录

void GetPos();                                                   //为重绘做的随机排列

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

MSG msg;

MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))    //如果实例化失败,退出

{

return FALSE;

}

while (GetMessage(&msg, NULL, 0, 0))        //消息循环,一直获取消息,直到消息返回值为假

{

TranslateMessage(&msg);                 //翻译消息

DispatchMessage(&msg);                  //将消息发到适当的对象上

}

return msg.wParam;

}

ATOM MyRegisterClass(HINSTANCE hInstance)    //注册窗口类,通知你要建的窗口是什么样的.可以有多个,用类名来区分

{

WNDCLASSEX wcex;                                      //类名

wcex.cbSize = sizeof(WNDCLASSEX);                     //类的长度       cb...表示存储空间

wcex.style            = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;        //窗口风格  水平horizontal.垂直vertical.重画redraw

wcex.lpfnWndProc    = (WNDPROC)WndProc;               //指向函数的一个指针 指向WndProc

//LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

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长指针,以结束

wcex.hIconSm        = NULL;                           //

return RegisterClassEx(&wcex);                        //定义完类的各个对象后注册

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance;

char filename[30]=" ";

hWnd = CreateWindow("CAN", "游戏窗口", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)          //类名,用于标识创建的窗口属于哪个类.

{

return FALSE;

}

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(int m=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);

return false;

}

else

{

fread(&high3,sizeof(high3),1,fp);

fread(&high4,sizeof(high4),1,fp);

fread(&high5,sizeof(high5),1,fp);

fclose(fp);

}

MyPaint();

return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

int block_num=0;                        //用于鼠标所指的块的编号,非NUM号 要区分

switch (message)

{

case WM_PAINT:                          //显示

hdc = BeginPaint(hWnd, &ps);

hdc=GetDC(hWnd);

MyPaint();

EndPaint(hWnd, &ps);

break;

case WM_COMMAND:                                      //菜单命令

switch(LOWORD(wParam))

{

case ID_NEWGAME:

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;           //读图后要重排图

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC0:

pic=pict[0];                       //读入大图

compare_pic=compare_pict[0];       //读入参照图

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;           //读图后要重排图

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC1:

pic=pict[1];

compare_pic=compare_pict[1];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC2:

pic=pict[2];

compare_pic=compare_pict[2];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC3:

pic=pict[3];

compare_pic=compare_pict[3];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC4:

pic=pict[4];

compare_pic=compare_pict[4];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC5:

pic=pict[5];

compare_pic=compare_pict[5];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC6:

pic=pict[6];

compare_pic=compare_pict[6];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_PIC7:

pic=pict[7];

compare_pic=compare_pict[7];

fin=0;n=0;

switch(line)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

break;

case ID_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)

{

case 3: new3=true;break;

case 4: new4=true;break;

case 5: new5=true;break;

default:;

}

MyPaint();

}

else MessageBox(hWnd,"pic文件夹中无other.bmp文件.","说明",NULL);    //未成功载入other.bmp

break;

case ID_THREE:

new3=true;new4=false;new5=false;line=3;fin=0;n=0;  //如果选难度三,则要重排图,不许四,五重排.难度设为三,标记未完成,n从0记数.

MyPaint();

break;

case ID_FOUR:

new3=false;new4=true;new5=false;line=4;fin=0;n=0;

MyPaint();

break;

case ID_FIVE:

new3=false;new4=false;new5=true;line=5;fin=0;n=0;

MyPaint();

break;

case ID_INTRODUCE:

MessageBox(hWnd,"鼠标点击移动,拼完整即胜利!nn如果想自添加图需要用BMP格式,文件名为other.bmp。并放入pic文件夹中.","说明",NULL);

break;

case ID_ABOUT:

MessageBox(hWnd,"如发现BUG或有好的建议。请致信EMAIL:。谢谢!nnt    Special Thank 老婆--悦 对我的大力支持!nnttttt作者:高坤","说明",NULL);

break;

case ID_EXIT:

DestroyWindow(hWnd);

break;

default:

MessageBox(hWnd,"菜单命令错误!","",NULL);

}

break;

case WM_LBUTTONDOWN:                               //鼠标左键控制块的移动

mouse_x=LOWORD(lParam);                        //记录鼠标的位置

mouse_y=HIWORD(lParam);

block_num=0;

switch(line)

{

case 3:

if(mouse_x<600 && mouse_y<480)                     //鼠标在允许点击的大图上才赋块值

block_num=mouse_x/200+1+(mouse_y/160)*3;

if(!fin && block_num>0)

{

sndPlaySound("Source\sound\click.wav",SND_ASYNC | SND_FILENAME);

switch(block_num)

{

case 1:

if(point[2].num==9)                  //第一块可以与第二块交换

{

Change_Block(1,2);

n++;                                         //移动步数加1

}

else if(point[4].num==9)           //第一块可以与第四块交换

{

Change_Block(1,4);

n++;                                         //移动步数加1

}

break;

case 2:

if(point[1].num==9)                          //第二块可以与第一块交换

{

Change_Block(2,1);

n++;    //移动步数加1

}

else if(point[5].num==9)                          //第二块可以与第五块交换

{

Change_Block(2,5);

n++;    //移动步数加1

}

else if(point[3].num==9)                          //第二块可以与第三块交换

{

Change_Block(2,3);

n++;    //移动步数加1

}

break;

case 3:

if(point[2].num==9)                              //第三块可以与第二块交换

{

Change_Block(3,2);

n++;  //移动步数加1

}

else if(point[6].num==9)                              //第三块可以与第六块交换

{

Change_Block(3,6);

n++;  //移动步数加1

}

break;

case 4:

if(point[1].num==9)                          //第四块可以与第一块交换

{

Change_Block(4,1);

n++;    //移动步数加1

}

else if(point[5].num==9)                          //第四块可以与第五块交换

{

Change_Block(4,5);

n++;    //移动步数加1

}

else if(point[7].num==9)                          //第四块可以与第七块交换

{

Change_Block(4,7);

n++;    //移动步数加1

}

break;

case 5:

if(point[2].num==9)                          //第五块可以与第二块交换

{

Change_Block(5,2);

n++;    //移动步数加1

}

else if(point[4].num==9)                          //第五块可以与第四块交换

{

Change_Block(5,4);

n++;    //移动步数加1

}

else if(point[6].num==9)                          //第五块可以与第六块交换

{

Change_Block(5,6);

n++;    //移动步数加1

}

else if(point[8].num==9)                          //第五块可以与第八块交换

{

Change_Block(5,8);

n++;    //移动步数加1

}

break;

case 6:

if(point[3].num==9)                          //第六块可以与第三块交换

{

Change_Block(6,3);

n++;    //移动步数加1

}

else if(point[5].num==9)                          //第六块可以与第五块交换

{

Change_Block(6,5);

n++;    //移动步数加1

}

else if(point[9].num==9)                          //第六块可以与第九块交换

{

Change_Block(6,9);

n++;    //移动步数加1

}

break;

case 7:

if(point[8].num==9)                  //第七块可以与第八块交换

{

Change_Block(7,8);

n++;                                         //移动步数加1

}

else if(point[4].num==9)           //第七块可以与第四块交换

{

Change_Block(7,4);

n++;                                         //移动步数加1

}

break;

case 8:

if(point[7].num==9)                          //第八块可以与第七块交换

{

Change_Block(8,7);

n++;    //移动步数加1

}

else if(point[5].num==9)                          //第八块可以与第五块交换

{

Change_Block(8,5);

n++;    //移动步数加1

}

else if(point[9].num==9)                          //第八块可以与第九块交换

{

Change_Block(8,9);

n++;    //移动步数加1

}

break;

case 9:

if(point[8].num==9)                              //第九块可以与第八块交换

{

Change_Block(9,8);

n++;  //移动步数加1

}

else if(point[6].num==9)                              //第九块可以与第六块交换

{

Change_Block(9,6);

n++;  //移动步数加1

}

break;

default:;

}

}

break;

case 4:

if(mouse_x<600 && mouse_y<480)

block_num=mouse_x/150+1+(mouse_y/120)*4;

if(!fin && block_num>0)                        //如果block_num没能从鼠标坐标上获取值则说明点的位置不对。

{

sndPlaySound("Source\sound\click.wav",SND_ASYNC | SND_FILENAME);

switch(block_num)

{

case 1:

if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

break;

case 4:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

break;

case 13:

if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 16:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 2:

case 3:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 5:

case 9:

if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 8:

case 12:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

case 14:

case 15:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

break;

default:

if(point[block_num-1].num==16)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+4].num==16)

{

Change_Block(block_num,block_num+4);

n++;

}

else if(point[block_num+1].num==16)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-4].num==16)

{

Change_Block(block_num,block_num-4);

n++;

}

}

}

break;

case 5:

if(mouse_x<600 && mouse_y<480)

block_num=mouse_x/120+1+(mouse_y/96)*5;

if(!fin && block_num>0)                        //如果block_num没能从鼠标坐标上获取值则说明点的位置不对。

{

sndPlaySound("Source\sound\click.wav",SND_ASYNC | SND_FILENAME);

switch(block_num)                                  //移动两块

{

case 1:

if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

break;

case 5:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

break;

case 21:

if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 25:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 2:

case 3:

case 4:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

break;

case 6:

case 11:

case 16:

if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 10:

case 15:

case 20:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

case 22:

case 23:

case 24:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

break;

default:

if(point[block_num-1].num==25)

{

Change_Block(block_num,block_num-1);

n++;

}

else if(point[block_num+5].num==25)

{

Change_Block(block_num,block_num+5);

n++;

}

else if(point[block_num+1].num==25)

{

Change_Block(block_num,block_num+1);

n++;

}

else if(point[block_num-5].num==25)

{

Change_Block(block_num,block_num-5);

n++;

}

}

}

break;

default:;

}

MyPaint();

break;

case WM_CLOSE:

if(IDYES==MessageBox(hWnd,"真的不玩了?","提示",MB_YESNO))

{

DestroyWindow(hWnd);

}

break;

case WM_DESTROY:

int k;

for(k=0;k<7;k++)

{

DeleteObject(pict[k]);

DeleteObject(compare_pict[k]);

}

DeleteObject(compare_pic);

DeleteObject(pic);

DeleteObject(empty);

ReleaseDC(hWnd,hdc);

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

void MyPaint()

{

SelectObject(mdc,empty);                         //贴上背景图

BitBlt(hdc,600,0,487,526,mdc,200,0,SRCCOPY);

SelectObject(mdc,compare_pic);                   //贴上参照图

BitBlt(hdc,617,0,450,360,mdc,0,0,SRCCOPY);

sprintf(str,"%d",n);                             //显示移动步数

TextOut(hdc,817,433,str,strlen(str));

if(3==line)

{

sprintf(str,"%d",high3);                    //在其位置显示最高记录

TextOut(hdc,1007,433,str,strlen(str));

if(new3)                //如果要重排

{

GetPos();            //重排

new3=false;

}

SelectObject(mdc,pic);

for(int i=1;i<=9;i++)

{

switch(i)             //按属性贴图

{

case 1:

BitBlt(hdc,0,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 2:

BitBlt(hdc,200,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 3:

BitBlt(hdc,400,0,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 4:

BitBlt(hdc,0,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 5:

BitBlt(hdc,200,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 6:

BitBlt(hdc,400,160,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 7:

BitBlt(hdc,0,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 8:

BitBlt(hdc,200,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 9:

BitBlt(hdc,400,320,200,160,mdc,point[i].x,point[i].y,SRCCOPY);

break;

default:

MessageBox(NULL,"贴图序列号错误!","",NULL);

}

}

for(int j=1;j<=9;j++)

{

if(point[j].num==9)

{

SelectObject(mdc,empty);

switch(j)                                     //贴上空白图

{

case 1:

BitBlt(hdc,0,0,200,160,mdc,0,0,SRCCOPY);

break;

case 2:

BitBlt(hdc,200,0,200,160,mdc,0,0,SRCCOPY);

break;

case 3:

BitBlt(hdc,400,0,200,160,mdc,0,0,SRCCOPY);

break;

case 4:

BitBlt(hdc,0,160,200,160,mdc,0,0,SRCCOPY);

break;

case 5:

BitBlt(hdc,200,160,200,160,mdc,0,0,SRCCOPY);

break;

case 6:

BitBlt(hdc,400,160,200,160,mdc,0,0,SRCCOPY);

break;

case 7:

BitBlt(hdc,0,320,200,160,mdc,0,0,SRCCOPY);

break;

case 8:

BitBlt(hdc,200,320,200,160,mdc,0,0,SRCCOPY);

break;

case 9:

BitBlt(hdc,400,320,200,160,mdc,0,0,SRCCOPY);

break;

default:;

}

break;

}

}

int finish=0;

for(int k=1;k<=9;k++)

{

if(point[k].num==k)

finish++;            //做完成判断 完成则finish应该为line*line

}

if(finish==9)              //完成则执行

{

fin=true;

sndPlaySound("Source\sound\FTELEP2电火花.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"Finish! Change a harder one,try it again!","恭喜^_^",NULL);

if(n{

Sleep(100);                                        //睡一下,让记录来的别太突然~

high3=n;

SelectObject(mdc,empty);

BitBlt(hdc,1007,433,100,30,mdc,250,0,SRCCOPY);     //贴个背景的绿图,要不如n为44,记录为100,就会出现记录显示为440 再刷新下才能看到是44

sprintf(str,"%d",high3);                            //显示新记录!

TextOut(hdc,1007,433,str,strlen(str));

sndPlaySound("Source\sound\new.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"THE NEW RECORD!","恭喜^_^",NULL);

Save();            //保存新记录到文件

}

}

}

else if(4==line)

{

sprintf(str,"%d",high4);

TextOut(hdc,1007,433,str,strlen(str));

if(new4)

{

GetPos();

new4=false;

}

SelectObject(mdc,pic);

for(int i=1;i<=16;i++)

{

switch(i)

{

case 1:

BitBlt(hdc,0,0,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 2:

BitBlt(hdc,150,0,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 3:

BitBlt(hdc,300,0,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 4:

BitBlt(hdc,450,0,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 5:

BitBlt(hdc,0,120,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 6:

BitBlt(hdc,150,120,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 7:

BitBlt(hdc,300,120,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 8:

BitBlt(hdc,450,120,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 9:

BitBlt(hdc,0,240,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 10:

BitBlt(hdc,150,240,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 11:

BitBlt(hdc,300,240,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 12:

BitBlt(hdc,450,240,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 13:

BitBlt(hdc,0,360,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 14:

BitBlt(hdc,150,360,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 15:

BitBlt(hdc,300,360,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 16:

BitBlt(hdc,450,360,150,120,mdc,point[i].x,point[i].y,SRCCOPY);

break;

default:

MessageBox(NULL,"贴图序列号错误!","",NULL);

}

}

for(int j=1;j<=16;j++)

{

if(point[j].num==16)

{

SelectObject(mdc,empty);

switch(j)

{

case 1:

BitBlt(hdc,0,0,150,120,mdc,0,0,SRCCOPY);

break;

case 2:

BitBlt(hdc,150,0,150,120,mdc,0,0,SRCCOPY);

break;

case 3:

BitBlt(hdc,300,0,150,120,mdc,0,0,SRCCOPY);

break;

case 4:

BitBlt(hdc,450,0,150,120,mdc,0,0,SRCCOPY);

break;

case 5:

BitBlt(hdc,0,120,150,120,mdc,0,0,SRCCOPY);

break;

case 6:

BitBlt(hdc,150,120,150,120,mdc,0,0,SRCCOPY);

break;

case 7:

BitBlt(hdc,300,120,150,120,mdc,0,0,SRCCOPY);

break;

case 8:

BitBlt(hdc,450,120,150,120,mdc,0,0,SRCCOPY);

break;

case 9:

BitBlt(hdc,0,240,150,120,mdc,0,0,SRCCOPY);

break;

case 10:

BitBlt(hdc,150,240,150,120,mdc,0,0,SRCCOPY);

break;

case 11:

BitBlt(hdc,300,240,150,120,mdc,0,0,SRCCOPY);

break;

case 12:

BitBlt(hdc,450,240,150,120,mdc,0,0,SRCCOPY);

break;

case 13:

BitBlt(hdc,0,360,150,120,mdc,0,0,SRCCOPY);

break;

case 14:

BitBlt(hdc,150,360,150,120,mdc,0,0,SRCCOPY);

break;

case 15:

BitBlt(hdc,300,360,150,120,mdc,0,0,SRCCOPY);

break;

case 16:

BitBlt(hdc,450,360,150,120,mdc,0,0,SRCCOPY);

break;

default:;

}

break;

}

}

int finish=0;

for(int k=1;k<=16;k++)

{

if(point[k].num==k)

finish++;

}

if(finish==16)

{

fin=true;

sndPlaySound("Source\sound\FTELEP2电火花.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"Finish! Change a harder one,try it again!","恭喜^_^",NULL);

if(n{

Sleep(100);

high4=n;

SelectObject(mdc,empty);

BitBlt(hdc,1007,433,100,30,mdc,250,0,SRCCOPY);

sprintf(str,"%d",high4);

TextOut(hdc,1007,433,str,strlen(str));

sndPlaySound("Source\sound\new.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"THE NEW RECORD!","恭喜^_^",NULL);

Save();

}

}

}

else if(5==line)

{

sprintf(str,"%d",high5);

TextOut(hdc,1007,433,str,strlen(str));

if(new5)             //更新5X5

{

GetPos();

new5=false;

}

SelectObject(mdc,pic);

for(int i=1;i<=25;i++)

{

switch(i)

{

case 1:

BitBlt(hdc,0,0,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 2:

BitBlt(hdc,120,0,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 3:

BitBlt(hdc,240,0,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 4:

BitBlt(hdc,360,0,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 5:

BitBlt(hdc,480,0,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 6:

BitBlt(hdc,0,96,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 7:

BitBlt(hdc,120,96,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 8:

BitBlt(hdc,240,96,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 9:

BitBlt(hdc,360,96,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 10:

BitBlt(hdc,480,96,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 11:

BitBlt(hdc,0,192,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 12:

BitBlt(hdc,120,192,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 13:

BitBlt(hdc,240,192,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 14:

BitBlt(hdc,360,192,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 15:

BitBlt(hdc,480,192,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 16:

BitBlt(hdc,0,288,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 17:

BitBlt(hdc,120,288,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 18:

BitBlt(hdc,240,288,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 19:

BitBlt(hdc,360,288,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 20:

BitBlt(hdc,480,288,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 21:

BitBlt(hdc,0,384,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 22:

BitBlt(hdc,120,384,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 23:

BitBlt(hdc,240,384,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 24:

BitBlt(hdc,360,384,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

case 25:

BitBlt(hdc,480,384,120,96,mdc,point[i].x,point[i].y,SRCCOPY);

break;

default:

MessageBox(NULL,"贴图序列号错误!","",NULL);

}

}

for(int j=1;j<=25;j++)

{

if(point[j].num==25)

{

SelectObject(mdc,empty);

switch(j)

{

case 1:

BitBlt(hdc,0,0,120,96,mdc,0,0,SRCCOPY);

break;

case 2:

BitBlt(hdc,120,0,120,96,mdc,0,0,SRCCOPY);

break;

case 3:

BitBlt(hdc,240,0,120,96,mdc,0,0,SRCCOPY);

break;

case 4:

BitBlt(hdc,360,0,120,96,mdc,0,0,SRCCOPY);

break;

case 5:

BitBlt(hdc,480,0,120,96,mdc,0,0,SRCCOPY);

break;

case 6:

BitBlt(hdc,0,96,120,96,mdc,0,0,SRCCOPY);

break;

case 7:

BitBlt(hdc,120,96,120,96,mdc,0,0,SRCCOPY);

break;

case 8:

BitBlt(hdc,240,96,120,96,mdc,0,0,SRCCOPY);

break;

case 9:

BitBlt(hdc,360,96,120,96,mdc,0,0,SRCCOPY);

break;

case 10:

BitBlt(hdc,480,96,120,96,mdc,0,0,SRCCOPY);

break;

case 11:

BitBlt(hdc,0,192,120,96,mdc,0,0,SRCCOPY);

break;

case 12:

BitBlt(hdc,120,192,120,96,mdc,0,0,SRCCOPY);

break;

case 13:

BitBlt(hdc,240,192,120,96,mdc,0,0,SRCCOPY);

break;

case 14:

BitBlt(hdc,360,192,120,96,mdc,0,0,SRCCOPY);

break;

case 15:

BitBlt(hdc,480,192,120,96,mdc,0,0,SRCCOPY);

break;

case 16:

BitBlt(hdc,0,288,120,96,mdc,0,0,SRCCOPY);

break;

case 17:

BitBlt(hdc,120,288,120,96,mdc,0,0,SRCCOPY);

break;

case 18:

BitBlt(hdc,240,288,120,96,mdc,0,0,SRCCOPY);

break;

case 19:

BitBlt(hdc,360,288,120,96,mdc,0,0,SRCCOPY);

break;

case 20:

BitBlt(hdc,480,288,120,96,mdc,0,0,SRCCOPY);

break;

case 21:

BitBlt(hdc,0,384,120,96,mdc,0,0,SRCCOPY);

break;

case 22:

BitBlt(hdc,120,384,120,96,mdc,0,0,SRCCOPY);

break;

case 23:

BitBlt(hdc,240,384,120,96,mdc,0,0,SRCCOPY);

break;

case 24:

BitBlt(hdc,360,384,120,96,mdc,0,0,SRCCOPY);

break;

case 25:

BitBlt(hdc,480,384,120,96,mdc,0,0,SRCCOPY);

break;

default:

;

}break;     //遇到成功的就跳出

}

}

int finish=0;

for(int k=1;k<=25;k++)

{

if(point[k].num==k)

finish++;

}

if(finish==25)

{

fin=true;

sndPlaySound("Source\sound\FTELEP2电火花.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"Finish! This is the final map! You Win!","恭喜^_^",NULL);

if(n{

Sleep(100);

high5=n;

SelectObject(mdc,empty);

BitBlt(hdc,1007,433,100,30,mdc,250,0,SRCCOPY);

sprintf(str,"%d",high5);

TextOut(hdc,1007,433,str,strlen(str));

sndPlaySound("Source\sound\new.wav",SND_ASYNC | SND_FILENAME);

MessageBox(NULL,"THE NEW RECORD!","恭喜^_^",NULL);

Save();

}

}

}

}

void Change_Block(int block1,int block2)

{

int temp=0;

temp=point[block1].x;

point[block1].x=point[block2].x;

point[block2].x=temp;

temp=point[block1].y;

point[block1].y=point[block2].y;

point[block2].y=temp;

temp=point[block1].num;

point[block1].num=point[block2].num;

point[block2].num=temp;

}

void Save()

{

FILE *fp;

if((fp=fopen("Source\record","wb+"))==NULL)

{

MessageBox(NULL,"不能打开record文件,可能被删除,请在Source中重新建立.","",NULL);

return;

}

if(fwrite(&high3,sizeof(high3),1,fp)!=1)

MessageBox(NULL,"不能写入记录","",NULL);

if(fwrite(&high4,sizeof(high4),1,fp)!=1)

MessageBox(NULL,"不能写入记录","",NULL);

if(fwrite(&high5,sizeof(high5),1,fp)!=1)

MessageBox(NULL,"不能写入记录","",NULL);

fclose(fp);

}

void GetPos()

{

int now_pos;

for(int j=1;j<=25;j++)

{

point[j].num=j;

}

int i;

switch(line)

{

case 3:

now_pos=9;

for(i=1;i<=9;i++)                                    //对各块从原图中哪个位置读图的坐标进行赋值

{

switch(point[i].num)

{

case 1:point[i].x=0;    point[i].y=0;  break;

case 2:point[i].x=200;  point[i].y=0;  break;

case 3:point[i].x=400;  point[i].y=0;  break;

case 4:point[i].x=0;    point[i].y=160;break;

case 5:point[i].x=200;  point[i].y=160;break;

case 6:point[i].x=400;  point[i].y=160;break;

case 7:point[i].x=0;    point[i].y=320;break;

case 8:point[i].x=200;  point[i].y=320;break;

case 9:point[i].x=400;  point[i].y=320;break;

default:MessageBox(NULL,"初始化point[i]坐标错误!","",NULL);

}

}

break;

case 4:

now_pos=16;

for(i=1;i<=16;i++)                                    //对各块从原图中哪个位置读图的坐标进行赋值

{

switch(point[i].num)

{

case 1:point[i].x=0;    point[i].y=0;    break;

case 2:point[i].x=150;  point[i].y=0;    break;

case 3:point[i].x=300;  point[i].y=0;    break;

case 4:point[i].x=450;  point[i].y=0;    break;

case 5:point[i].x=0;    point[i].y=120;  break;

case 6:point[i].x=150;  point[i].y=120;  break;

case 7:point[i].x=300;  point[i].y=120;  break;

case 8:point[i].x=450;  point[i].y=120;  break;

case 9:point[i].x=0;    point[i].y=240;  break;

case 10:point[i].x=150; point[i].y=240;  break;

case 11:point[i].x=300; point[i].y=240;  break;

case 12:point[i].x=450; point[i].y=240;  break;

case 13:point[i].x=0;   point[i].y=360;  break;

case 14:point[i].x=150; point[i].y=360;  break;

case 15:point[i].x=300; point[i].y=360;  break;

case 16:point[i].x=450; point[i].y=360;  break;

default:MessageBox(NULL,"初始化point[i]坐标错误!","",NULL);

}

}

break;

case 5:

now_pos=25;

for(i=1;i<=25;i++)                                    //对各块从原图中哪个位置读图的坐标进行赋值

{

switch(point[i].num)

{

case 1:point[i].x=0;    point[i].y=0;    break;

case 2:point[i].x=120;  point[i].y=0;    break;

case 3:point[i].x=240;  point[i].y=0;    break;

case 4:point[i].x=360;  point[i].y=0;    break;

case 5:point[i].x=480;  point[i].y=0;    break;

case 6:point[i].x=0;    point[i].y=96;   break;

case 7:point[i].x=120;  point[i].y=96;   break;

case 8:point[i].x=240;  point[i].y=96;   break;

case 9:point[i].x=360;  point[i].y=96;   break;

case 10:point[i].x=480; point[i].y=96;   break;

case 11:point[i].x=0;   point[i].y=192;  break;

case 12:point[i].x=120; point[i].y=192;  break;

case 13:point[i].x=240; point[i].y=192;  break;

case 14:point[i].x=360; point[i].y=192;  break;

case 15:point[i].x=480; point[i].y=192;  break;

case 16:point[i].x=0;   point[i].y=288;  break;

case 17:point[i].x=120; point[i].y=288;  break;

case 18:point[i].x=240; point[i].y=288;  break;

case 19:point[i].x=360; point[i].y=288;  break;

case 20:point[i].x=480; point[i].y=288;  break;

case 21:point[i].x=0;   point[i].y=384;  break;

case 22:point[i].x=120; point[i].y=384;  break;

case 23:point[i].x=240; point[i].y=384;  break;

case 24:point[i].x=360; point[i].y=384;  break;

case 25:point[i].x=480; point[i].y=384;  break;

default:MessageBox(NULL,"初始化point[i]坐标错误!","",NULL);

}

}

break;

default:;

}

srand((unsigned)time(NULL));

for(int k=0;k<200;k++)

{

switch(rand()%4)

{

case 0:

if((now_pos+1) % line!=1)

{

Change_Block(now_pos,now_pos+1);

now_pos++;

}

break;

case 1:

if((now_pos-1) % line!=0)

{

Change_Block(now_pos,now_pos-1);

now_pos--;

}

break;

case 2:

if(now_pos+line < line*line)

{

Change_Block(now_pos,now_pos+line);

now_pos+=line;

}

break;

case 3:

if(now_pos-line>0)

{

Change_Block(now_pos,now_pos-line);

now_pos-=line;

}

break;

default:;

}

}

}

C语言数组制作拼图游戏,C语言例子自制拼图游戏相关推荐

  1. C语言数组制作拼图游戏,C语言自制拼图游戏.doc

    C语言自制拼图游戏 C语言~~自制-拼图游戏 原帖及讨论:/thread-233257-1-1.html //编译环境VC++6.0. 程序和资源一共15M. 来自 //需要的留个EMAIL.... ...

  2. C语言 数组定义和使用 - C语言零基础入门教程

    目录 一.数组简介 二.定义数组并初始化 1.定义数组 2.初始化数组 三.访问数组 四.修改数组 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言 ...

  3. c语言数组判断不及格人数,C语言编程 运用数组求不及格人数

    C语言编程题,求数组89,80,95,84,73,84,91,78,87,94的和以及平均值 #includevoid main(){ int a[10]={89,80,95,84,73,84,91, ...

  4. 单片机秒表c语言,单片机制作秒表计时器(c语言)

    利用计数器中断,外部中断(按钮)编写的机遇c语言的秒表计时器 利用单片机制作秒表计时器 (c语言) #include//包含单片机对应的头文件 int MM=0,SS=0,MS=0; int time ...

  5. c 超文本标记语言,网页制作的超文本标记语言称为() - 问答库

    问题: [单选] 网页制作的超文本标记语言称为() A . HTML语言 B . VB语言 C . BASIC语言 D . C#语言 如何创建报表? 孔孟 Your companys security ...

  6. c语言数组添加字符元素,C语言数组添加和删除元素的实现

    数组不擅长插入(添加)和删除元素.数组的优点在于它是连续的,所以查找数据速度很快.但这也是它的一个缺点.正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移:而删除一个元素时,删除 ...

  7. c语言数组详解视频,C语言数组详解

    <C语言数组详解>由会员分享,可在线阅读,更多相关<C语言数组详解(55页珍藏版)>请在人人文库网上搜索. 1.就是一组具有固定数目的.有序的.类型相同的数据的集合.根据数组下 ...

  8. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  9. c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用

    唉,有这么多不同主题的书.在哪里才能找到有关中国音乐的书呢? 数组是可以在内存中连续存储多个元素的结构 数组中的所有元素必须属于相同的数据类型 1.在计算机内存中,同一数组的所有元素按下标顺序依次存放 ...

  10. c语言数组的一维编程,C语言编程一维数组的使用.doc

    C语言编程一维数组的使用 实验 一维数组的使用 [实验目的 1掌握数组定义和初始化方法. 2熟悉使用字符数组处理字符串处理的方法.实验内容10个学生的成绩,求平均成绩,并将低于平均成绩的分数打印出来. ...

最新文章

  1. 出一个简单的Spring框架入门教程
  2. 机器人编程语言python-入门篇丨使用EV3机器人,趣味学习Python编程语言~
  3. idea 构建spring_以Spring方式构建企业Java应用程序
  4. python测试字符串类型的函数_python-02 数据类型 字符串str
  5. 将指定的计数添加到信号量中会导致其超过_并发编程用不上?Semaphore信号量了解一下...
  6. python制作图片墙_利用python生成照片墙的示例代码
  7. SQLite 3.31.0 发布,世界上使用量最大的数据库引擎
  8. java用户输入_如何用Java获取用户输入?
  9. Apache与Tomcat的区别
  10. win xp开机报错|内存不能为written
  11. LDA通俗理解LDA主题模型
  12. java vo转map_javabean实体类对象转为Map类型对象的方法(转发)
  13. python append函数_Python程序性能分析
  14. php解析压缩包csv文件,php解析csv文件
  15. 两种方法递归斐波那契数列
  16. c++比c快?一道字符串题目
  17. MATLAB热障涂层成像,考虑孔隙细观特征的热障涂层脱粘缺陷超声检测数值模拟
  18. 鼠标计算机英语怎么说,计算机鼠标器,computer mouse,音标,读音,翻译,英文例句,英语词典...
  19. 模型可视化工具Netron手把手教学
  20. 小米屡次违反GPL协议,疑成“惯犯”

热门文章

  1. 计算机上的无线网络开关怎么打开,无线网络开关怎么开启
  2. PHP管理虚拟机,用phpvirtualbox管理vbox虚拟机
  3. 02 编程猫之小猫酷跑我设计
  4. Web Proxy Auto-Discovery Service
  5. mysql ibd文件删除_误删除MySQL数据库表的ibd文件怎么办
  6. Python 内置函数dir()与对象的特殊属性以及一切都是对象的轻谈
  7. java后端getmonth_Java中的LocalDateTime getMonth()方法
  8. FPGA 学习笔记(十一) VGA驱动的实现
  9. linux清空文件夹的命令_Linux 学习
  10. 法宝合成时的五行位置分配是什么