基于jQuery的2048小游戏设计(网页版)
上周模仿一个2048小游戏,总结一下自己在编写代码的时候遇到的一些坑。
游戏规则:省略,我想大部分人都玩过,不写了
源码地址:https://github.com/xinhua6/2048game.git
文件结构:
2048.css 编写游戏样式
index.html 页面结构内容
main2048.js 游戏主逻辑文件,包含初始化格子,随机生成2个数字
game.js 游戏交互逻辑文件,主要包含上下左右移动逻辑
support.js 游戏的基础逻辑文件,提供游戏结束判断,数字移动的前提条件判断
animation.js 游戏的动画逻辑文件,包含数字格子的颜色设计,移动的动画设计
ps:这里我只是写一下注意点,不会把详细的代码都罗列出来,要想看详细的编写代码,请到源码地址:https://github.com/xinhua6/2048game.git 下载。
1.在css样式中没有对每个格子的位置进行设置,利用循环来初始化每个格子。
.grid-cell{
width: 100px;
height: 100px;
border-radius: 6px;
background-color: #ccc0b3;
position: absolute;
margin:0 auto;
}
main.js中
function init() {
for (var i =0;i<4;i++){
board[i] = new Array();
for (var j= 0;j<4;j++){
board[i][j] = 0;
//通过双重遍历获取每个格子的元素
var eachGrid = $('#grid-cell-'+i+'-'+j);
//通过getPostTop()获取每个格子距离顶部的高度和到左端的距离
//eachGrid.css({"top":getPos(i),"left":getPos(j)});无效
eachGrid.css('top',getPos(i));
eachGrid.css('left',getPos(j));
}
}
updateBoardView();
}
support.js文件中
//格子到顶部/左端的距离
function getPos(num) {
return 20+num*120;
}
注意:在这里子元素grid-cell的position要设置为absolute,父元素container的position要设置为relative,这样才可以基于父元素框向左向下偏移位置,否则子元素grid-cell会基于整个屏幕来向左,向下移动
2.随机生成两个数字。(2或者4)。这里三步走:生成一个随机的位置;生成一个随机的数字;在随机的位置上显示随机的数字
function generateOneNumber() {
//生成一个随机位置的随机数
//1生成随机的位置
var randx = parseInt(Math.floor(Math.random()*4));
var randy = parseInt(Math.floor(Math.random()*4));
//定义一个死循环,完成生成随机空格子
while (true){
//如果当前的格子为0,满足条件
if (board[randx][randy] == 0){
break;
}
//否则重新随机一个位置
var randx = Math.floor(Math.random()*4);
var randy = Math.floor(Math.random()*4);
}
//2生成随机的数字,只能生成2或4
var randNumber = Math.random() < 0.5 ? 2 : 4;
//3在随机的位置上显示出随机的数字
board[randx][randy] = randNumber;
showNumberWithAnimation(randx,randy,randNumber);
}
3.这里就向左移来讲解,其余方向的移动逻辑都是类似的。
开始是判断是否能够左移,左移的条件是当前数字所在的格子左边相邻的值为0或者值相等。该函数返回的是boolean值
function canMoveLeft(board) {
for (var i =0;i<4;i++){
for (var j = 1;j<4;j++){
if (board[i][j] != 0){
//当前数字格的左边前一个值为0或者当前数字格的值与左边第一个数字格的值相等
if (board[i][j-1] == 0 || board[i][j-1] == board[i][j]){
return true;
}
}
}
}
return false;
}
紧接着如果判断成立,则进行左移。左移的时候要进行判断,相邻的格子数是否相等,相等要相加,同时成绩上要增加分数;否则,当前的格子的数字移动到相应格子。
function moveLeft() {
//moveLeft 左移要注意不是第一列,第一列无法左移
for (var i = 0; i < 4; i++){
for (var j = 1; j < 4; j++){
if (Number(board[i][j]) != 0){
for (var k = 0;k<j;k++){
if (board[i][k]==0 && noBoardHorizontal(i,k,j,board)) {
//向左移动
showMoveAnimation(i,j,i,k);
board[i][k] = board[i][j];
board[i][j] = 0;
continue;
}else if (board[i][k] == board[i][j] && noBoardHorizontal(i,k,j,board)){
//向左移动
showMoveAnimation(i,j,i,k);
board[i][k] += board[i][j];
score += board[i][k];
updateScore(score);
board[i][j] = 0;
}
}
}
}
}
//设置刷新时间是为了让运动的动画走完再进行跟新数字格,否则数字格运动的动画将会被打断
setTimeout(updateBoardView(),200);
}
//判断当前数字格水平的数字格是否值为0
function noBoardHorizontal(row,col1,col2,board) {
for (var i = col1 + 1; i< col2;i++){
if (board[row][i]!=0){
return false;
}
}
return true;
}
function showMoveAnimation(fromx,fromy,tox,toy) {
//获取当前的数字格的元素
var numberCell = $("#number-cell-"+ fromx + "-" + fromy);
numberCell.animate({
top:getPos(tox),
left:getPos(toy),
},200)
4.最后判断是否游戏结束,以及分数跟新
//跟新分数
function updateScore(num){
$('#score').text(num);
} //判断游戏是否结束
function isgameover(board){
if (!canMoveLeft(board) && !canMoveUp(board) && !canMoveRight(board) && !canMoveDown(board)) {
alert("游戏结束,请重新开始游戏!");
}
}
总结:
这个游戏编程总体不难,只要理清思路,就可以写了,最后调试的时候,比较注意的是:设置setTimeOut时,要注意最后的时间设置。
基于jQuery的2048小游戏设计(网页版)的更多相关文章
- 基于jQuery仿QQ音乐播放器网页版代码
基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class="m ...
- js、jQuery实现2048小游戏
2048小游戏 一.游戏简介: 2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- 2048小游戏代码解析 C语言版
2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图: 游 ...
- HTML+CSS+JavaScript实现2048小游戏
相信很多人都玩过2048小游戏,规则易懂.操作简单,我曾经也“痴迷”于它,不到2048不罢休,最高成绩合成了4096,现在正好拿它来练练手. 我对于2048的实现,除了使用了现有2048小游戏的配色, ...
- c#撸的控制台版2048小游戏
1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...
- C# 开发2048小游戏
这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...
随机推荐
- MySQL登录之socket与TCP
在一台测试服务器上部署了2个实例,一个端口是默认的3306,另一个端口是3376.MySQL的版本是5.6.35 [root@MySQL56_L1 ~]# ps -ef | grep mysql | ...
- day011-网络编程
1. 网络编程概述 1.1 网络编程三要素 地址.端口.协议 1.1.1 IP地址:网络中设备的唯一标识. IPV4格式:xxx.xxx.xxx.xxx由四段数字组成,每一段数字由八位二进制数字组成 ...
- vue2.x 随记
1. 外部js调用vue的方法等 将vue实例中的this传入外部js文件(比如作为某方法的参数),即可访问传入实例的所有内容.调用该实例中子组件的方法,用$refs. 2. 路由参数 传递:vm.$ ...
- jQuery插件编写步骤详解
如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...
- Android(java)学习笔记41:Map集合功能概述
1. 下面通过代码引入Map集合: 如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生 ...
- DEM、DTM和DSM的区别
一.DTM(Digital Terrain Model) 数字地面模型是利用一个任意坐标系中大量选择的已知x.y.z的坐标点对连续地面的一个简单的统计表示,或者说,DTM就是地形表面形态属性信息的数字 ...
- Struts2学习笔记——Struts2搭建和第一个小程序
1.新建web项目 2.配置Struts2核心过滤器 (1)打开web.xml文件,做以下配置: <?xml version="1.0" encoding="UTF ...
- 【luogu P4462 [CQOI2018]异或序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P4462 ax+ax-1+...+ay = cntx+cnty 这样把一段序列变成两段相加跑莫队. #inclu ...
- java中String、包装类、枚举类的引用传递
一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...
- SqlSugar之SqlQueryDynamic返回值处理
现在有个需求,有一张表每个月表名都会变的,但结构是一样的,我们不能再用类映射来完成的,我不能每个月都去手动添加,我们只能使用sql语句来完成这个需求.为了方便我这边选择的是SqlQueryDynami ...