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

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

这是游戏的效果图




代码构思


先创建一个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;


相关文章
|
存储 安全 网络安全
铁壁如墙-WINDOWS SERVER 2019勒索病毒终极防御指南
铁壁如墙-WINDOWS SERVER 2019勒索病毒终极防御指南
817 0
|
测试技术 C# Windows
C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试
原文:C# WPF 显示图片和视频显示 EmuguCv、AForge.Net测试 WPF 没有用到 PictureBox, 而是用Image代替. 下面我试着加载显示一个图片 。 XAML CS Attempt 1: ImageMy_Image=newImage(Openfile.
1996 0
idea快速生成get set 构造方法的快捷键
idea快速生成get set 构造方法的快捷键
544 0
|
开发框架 前端开发 JavaScript
移动应用开发新趋势:跨平台框架对比
【6月更文挑战第27天】移动应用开发趋势转向跨平台框架,如Flutter(Google,Dart,快速开发,精美UI)、React Native(Facebook,JavaScript,庞大社区,原生模块支持)、Xamarin(C#,代码共享,.NET库)、NativeScript(原生渲染,Angular/Vue支持)。选择框架时需考虑项目需求、团队技能和性能要求。
|
Web App开发 API C语言
C语言图形界面库的研究与应用
C语言图形界面库的研究与应用
372 1
ly~
|
12月前
|
数据可视化 BI API
除了 OpenGL,还有哪些常用的图形库可以在 C 语言中使用?
除了OpenGL,C语言中还有多个常用的图形库:SDL,适合初学者,用于2D游戏和多媒体应用;Allegro,高性能,支持2D/3D图形,广泛应用于游戏开发;Cairo,矢量图形库,支持高质量图形输出,适用于数据可视化;SFML,提供简单接口,用于2D/3D游戏及多媒体应用;GTK+,开源窗口工具包,用于创建图形用户界面。这些库各有特色,适用于不同的开发需求。
ly~
2585 4
|
搜索推荐
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)
431 0
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
2182 3
|
11月前
|
存储 项目管理 开发工具
掌握Git版本控制,提升团队协作效率
掌握Git版本控制,提升团队协作效率
206 0
|
消息中间件 开发框架 关系型数据库
02常见消息中间件对比
02常见消息中间件对比
180 0