开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

上才艺——win32搞一个拼图游戏

简介: 上才艺——win32搞一个拼图游戏
+关注继续查看

这是游戏的效果图


image


image


代码构思


先创建一个Windows桌面应用程序拿到一个基本框架


再想 这个拼图游戏要啦些功能(绘制游戏界面,判断胜利,交换位置移动图片…)


首先定义整个游戏要用到的变量


#define NEXT 10
//定义宽高
#define WIDTH 130
#define HEIGHT 130
//定义数组
int map[10][10];
//定义设备描述表
HDC memhdc;
//定义鼠标所在行列
int mouse_row, mouse_col;
//定义空白格所在行列 初始是2 2  也就是第九个格子
int row9 = 2, col9 = 2;


下面是对游戏的初始化,包括9×9二维数组初始化,加载图片



// 初始化
void init()
{
    int s = 0;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            s++;
            map[i][j] = s;
        }
    }

    //随机交换位置
    int r1, c1, c2, r2;
    int a;
    int b;
    for (int t = 0; t < 100; t++)
    {
        a = rand() % 8 + 1;
        b = rand() % 8 + 1;
        r1 = (a - 1) / 3;
        c1 = (a - 1) % 3;
        r2 = (b - 1) / 3;
        c2 = (b - 1) % 3;
        int m;
        m = map[r1][c1];
        map[r1][c1] = map[r2][c2];
        map[r2][c2] = m;
    }
    // 加载图片
    char buf[100];
    wsprintf(buf, "3.bmp", 1);
    load(buf);
}


加载图片的函数


void load(char *filename)
{
    HDC hdc = GetDC(hWnd);
    memhdc = ::CreateCompatibleDC(hdc);
    ReleaseDC(hWnd, hdc);
    HBITMAP bmp = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    SelectObject(memhdc, bmp);
}


之后就写绘制功能了


//绘制游戏界面
void draw()
{
    HDC hdc = GetDC(hWnd);
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
        {
            if (map[i][j] != 9)
            {
                int r, c;
                r = (map[i][j] - 1) / 3;
                c = (map[i][j] - 1) % 3;

                BitBlt(hdc, j*WIDTH, i*HEIGHT, WIDTH, HEIGHT, memhdc, c*WIDTH, r*HEIGHT, SRCCOPY);
            }
            else
            {
                Rectangle(hdc, j*WIDTH, i*HEIGHT, (j + 1)*WIDTH, (i + 1)*HEIGHT);
            }
        }
    ReleaseDC(hWnd, hdc);

}


封装好draw函数后,还需要在主界面的回调函数中 PAINT 消息中进行调用


    case WM_PAINT:
    {
        HDC hdc = BeginPaint(hWnd, &ps);
        // TODO: 在此处添加使用 hdc 的任何绘图代码...
        draw();
        EndPaint(hWnd, &ps);
    }
    break;


进行上述步骤之后,基本的图像就能绘制出来了


下面是鼠标左键点击的功能编写


    // 当鼠标左键按下时候,判断是否能移动,移动后是否拼图完成
    case WM_LBUTTONDOWN:
    {
        // 将鼠标参数传入进行转化
        TurnToRowCol(LOWORD(lParam), HIWORD(lParam));
        if (isNearBlank())  // 判断是否能移动(是否挨着空白格)
        {
            //交换鼠标点击位置与空白位置
            ExChange();
            draw();
            if (isGameOver())   // 判断是否游戏结束
            {
                //显示游戏结束
                if (MessageBox(hWnd, "拼图完成,是否重新开始?", "", MB_OKCANCEL | MB_ICONINFORMATION) == IDOK)
                {
                    init(); //重新初始化数据
                    draw(); //重新绘制
                }
                else
                {
                    DestroyWindow(hWnd);//关闭窗口
                }

            }
        }

    }
    break;


交换数组数据功能封装


//交换数据
void ExChange()
{
    int tmp = map[mouse_row][mouse_col];
    map[mouse_row][mouse_col] = map[row9][col9];
    map[row9][col9] = tmp;
    row9 = mouse_row;
    col9 = mouse_col;
}


当然点击图片时还要判断一下是不是临近空白格,挨着空白格才能交换当前点击的图片与空白的图片位置



//判断是否和空白块相邻
int isNearBlank()
{
    if (mouse_row == row9)
    {
        if (abs(col9 - mouse_col) == 1)
        {
            return true;
        }
    }
    if (mouse_col == col9)
    {
        if (abs(mouse_row - row9) == 1)
        {
            return true;
        }
    }
    return false;
}


当然每交换完一次还需要进行判断是否胜利


//判断游戏结束
int isGameOver()
{
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
        {
            if (map[i][j] != (i * 3 + j + 1))
            {
                return false;
            }
        }
    return true;
}


最后在主窗口的回调函数中还加了一个点击鼠标右键直接绘图完成的功能


    // 当鼠标右键按下时,直接拼图完成
    case WM_RBUTTONDOWN:
    {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
            {
                map[i][j] = i * 3 + j + 1;
            }
        col9 = mouse_col;
        row9 = mouse_row;
        draw();
    }
    break;


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
win32串口编程
翻译自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/dnfiles/html/msdn_serial.htm 老外写的文章,虽比较全面,但很啰嗦,不如看各个函数的文档来得快。
979 0
win7 32与64位系统
如果你像我一样是win7系统4G内存,觉得32位系统只能用3.25G内存有点浪费,而且听说64位系统理论上比32位系统要快一倍,那么我劝你还是不要装64位系统。尼玛自从换了这个64位系统以来碰到的问题和浪费的时间真是受够了。 看看下面这篇来自鲁大师官网的文章你就知道为什么了。           简单的说x86代表32位操作系统 x64代表64位操作系统。如果你的CPU是双核以上,那
1383 0
微软封杀俄罗斯用户:官网禁止下载 Win11/10 系统
微软封杀俄罗斯用户:官网禁止下载Win11/10系统
19 0
Win32页上的所有控件属性与方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/4076452 Win32页上的所有控件。
650 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载