上周模仿一个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样式中没有对每个格子的位置进行设置,利用循环来初始化每个格子。

  1. .grid-cell{
  2. width: 100px;
  3. height: 100px;
  4. border-radius: 6px;
  5. background-color: #ccc0b3;
  6. position: absolute;
  7. margin0 auto;
  8. }

main.js中

  1. function init() {
  2. for (var i =0;i<4;i++){
  3. board[i] = new Array();
  4. for (var j= 0;j<4;j++){
  5. board[i][j] = 0;
  6. //通过双重遍历获取每个格子的元素
  7. var eachGrid = $('#grid-cell-'+i+'-'+j);
  8. //通过getPostTop()获取每个格子距离顶部的高度和到左端的距离
  9. //eachGrid.css({"top":getPos(i),"left":getPos(j)});无效
  10. eachGrid.css('top',getPos(i));
  11. eachGrid.css('left',getPos(j));
  12. }
  13. }
  14. updateBoardView();
  15. }

support.js文件中

  1. //格子到顶部/左端的距离
  2. function getPos(num) {
  3. return 20+num*120;
  4. }

注意:在这里子元素grid-cell的position要设置为absolute,父元素container的position要设置为relative,这样才可以基于父元素框向左向下偏移位置,否则子元素grid-cell会基于整个屏幕来向左,向下移动

2.随机生成两个数字。(2或者4)。这里三步走:生成一个随机的位置;生成一个随机的数字;在随机的位置上显示随机的数字

  1. function generateOneNumber() {
  2. //生成一个随机位置的随机数
  3. //1生成随机的位置
  4. var randx = parseInt(Math.floor(Math.random()*4));
  5. var randy = parseInt(Math.floor(Math.random()*4));
  6. //定义一个死循环,完成生成随机空格子
  7. while (true){
  8. //如果当前的格子为0,满足条件
  9. if (board[randx][randy] == 0){
  10. break;
  11. }
  12. //否则重新随机一个位置
  13. var randx = Math.floor(Math.random()*4);
  14. var randy = Math.floor(Math.random()*4);
  15. }
  16. //2生成随机的数字,只能生成2或4
  17. var randNumber = Math.random() < 0.5 ? 2 : 4;
  18. //3在随机的位置上显示出随机的数字
  19. board[randx][randy] = randNumber;
  20. showNumberWithAnimation(randx,randy,randNumber);
  21. }

3.这里就向左移来讲解,其余方向的移动逻辑都是类似的。

开始是判断是否能够左移,左移的条件是当前数字所在的格子左边相邻的值为0或者值相等。该函数返回的是boolean值

  1. function canMoveLeft(board) {
  2. for (var i =0;i<4;i++){
  3. for (var j = 1;j<4;j++){
  4. if (board[i][j] != 0){
  5. //当前数字格的左边前一个值为0或者当前数字格的值与左边第一个数字格的值相等
  6. if (board[i][j-1] == 0 || board[i][j-1] == board[i][j]){
  7. return true;
  8. }
  9. }
  10. }
  11. }
  12. return false;
  13. }

紧接着如果判断成立,则进行左移。左移的时候要进行判断,相邻的格子数是否相等,相等要相加,同时成绩上要增加分数;否则,当前的格子的数字移动到相应格子。

  1. function moveLeft() {
  2. //moveLeft 左移要注意不是第一列,第一列无法左移
  3. for (var i = 0; i < 4; i++){
  4. for (var j = 1; j < 4; j++){
  5. if (Number(board[i][j]) != 0){
  6. for (var k = 0;k<j;k++){
  7. if (board[i][k]==0 && noBoardHorizontal(i,k,j,board)) {
  8. //向左移动
  9. showMoveAnimation(i,j,i,k);
  10. board[i][k] = board[i][j];
  11. board[i][j] = 0;
  12. continue;
  13. }else if (board[i][k] == board[i][j] && noBoardHorizontal(i,k,j,board)){
  14. //向左移动
  15. showMoveAnimation(i,j,i,k);
  16. board[i][k] += board[i][j];
  17. score += board[i][k];
  18. updateScore(score);
  19. board[i][j] = 0;
  20. }
  21. }
  22.  
  23. }
  24. }
  25. }
  26. //设置刷新时间是为了让运动的动画走完再进行跟新数字格,否则数字格运动的动画将会被打断
  27. setTimeout(updateBoardView(),200);
  28. }
  1. //判断当前数字格水平的数字格是否值为0
  2. function noBoardHorizontal(row,col1,col2,board) {
  3. for (var i = col1 + 1; i< col2;i++){
  4. if (board[row][i]!=0){
  5. return false;
  6. }
  7. }
  8. return true;
  9. }
  1. function showMoveAnimation(fromx,fromy,tox,toy) {
  2. //获取当前的数字格的元素
  3. var numberCell = $("#number-cell-"+ fromx + "-" + fromy);
  4. numberCell.animate({
  5. top:getPos(tox),
  6. left:getPos(toy),
  7. },200)

4.最后判断是否游戏结束,以及分数跟新

  1. //跟新分数
  2. function updateScore(num){
  3. $('#score').text(num);
  4. }
  5.  
  6. //判断游戏是否结束
  7. function isgameover(board){
  8. if (!canMoveLeft(board) && !canMoveUp(board) && !canMoveRight(board) && !canMoveDown(board)) {
  9. alert("游戏结束,请重新开始游戏!");
  10. }
  11. }

总结:

这个游戏编程总体不难,只要理清思路,就可以写了,最后调试的时候,比较注意的是:设置setTimeOut时,要注意最后的时间设置。

基于jQuery的2048小游戏设计(网页版)的更多相关文章

  1. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  2. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

  3. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  4. .NET手撸2048小游戏

    .NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...

  5. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  6. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  7. HTML+CSS+JavaScript实现2048小游戏

    相信很多人都玩过2048小游戏,规则易懂.操作简单,我曾经也“痴迷”于它,不到2048不罢休,最高成绩合成了4096,现在正好拿它来练练手. 我对于2048的实现,除了使用了现有2048小游戏的配色, ...

  8. c#撸的控制台版2048小游戏

    1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...

  9. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

随机推荐

  1. p2psearcher绿色版使用方法

    P2pSearcher大家应该很了解,p2p是一款基于P2P技术的资源搜索软件,基于先进的P2P搜索技术,可在瞬间搜遍全球ED2k网络资源,简单便捷的搜索到ED2K网络上共享的海量影音娱乐,学习资料等 ...

  2. 织梦CMS调用文章列表时,怎么显示短时间格式

    问题描述:织梦在上传文章的时候,默认的上传文章的时间格式都是年.月.日.小时.分钟.秒的格式,怎么才能实现仅显示年.月.日的格式呢? 解决方法: [field:pubdate function=&qu ...

  3. IOS VFL语言(页面布局)

    ● 什么是VFL语言 ● VFL全称是Visual Format Language,翻译过来是“可视化格式语言” ● VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言     VFL ...

  4. Android(java)学习笔记38:Android 短信发送

    1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...

  5. OpenCV人脸识别

    import cv2 filename = 'pic.jpg' def detect(filename): face_cascade = cv2.CascadeClassifier('./haarca ...

  6. Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】

    任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...

  7. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  8. MVC学习二:Controller和View关系

    控制器(Controller)主要是定义方法和加载视图(View) 1.控制器中的Action方法返回值的类型ActionResult,string 2.控制器中Action方法接收浏览器参数方式: ...

  9. asp.net 在repeater控件中加按钮

    在repeater中加入方法有两种方法: 第一种:是对repeater控件的行添加OnItemCommand事件,添加方法也是有两种 1.在设计页面中,选中repeater控件右击==>属性== ...

  10. Android学习笔记_68_ android 9patch 图片

    http://meiyitianabc.blog.163.com/blog/static/10502212720115354948909/