上才艺——win32搞一个拼图游戏
今天有人说,天天拖控件好没意思啊,你能不能不用拖控件写一个小游戏,作为一名C/C++程序员话不多说,直接上才艺
这是游戏的效果图
搞错了,再来!!!!!
代码构思
先创建一个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;
OK,大功告成
项目链接
CSDN也设置成零积分了,喜欢的小伙伴可以多多下载,点击左侧上方加号加关注点亮小红心
CSDN:https://mp.csdn.net/console/upDetailed
GitHub:https://github.com/yang-yongli/win32_Pintu
上才艺——win32搞一个拼图游戏相关推荐
- Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
2019独角兽企业重金招聘Python工程师标准>>> 又是一个愉快的夜晚 还是那张长长的工作桌 哲哲在左边做一个香云纱手包 骨头在这里噼里啪啦的解刨 pad里放着<赢在中国& ...
- 一个拼图游戏,包含很多内容。
Hands-On Lab 构建您第一个 Windows Phone 7 应用程序 实验版本号: 1.1.0 最后更新: 1/30/2012 yi目录 概述... 3 练习 1: 利用Mi ...
- JavaScript写一个拼图游戏
拼图游戏的代码400行, 有点多了, 在线DEMO的地址是:打开: 因为使用canvas,所以某些浏览器是不支持的: you know: 为什么要用canvas(⊙o⊙)? 因为图片是一整张jpg或 ...
- python设计拼图游戏tkinter_tkinter做一个拼图游戏
今天我们利用canvas绘制.删除图片的的函数,以及鼠标事件的绑定来制作一个简单的九宫格拼图游戏. 首先从网上下九张图,它们是把一张图分割成了九宫图,打乱后显示在canvas画布上. 接下来我们只要实 ...
- 从开发零基础到登上Steam和Oculus:一个VR游戏开发者的自述
原文:From zero game dev experience to publishing a VR game on Steam & Oculus Home - what I learned ...
- 说太多都是话痨,上才艺——PostMan接口自动化测试(一)
目录 一.接口测试灵魂拷问 二.接口以及接口测试本质 三.接口返回的数据格式 四.市面上接口架构 五.真实企业接口测试流程 六.接口测试工具Postman的使用 七.Postman界面功能 一.接口测 ...
- html5制作拼图游戏教程,用HTML5制作视频拼图的教程
几天前同事给我看了一个特效,是一个拼图游戏,不同的是,拼图里的是动画.他让我看下做个DEMO,于是就自己整了一会,也确实不难.用canvas很容易做.所以这篇博文不适合高手看....就是随便写来玩玩的 ...
- 如何使用 Director 编写“拼图游戏”
如何使用 Director 编写"拼图游戏" 如今,世界上很多大公司都使用 Director 制作自己的多媒体教学光盘..这其中包括微软公司,苹果公司,Adobe 公司等等(尽管这 ...
- android (拼图游戏)数字推盘的简单实现
看了徐宜生android群英传的拼图例子,也想参照他的写一个拼图游戏.本文的拼图游戏中对图片处理的方式和书中的基本是一直的,但是游戏方法却与之不同. 书中的拼图是通过GridView的点击事件,交换两 ...
最新文章
- vue this.$router.push()传参
- AndroidManifest.xml文件详解
- 线性代数导论2——矩阵消元
- 用python下载辞典
- 优秀的程序员应该掌握多少门编程语言?
- linux scrapy 定时任务_2019Python学习教程(全套Python学习视频):Scrapy爬虫框架入门...
- Git时出现“error: 源引用表达式 main 没有匹配 error: 推送一些引用到 ‘https://github.com/***.git‘ 失败”的错误提示
- 计算机视觉基础:图像处理 Task 04:图像滤波
- C#遍历DataSet中数据的几种方法总结
- RuntimeError: view size is not compatible with input tensor‘s size and stride
- 一个算例 介绍 libmesh 的类
- MERIT DEM 90m数据下载
- php静态网页和动态网页,静态网页和动态网页的区别是什么
- oracle awr报告 开关,【Oracle之AWR报告解析】
- NC—NCC常用数据库表
- android视频录制、另一部手机实时观看方案
- java this逃逸_java this引用逃逸详解
- MIT团队开发用脑电波和手势控制机器人的系统
- python web py入门(1)-web.py简介和安装
- 对策论基础---其他类型对策简介
热门文章
- KeilC51_v960a版20200626((含汉字补丁,STC15说明书,stc-isp-15xx-v6.87H)
- 【Windows 应用程序开发详解】四.Windows开发基本概念和相关术语(一)
- Zuul 2 : The Netflix Journey to Asynchronous, Non-Blocking Systems
- rust-所有权和移动
- (C语言)模拟实现库函数strstr()
- HDU 2087 [KMP]
- 适马18-50mm F2.8
- 封装微信分享和扫一扫
- html+css制作简易版Baymax
- 挣脱浏览器的束缚(3) - 两个连接还不够“并行”