在学习grid布局时突发奇想利用这个布局的特性做一个拼图小游戏

先简单实现了一个demo,后期再优化,效果如下图:

先上一下主要的css样式

.container {display: inline-grid;grid-template-columns: repeat(3, 100px);grid-template-rows: repeat(3, 100px);grid-gap: 1px 1px;grid-template-areas:'a b c''d e f''g h i';place-items: center center;place-content: center center;}.container>div {width: 100px;height: 100px;text-align: center;padding: 50px 0;box-sizing: border-box;counter-increment: section1;background-image: url(../images/nkss2.png);background-size: 300% 300%;}

方块的切换是利用的grid布局的grid-area切换实现,简单快捷,至于确定,就是grid-area不支持动画属性,所以没法实现漂亮的滑动效果,主要JS如下:

var AlphaBeta = "abcdefghi";var divs = document.getElementById("content").children;var emptyNode = divs[8];var emptyFlag = 'i';var IsGameOver = false;var startTime = new Date();for (var i = 0; i < divs.length; i++) {divs[i].style["grid-area"] = AlphaBeta[i];divs[i].style["background-position"] = -1 * (i % 3) * 100 + "% " + -1 * Math.floor(i / 3) * 100 + "%";divs[i].addEventListener("click", function(event) {if (getMovePos(emptyFlag).indexOf(this.style.gridRowStart) > -1) {emptyNode.style["grid-area"] = this.style["grid-area"];this.style["grid-area"] = emptyFlag;emptyFlag = emptyNode.style.gridRowStart;if (checkFinished()) {IsGameOver = true;successAnimation();}}})}

另外还有初始时的打乱方法:

// 打乱方法function randomLayut(step) {var pos, ran, node, preNodeFlag;while (step > 0) {pos = getMovePos(emptyFlag);ran = Math.floor((Math.random() * pos.length));while (pos[ran] == undefined || pos[ran] == preNodeFlag) {ran = Math.floor((Math.random() * pos.length));}console.log(pos[ran]);node = [...divs].filter(function(item) {return item.style.gridRowStart == pos[ran];})emptyNode.style["grid-area"] = node[0].style["grid-area"];node[0].style["grid-area"] = emptyFlag;preNodeFlag = emptyFlag;emptyFlag = emptyNode.style.gridRowStart;step--;}}

获取可移动位置的方法:

// 计算可移动的方块位置function getMovePos(empty) {var pos = AlphaBeta.indexOf(empty);if (pos % 3 == 0) {return [AlphaBeta[pos + 1],AlphaBeta[pos + 3],undefined,AlphaBeta[pos - 3]];} else if (pos % 3 == 1) {return [AlphaBeta[pos + 1],AlphaBeta[pos + 3],  AlphaBeta[pos - 1], AlphaBeta[pos - 3]];} else {return [undefined, AlphaBeta[pos + 3], AlphaBeta[pos - 1], AlphaBeta[pos - 3]];}}

以及使用键盘移动的监听方法:

document.onkeydown = function(e){if(IsGameOver)return;var code = e.keyCode || e.which, pos = getMovePos(emptyFlag),node;if (pos[code-37] != undefined) {node = [...divs].filter(function(item) {return item.style.gridRowStart == pos[code-37];})emptyNode.style["grid-area"] = node[0].style["grid-area"];node[0].style["grid-area"] = emptyFlag;emptyFlag = emptyNode.style.gridRowStart;if (checkFinished()) {IsGameOver = true;successAnimation();}}}

完整代码持续更新地址:github地址

使用Grid布局制作拼图小游戏相关推荐

  1. python拼图_利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...

  2. matlab GUI制作拼图小游戏

    matlab GUI制作拼图小游戏 最近帮同学的忙制作一个拼图贴上代码和效果图,以后再详细说明.之前一般找到的拼图游戏都是"推格子"形式的,由于具体的要求,不能应用这种模板. 本人 ...

  3. 利用python制作拼图_利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...

  4. HTML+Javascript制作拼图小游戏详解(一)

    本文章将分享一个来自前端菜鸟突发奇想的拼图游戏制作方法以及实现过程. 话不多说,先上图. 首先我们需要写好网页的基本布局(此处涉及简单的HTML和CSS知识). 网页一共分为三个区域,左侧时间显示区, ...

  5. python制作拼图小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪 ...

  6. 利用python制作拼图_python制作拼图小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 游戏简介: ...

  7. c语言拼图小游戏编程,c语言控制台输出制作拼图小游戏

    这就是另外一个小程序了和那个推箱子很像. #include int a[4][4]; void draw_point(int n) { if(n == 15) { printf("| &qu ...

  8. python设计拼图小游戏_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  9. 教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

最新文章

  1. python整理excel数据-利用python整理需要的excel报表(上)
  2. python 替换array中的值_利用Python提取视频中的字幕(文字识别)
  3. [WPF]程序随系统自启动
  4. 51nod1355-斐波那契的最小公倍数【min-max容斥】
  5. Dubbo(二)之SpringBoot nacos集成
  6. 指定Gradle构建属性
  7. QTP sp等级历年的一些考试辅导题目!(分享)
  8. 安卓fragment笔记
  9. atitit.thumb生成高质量缩略图 php .net c++ java
  10. 如何成功发布一个MSMQ的Windows服务
  11. tiff文件读写等操作(多帧tiff图像保存成的.tif文件)
  12. 关于彻底卸载手心输入法的终极操作
  13. 极简生活牙膏,让你的口腔清新一整天!
  14. 发布功能完成02《ivx低代码签到系统制作》
  15. linux的mysql占用cpu过高_linux 系统中Mysql 进程占用cpu过高的解决
  16. shell中test命令方法详解
  17. background-size设置背景图片自适应 在ie8下失效的问题
  18. 英语口语247之每日十句口语
  19. 2014智联卓聘积分获取新攻略
  20. [LeetCode By Python]167. Two Sum II - Input array is sorted

热门文章

  1. nginx nginx.conf 介绍
  2. 声音引擎Wwise与Criware的区别
  3. 解决Version 3.9.1 with arch x64 not found
  4. 【LSTM时序预测】基于麻雀算法优化长短时记忆SSA-LSTM时序时间序列数据预测(含前后对比)附Matlab代码
  5. 介绍一个可以离线查询 IP 来源和 ISP 信息的终端利器
  6. eWebEditor漏洞分析
  7. PackagesNotFoundError: The following packages are missing from the target environment: - xlrd
  8. 上升沿与带宽的那点事
  9. Matomo给你的网站开通自己的统计分析
  10. taro 之--taro的安装与创建项目