网络编程
位置:首页>> 网络编程>> JavaScript>> JS小游戏之仙剑翻牌源码详解

JS小游戏之仙剑翻牌源码详解

作者:shichen2014  发布时间:2024-04-17 09:42:04 

标签:JS,游戏,源码

本文实例讲述了JS小游戏的仙剑翻牌源码,是一款非常优秀的游戏源码。分享给大家供大家参考。具体如下:

一、游戏介绍:

这是一个翻牌配对游戏,共十关。

1.游戏随机从42张牌中抽取9张进行游戏,每组为2张相同的牌,共18张牌。
2.连续翻到两张相同的为胜利,当9组全部翻到则过关。如不是翻到连续两张相同的,则需要重新翻。
3.游戏共有10关,在规定时间内通过为挑战成功。
4.如果某关在规定时间内没有通过,则会从当前关继续游戏。
5.游戏中的卡牌图片与音乐均为大宇公司所有。
6.需要支持html5的浏览器,chrome与firefox效果最好。

游戏图片:

JS小游戏之仙剑翻牌源码详解

JS小游戏之仙剑翻牌源码详解

完整实例代码点击此处本站下载。

二、Javascript部分:


/** 仙剑翻牌游戏
*  Date:  2013-02-24
*  Author: fdipzone
*  Ver   1.0
*/
window.onload = function(){
 var gameimg = [
         'images/start.png',
         'images/success.png',
         'images/fail.png',
         'images/clear.png',
         'images/cardbg.jpg',
         'images/sword.png'
        ];

for(var i=1; i<=card.get_total(); i++){
   gameimg.push('images/card' + i + '.jpg');
 }

var callback = function(){
   card.init();
 }

img_preload(gameimg, callback);
}

/** card class */
var card = (function(total,cardnum){

var gametime = [0,65,60,55,50,45,40,35,30,25,20]; // 每关的游戏时间
 var turntime = 8;                 // 观看牌时间
 var level = 1;                  // 当前关卡
 var carddata = [];                // 记录牌的数据
 var leveldata = [];                // 当前关卡牌数据
 var is_lock = 0;                 // 是否锁定
 var is_over = 0;                 // 游戏结束
 var first = -1;                  // 第一次翻开的卡
 var matchnum = 0;                 // 配对成功次数

// 初始化
 init = function(){
   tips('show');
   $('startgame').onclick = function(){
     tips('hide');
     start();
   }
 }

// 开始游戏
 start = function(){
   reset();
   create(cardnum);
   show();

var curtime = turntime;

setHtml('livetime', curtime);

var et = setInterval(function(){
     if(curtime==0){
       clearInterval(et);
       turnall();
       set_event();
       message('start', process);
       return ;
     }

if(curtime==turntime){
       turnall();
     }

curtime--;
     setHtml('livetime', curtime);
   }, 1000)
 }

// 随机抽取N张牌
 create = function(n){
   carddata = [];
   leveldata = [];

// 创建所有牌
   for(var i=1; i<=total; i++){
     carddata.push(i);
   }

// 抽取牌
   for(var i=0; i<n; i++){
     var curcard = carddata.splice(Math.random()*carddata.length, 1).pop();
     leveldata.push({'cardno':curcard,'turn':0}, {'cardno':curcard,'turn':0});
   }

// 生成随机顺序游戏牌
   leveldata = shuffle(leveldata);
 }

// 生成牌
 show = function(){
   var cardhtml = '';
   for(var i=0; i<leveldata.length; i++){
     cardhtml += '<div class="cardplane">';
     cardhtml += '<div class="card viewport-flip" id="card' + i + '">';
     cardhtml += '<div class="list flip out"><img src="images/card' + leveldata[i]['cardno'] + '.jpg"></div>';
     cardhtml += '<div class="list flip"><img src="images/cardbg.jpg"></div>';
     cardhtml += '</div>';
     cardhtml += '</div>';

}
   setHtml('gameplane', cardhtml);
 }

// 全部翻转
 turnall = function(){
   for(var i=0; i<leveldata.length; i++){
     turn_animate(i);
   }
 }

// 翻转动画
 turn_animate = function(key){
   var obj = $_tag('div', 'card' + key);
   var cardfont, cardback;

if(getClass(obj[0]).indexOf('out')!=-1){
     cardfont = obj[0];
     cardback = obj[1];
   }else{
     cardfont = obj[1];
     cardback = obj[0];
   }

setClass(cardback, 'list flip out');
   var et = setTimeout(function(){
     setClass(cardfont, 'list flip in');
   }, 225);
 }

// 设置点击事件
 set_event = function(){
   var o = $_tag('div', 'gameplane');
   for(var i=0,count=o.length; i<count; i++){
     if(getClass(o[i])=='card viewport-flip'){
       o[i].onclick = function(){
         turn(this.id);
       }
     }
   }
 }

// 计时开始
 process = function(){

is_lock = 0;

var curtime = gametime[level];
   setHtml('livetime', curtime);

var et = setInterval(function(){
     if(matchnum==cardnum){
       clearInterval(et);
       return ;
     }
     curtime--;
     setHtml('livetime', curtime);

if(curtime==0){
       clearInterval(et);
       is_over = 1;
       message('fail', start);
     }

}, 1000);
 }

// 游戏讯息动画
 message = function(type, callback){

is_lock = 1;

var message = $('message');
   var processed = 0;
   var opacity = 0;
   var soundtime = {
         'start': 1500,
         'success': 4000,
         'fail': 6000,
         'clear': 4000
   };

disp('message','show');
   setClass(message,'message_' + type);
   setOpacity(message, opacity);
   setPosition(message, 'left', 0);
   setPosition(message, 'top', 390);

if(type=='start'){
     bgsound(type, true);
   }else{
     bgsound(type);
   }

var et = setInterval(function(){
     var message_left = getPosition(message,'left');
     processed = processed + 25;

if(processed>=500 && processed<=750){
       opacity = opacity+10;
       setPosition(message, 'left', message_left + 30);
       setOpacity(message, opacity);
     }else if(processed>=soundtime[type] && processed<=soundtime[type]+250){
       opacity = opacity-10;
       setPosition(message, 'left', message_left + 35);
       setOpacity(message, opacity);
     }else if(processed>soundtime[type]+250){
       disp('message','hide');
       clearInterval(et);
       if(typeof(callback)!='undefined'){
         callback();
       }
     }
   },25);
 }

// 翻牌
 turn = function(id){
   if(is_lock==1){
     return ;
   }

var key = parseInt(id.replace('card',''));

if(leveldata[key]['turn']==0){ // 未翻开
     if(first==-1){ // 第一次翻
       turn_animate(key);
       first = key;
       leveldata[key]['turn'] = 1;
     }else{ // 第二次翻
       turn_animate(key);
       leveldata[key]['turn'] = 1;
       check_turn(key);
     }
   }
 }

// 检查是否翻牌成功
 check_turn = function(key){
   is_lock = 1;

if(leveldata[first]['cardno']==leveldata[key]['cardno']){ // 配对成功
     matchnum ++;

if(matchnum==cardnum){
       var et = setTimeout(function(){
         message('success', levelup);
       }, 225);
     }
     first = -1;
     is_lock = 0;

}else{ // 配对失败,将翻开的牌翻转

var et = setTimeout(function(){
         turn_animate(first);
         leveldata[first]['turn'] = 0;
         turn_animate(key);
         leveldata[key]['turn'] = 0;

first = -1;

if(is_over==0){
           is_lock = 0;
         }
       }, 300);
   }
 }

// 过关
 levelup = function(){
   if(level<gametime.length-1){
     level ++;
     setHtml('level', level);
     start();
   }else{
     clear();
   }
 }

// 全部通关
 clear = function(){
   level = 1;
   disp('levelplane','hide');
   disp('process', 'hide');
   setHtml('gameplane','');
   message('clear',init);
 }

// 音乐播放
 bgsound = function(file, loop){
   var id = 'audioplayer';

if(typeof(file)!='undefined'){
     if(typeof(loop)=='undefined'){
       loop = false;
     }

var audiofile = [];
     audiofile['mp3'] = 'music/' + file + '.mp3';
     audiofile['ogg'] = 'music/' + file + '.ogg';
     audioplayer(id, audiofile, loop);
   }else{
     audioplayer(id);
   }
 }

// 游戏玩法
 tips = function(type){
   disp('tips', type);
 }

// 获取牌总数
 get_total = function(){
   return total;
 }

// 重置参数
 reset = function(){
   disp('levelplane','show');
   setHtml('level', level);
   disp('process', 'show');
   setHtml('livetime', '');
   setHtml('gameplane', '');
   is_lock = 1;
   is_over = 0;
   first = -1;
   matchnum = 0;
 }

return this;

})(42,9);

相信本文所述对大家javascript游戏设计的学习有一定的借鉴价值。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com