HTML5小游戏《智力大拼图》发布,挑战你的思维风暴

一,前言

本游戏是鄙人研究lufylegend数日之后,闲暇之余写下的。本游戏运用全新的技术HTML5写成的。游戏引擎为国产的lufylegend.js,大家可以去它的官网看看。游戏处于测试阶段,希望各位为游戏提点意见。另外游戏中的拼图是随即分配,保证游戏的随即性。

二,怎么玩?

下载地址(含原码+图片):

http://files.cnblogs.com/ducle/Puzzle.rar

在线试玩:

http://www.lufylegend.com/lufylegend_developers/yorhom_puzzle/index.html

操作说明:

进入游戏后,通过点击拼图块,让图片还原,本游戏包含了游戏记录,大家可以给朋友互相比一比,看谁能在最短时间内让图片还原。

三,游戏还需更新的地方

1,拼图打乱后,如果永远不能还原,不能重新打乱。

2,游戏记录存在缺陷。

3,加入玩家自己的图片。

四,游戏引擎

本游戏运用国产的lufylegend引擎,版本为1.5.2,如果大家感兴趣可以去官网看看:

http://lufylegend.com/lufylegend

上面有此引擎的下载和API介绍。它是一个非常适合做游戏的引擎,在这里不多说了。

五,游戏截图

随机打乱的拼图块:

简洁的开始界面:

点击空缺处附近的一块可以使那一块向空缺处移动:

var setScreenWidth = 390;
var setScreenHeight = 500;
init(50,"mylegend",setScreenWidth,setScreenHeight,main);
LSystem.screen(LStage.FULL_SCREEN);

var backLayer,loadingLayer,imgLayer,ctrlLayer,borderLayer,overLayer,initGameLayer,recordLayer,aboutLayer;
var steps = 0,time = 0;
var grades;
var isWin = 0;
var imglist = {};
var imgData = [
    {name:"garden",path:"./images/garden.jpg"},
    {name:"outside",path:"./images/outside.jpg"},
    {name:"button01",path:"./images/button01.png"},
    {name:"button02",path:"./images/button02.png"},
    {name:"button03",path:"./images/button03.png"},
    {name:"button04",path:"./images/button04.png"},
    {name:"button05",path:"./images/button05.png"},
    {name:"gameover_rect",path:"./images/rect.png"},
    {name:"button01_over",path:"./images/button01_over.png"},
    {name:"button02_over",path:"./images/button02_over.png"},
    {name:"button04_over",path:"./images/button04_over.png"},
    {name:"button05_over",path:"./images/button05_over.png"}
];

function main(){
    loadingLayer = new LoadingSample1();
    addChild(loadingLayer);
    LLoadManage.load(
        imgData,
        function(progress){
            loadingLayer.setProgress(progress);
        },
        function(result){
            imglist = result;
            removeChild(loadingLayer);
            loadingLayer = null;
            //加入游戏开始时的背景
            gameInitBack();
            }
    );
}
var mapLookData;
function gameInit(){
    mapLookData = Math.ceil(Math.random()*(1-(-1))-1);

    //初始化游戏层
    initLayer();
    //初始化背景
    initBackground();
    //调用随即分配地图的函数
    getRandomMap();
    //加入两个用户可见的变量
    addText();
    //加入要达到的图片
    addTrueImg();
    //初始化拼图块
    initImg();
}
var startBtn;
var aboutBtn;
var recordBtn;
var initTextContent = ["智力大拼图","版本:v0.1"];
var initText;
function gameInitBack(){
    gameInit();
    initGameLayer = new LSprite();
    backLayer.addChild(initGameLayer);

    initGameLayer.graphics.drawRect(3,"dimgray",[15,30,360,440],true,"lightgray");

    for(var i=0;i<initTextContent.length;i++){
        initText = new LTextField();
        initText.weight = "bold";
        initText.text = initTextContent[i];
        if(i==0){
            initText.size = 25;
              initText.color = "dimgray";
            initText.font = "黑体";
            initText.x = (LGlobal.width - initText.getWidth())*0.5;
            initText.y = 130;
        }
        if(i==1){
            initText.size = 15;
              initText.color = "white";
            initText.font = "宋体";
            initText.x = (LGlobal.width - initText.getWidth())*0.5;
            initText.y = 170;    
        }
        initGameLayer.addChild(initText);
    }

    startBtn = new LButton(new LBitmap(new LBitmapData(imglist["button01"])),
        new LBitmap(new LBitmapData(imglist["button01_over"])));  
    startBtn.x = (LGlobal.width - startBtn.getWidth())*0.5;
    startBtn.y = 200;  
    initGameLayer.addChild(startBtn);

    aboutBtn = new LButton(new LBitmap(new LBitmapData(imglist["button05"])),
        new LBitmap(new LBitmapData(imglist["button05_over"])));  
     aboutBtn.x = (LGlobal.width - aboutBtn.getWidth())*0.5;  
        aboutBtn.y = 250;  
        initGameLayer.addChild(aboutBtn);
 
 
    recordBtn = new LButton(new LBitmap(new LBitmapData(imglist["button02"])),
        new LBitmap(new LBitmapData(imglist["button02_over"])));  
     recordBtn.x = (LGlobal.width - recordBtn.getWidth())*0.5;  
        recordBtn.y = 300;  
        initGameLayer.addChild(recordBtn);

        startBtn.addEventListener(LMouseEvent.MOUSE_DOWN, function(){
        //加入事件监听
        addEvent();
        
        if(startStatus == 0){
            startStatus++;
            changeTime = setInterval(function(){time+=1; timeText.text = "游戏用时:"+time;},1000);
        }
        LTweenLite.to(initGameLayer,1,{alpha:1});
        initGameLayer.removeAllChild();
        backLayer.removeChild(initGameLayer);
    });  
    recordBtn.addEventListener(LMouseEvent.MOUSE_DOWN, function(){
        showRecord();
    });
    aboutBtn.addEventListener(LMouseEvent.MOUSE_DOWN, aboutGame);

    LTweenLite.to(initGameLayer,1,{alpha:0.9});
}
var initCloseBtn;
var aboutTextArr = ["关于游戏","游戏引擎:lufylegend","游戏版本:v0.1","程序设计:Yorhom","素材来源:按钮自画,拼图来自网络","我的博客:blog.csdn.net/yorhomwang","我的邮箱:wangyuehao1999@gmail.com"];
var aboutText;

function aboutGame(){
    aboutLayer = new LSprite();
    backLayer.addChild(aboutLayer);

    aboutLayer.graphics.drawRect(3,"dimgray",[15,30,360,440],true,"lightgray");

    initCloseBtn = new LButton(new LBitmap(new LBitmapData(imglist["button03"])),
        new LBitmap(new LBitmapData(imglist["button03"])));  
    initCloseBtn.x = 342;
    initCloseBtn.y = 33;  
    aboutLayer.addChild(initCloseBtn);
    initCloseBtn.addEventListener(LMouseEvent.MOUSE_DOWN, function(event){
        LTweenLite.to(aboutLayer,1,{alpha:1});
        aboutLayer.removeAllChild();
        backLayer.removeChild(aboutLayer);
    });
    LTweenLite.to(aboutLayer,1,{alpha:0.9});

    for(var i=0;i<aboutTextArr.length;i++){
        aboutText = new LTextField();
        aboutText.weight = "bold";
        aboutText.text = aboutTextArr[i];
        if(i==0){
            aboutText.size = 25;
              aboutText.color = "dimgray";
            aboutText.font = "黑体";
            aboutText.x = (LGlobal.width - aboutText.getWidth())*0.5;
            aboutText.y = 33;
        }else{
            aboutText.size = 12;
              aboutText.color = "white";
            aboutText.font = "Tahoma";
            aboutText.x = 30;
            aboutText.y = 100 + (i-1)*22;    
        }
        aboutLayer.addChild(aboutText);
    }    
}
function initLayer(){
    backLayer = new LSprite();
    addChild(backLayer);

    imgLayer = new LSprite();
    backLayer.addChild(imgLayer);

    borderLayer = new LSprite();
    backLayer.addChild(borderLayer);

    overLayer = new LSprite();
    backLayer.addChild(overLayer);

    ctrlLayer = new LSprite();
    backLayer.addChild(ctrlLayer);
}
function initBackground(){
    //画出图片上的横向网格
    var color = "gray";
    for(var i=0;i<3;i++){
        borderLayer.graphics.drawRect(5,color,[0,i*130,setScreenWidth,130],false);
    }
    //画出图片上的纵向网格
    for(var i=0;i<3;i++){
        borderLayer.graphics.drawRect(5,color,[i*130,0,130,390],false);
    }
    //画出游戏的边框和背景
    borderLayer.graphics.drawRect(6,"dimgray",[0,0,setScreenWidth,setScreenHeight],false);
    backLayer.graphics.drawRect(5,"dimgray",[0,0,setScreenWidth,setScreenHeight],true,"lightgray");
}
//地图数组
var tileData = [
    [0,1,2],
    [3,4,5],
    [6,8,7]
];

function initImg(){
    var i,j;
    var index,indexY,indexX;
    var bitmapdata,bitmap;

    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            //从地图数组中得到相应位置的图片坐标
            index = tileData[i][j];
            //小图片的竖坐标
            indexY = Math.floor(index/3);
             //小图片的横坐标
            indexX = index - indexY*3;
 
            //得到小图片
            if(mapLookData==0){
                bitmapdata = new LBitmapData(imglist["garden"],indexX*130,indexY*130,130,130);
            }else{
                bitmapdata = new LBitmapData(imglist["outside"],indexX*130,indexY*130,130,130);
            }
            //bitmapdata = new LBitmapData(imglist["garden"],indexX*130,indexY*130,130,130);
            bitmap = new LBitmap(bitmapdata);
            //设置小图片的显示位置
            bitmap.x = j*130;  
            bitmap.y = i*130;
            //将小图片显示到地图层
            imgLayer.addChild(bitmap);
            }
    }
    toWin();
    stepText.text = "行动次数:"+steps;
}
//原数组
var tileOriginaArray = [];
//最终数组
var finallyMapArry = [];

function getRandomMap(){
    //用来装每一行的值的临时数组
    var partTimeArray = [];
    //用于遍历变量
    var i,j;
    //设置最大限度
    var count = 9;

    //第一次遍历让原数组获得值
    for(i=0;i<count;i++){
        tileOriginaArray[i] = i;
    }
    //将原数组打乱顺序
    tileOriginaArray.sort(function(){return 0.5 - Math.random();});
    //第二次遍历让原数组分割成二维数组
    for(j=0;j<count;j++){
        //给二维数组某一行赋值
        partTimeArray[partTimeArray.length] = tileOriginaArray[j];
        //判断是否达到每行需要的列数
        if((j+1)%3==0){
            //给最终数组装入每一行
            finallyMapArry.push(partTimeArray);
            //清空临时数组
            partTimeArray = [];
        }
    }
    //给地图数组赋值为最终数组
    tileData = finallyMapArry;
}
function addTrueImg(){
    var trueBitmapdata,trueBitmap;
    
    if(mapLookData==0){
        trueBitmapdata = new LBitmapData(imglist["garden"]);
    }else{
        trueBitmapdata = new LBitmapData(imglist["outside"]);
    }
    trueBitmap = new LBitmap(trueBitmapdata);
    trueBitmap.x = 160;
    trueBitmap.y = 400;
    trueBitmap.scaleX = 0.2;
    trueBitmap.scaleY = 0.2;
    overLayer.addChild(trueBitmap);

    overLayer.graphics.drawRect(3,"dimgray",[15,423,120,28],false);
    overLayer.graphics.drawRect(3,"dimgray",[255,423,120,28],false);
}
function addEvent(event){
    imgLayer.addEventListener(LMouseEvent.MOUSE_DOWN,onDown);
}
var partX,partY;
var changeTime;
var startStatus = 0;

function onDown(event){
    var mouseX,mouseY;
    mouseX = event.offsetX;
    mouseY = event.offsetY;

    partX = Math.floor(mouseX/130);
    partY = Math.floor(mouseY/130);
    queryMove(partX,partY);
}
function queryMove(x,y){
    steps+=1;

    if(x<2 && tileData[y][x+1] == 8){
        tileData[y][x+1] = tileData[y][x];
        tileData[y][x] = 8;
        initImg();
    }else if(x>0 && tileData[y][x-1] == 8){
        tileData[y][x-1] = tileData[y][x];
        tileData[y][x] = 8;
        initImg();
    }else if(y<2 && tileData[y+1][x] == 8){
        tileData[y+1][x] = tileData[y][x];
        tileData[y][x] = 8;
        initImg();
    }else if(y>0 && tileData[y-1][x] == 8){
        tileData[y-1][x] = tileData[y][x];
        tileData[y][x] = 8;
        initImg();
    }
}
//正确数组
var trueTileData = [
    [0,1,2],
    [3,4,5],
    [6,7,8]
];
var amount;
localStorage["locRecordNo"] = 0;

function toWin(){
    if(isWin != 1 && tileData.toString() == trueTileData.toString()){
        amount = steps + time;
        gameOver();
        writeRecord();
    }
}
//定义输出层
var stepText;
var timeText;

function addText(){    
    stepText = new LTextField();
    stepText.size = 10;
      stepText.color = "black";
    stepText.x = 20;
    stepText.y = 430;
    overLayer.addChild(stepText);

    timeText = new LTextField();
    timeText.size = 10;
      timeText.color = "black";
    timeText.text = "游戏用时:"+time;
    timeText.x = 260;
    timeText.y = 430;
    overLayer.addChild(timeText);
}
var btn01;
var btn02;
var gameoverBitMap;
var winText;
var winTextContent = [];

function gameOver(){
    if(amount<40){
        grades = "圣者";
    }else if(amount>39 && amount<80){
        grades = "前将军";
    }else if(amount>79 && amount<160){
        grades = "左将军";
    }else if(amount>159 && amount<200){
        grades = "右将军";
    }else if(amount>199 && amount<240){
        grades = "中将军";
    }else if(amount>239 && amount<300){
        grades = "后将军";
    }else if(amount>299 && amount<500){
        grades = "帐中军师";
    }else if(amount>499 && amount<1000){
        grades = "小小策士";
    }else if(amount>999 && amount<2000){
        grades = "献世小卒";
    }else{
        grades = "押粮步兵";
    }
    winTextContent = ["恭喜您,您通关了","您的等级是:"+grades];

    gameoverBitMap = new LBitmap(new LBitmapData(imglist["gameover_rect"]));
    gameoverBitMap.x = 30;
    gameoverBitMap.y = 100;
    ctrlLayer.addChild(gameoverBitMap);

    imgLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);
    clearInterval(changeTime);
    startStatus = -1;
    isWin = 1;

    for(var i=0;i<winTextContent.length;i++){
        winText = new LTextField();
        winText.weight = "bold";
        winText.text = winTextContent[i];
        if(i==0){
            winText.size = 25;
              winText.color = "dimgray";
            winText.font = "黑体";
            winText.x = (LGlobal.width - winText.getWidth())*0.5;
            winText.y = 130;
        }
        if(i==1){
            winText.size = 15;
              winText.color = "white";
            winText.font = "宋体";
            winText.x = (LGlobal.width - winText.getWidth())*0.5;
            winText.y = 170;    
        }
        ctrlLayer.addChild(winText);
    }

    btn01 = new LButton(new LBitmap(new LBitmapData(imglist["button01"])),
        new LBitmap(new LBitmapData(imglist["button01_over"])));  
    btn01.x = (LGlobal.width - btn01.getWidth())*0.5;
    btn01.y = 200;  
    ctrlLayer.addChild(btn01);  
 
    btn02 = new LButton(new LBitmap(new LBitmapData(imglist["button02"])),
        new LBitmap(new LBitmapData(imglist["button02_over"])));  
     btn02.x = (LGlobal.width - btn02.getWidth())*0.5;  
        btn02.y = 250;  
        ctrlLayer.addChild(btn02);

        btn01.addEventListener(LMouseEvent.MOUSE_DOWN, reStart);  
    btn02.addEventListener(LMouseEvent.MOUSE_DOWN, showRecord);

    LTweenLite.to(ctrlLayer,1,{alpha:0.9});
}
function reStart(event){
    backLayer.removeAllChild();
    removeChild(backLayer);
    gameInit();
    addEvent();
    stepText.text = "行动次数:0";
    steps = 0;
    time = 0;
    startStatus = 0;    

    if(startStatus == 0){
        startStatus++;
        changeTime = setInterval(function(){time+=1; timeText.text = "游戏用时:"+time;},1000);
    }
    LTweenLite.to(ctrlLayer,1,{alpha:1});
    ctrlLayer.removeAllChild();
    isWin = 0;
}
var recordRunTimesArry;
var recordTimeArry;
var maxTimeArr = [];
var maxRunTimesArr = [];

function writeRecord(){
    if(localStorage["locRecordRunTimesArry"] == undefined || localStorage["locRecordTimeArry"] == undefined){
        localStorage.setItem("locRecordRunTimesArry",'');
        localStorage.setItem("locRecordTimeArry",'');

        recordRunTimesArry = localStorage["locRecordRunTimesArry"].split(",");
        recordTimeArry = localStorage["locRecordTimeArry"].split(",");

        recordRunTimesArry[recordRunTimesArry.length] = steps;
        localStorage["locRecordRunTimesArry"] = recordRunTimesArry;

        recordTimeArry[recordTimeArry.length] = time;
        localStorage["locRecordTimeArry"] = recordTimeArry;
    }else{
        recordRunTimesArry = localStorage["locRecordRunTimesArry"].split(",");
        recordTimeArry = localStorage["locRecordTimeArry"].split(",");

        recordRunTimesArry[recordRunTimesArry.length] = steps;
        localStorage["locRecordRunTimesArry"] = recordRunTimesArry;

        recordTimeArry[recordTimeArry.length] = time;
        localStorage["locRecordTimeArry"] = recordTimeArry;
    }
}
var btn03;
var btn04;
function showRecord(){
    if(localStorage["locRecordRunTimesArry"] == undefined || localStorage["locRecordTimeArry"] == undefined){
        localStorage.setItem("locRecordRunTimesArry",'');
        localStorage.setItem("locRecordTimeArry",'');

        recordRunTimesArry = localStorage["locRecordRunTimesArry"].split(",");
        recordTimeArry = localStorage["locRecordTimeArry"].split(",");
    }else{
        recordRunTimesArry = localStorage["locRecordRunTimesArry"].split(",");
        recordTimeArry = localStorage["locRecordTimeArry"].split(",");
    }
    recordLayer = new LSprite();
    backLayer.addChild(recordLayer);

    getRecord();
    printRecordFont();
    recordLayer.graphics.drawRect(3,"dimgray",[15,30,360,440],true,"lightgray");
    LTweenLite.to(recordLayer,1,{alpha:0.9});

    btn03 = new LButton(new LBitmap(new LBitmapData(imglist["button03"])),
        new LBitmap(new LBitmapData(imglist["button03"])));  
    btn03.x = 342;
    btn03.y = 33;  
    recordLayer.addChild(btn03);
    
    btn04 = new LButton(new LBitmap(new LBitmapData(imglist["button04"])),
        new LBitmap(new LBitmapData(imglist["button04_over"])));  
    btn04.x = (LGlobal.width - btn04.getWidth())*0.5;;
    btn04.y = 420;  
    recordLayer.addChild(btn04);
    
    btn03.addEventListener(LMouseEvent.MOUSE_DOWN, 
    function(event){
        recordLayer.removeAllChild();
        backLayer.removeChild(recordLayer);
        LTweenLite.to(backLayer,1,{alpha:1});
    });
    btn04.addEventListener(LMouseEvent.MOUSE_DOWN, 
    function(event){
        localStorage.removeItem("locRecordRunTimesArry")
        localStorage.removeItem("locRecordTimeArry");
    });
}
var recordFontArr = ["游戏记录","名次","行动次数","游戏用时"];
var recordText;
var recordFontX = 120;
var recordFontY = 30;

function printRecordFont(){
    for(var i=0;i<recordFontArr.length;i++){
        recordText = new LTextField();
        recordText.weight = "bold";
        recordText.text = recordFontArr[i];
        if(i==0){
            recordText.size = 25;
              recordText.color = "dimgray";
            recordText.font = "黑体";
            recordText.x = (LGlobal.width - recordText.getWidth())*0.5;
            recordText.y = 33;
        }else if(i>=1 && i<=4){
            recordText.size = 12;
              recordText.color = "gray";
            recordText.font = "宋体";
            recordText.x = 25 + (i-1)*recordFontX;
            recordText.y = 80;    
        }
        recordLayer.addChild(recordText);
    }
    for(var i=0;i<10;i++){
        recordText = new LTextField();
        recordText.weight = "bold";
        recordText.font = "宋体";
        recordText.color = "white";
        recordText.size = 12;
        recordText.x = 25;
        recordText.y = 140 + (i-1)*recordFontY;
        recordText.text = i + 1;
        recordLayer.addChild(recordText);
    }
    for(var i=0;i<10;i++){
        recordText = new LTextField();
        recordText.weight = "bold";
        recordText.font = "宋体";
        recordText.color = "white";
        recordText.size = 12;
        recordText.x = 25 + 1*recordFontX;
        recordText.y = 140 + (i-1)*recordFontY;;
        recordText.text = maxRunTimesArr[i+1] || '';
        recordLayer.addChild(recordText);
    }
    for(var i=0;i<10;i++){
        recordText = new LTextField();
        recordText.weight = "bold";
        recordText.font = "宋体";
        recordText.color = "white";
        recordText.size = 12;
        recordText.x = 25 + 2*recordFontX;
        recordText.y = 140 + (i-1)*recordFontY;;
        recordText.text = maxTimeArr[i+1] || '';
        recordLayer.addChild(recordText);
    }
}
function getRecord(){
    maxTimeArr = recordTimeArry.sort(function(a,b){return a-b;});
    maxRunTimesArr = recordRunTimesArry.sort(function(a,b){return a-b;});
}
原文地址:https://www.cnblogs.com/jiangxiaobo/p/6004474.html