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效果最好。
游戏图片:
完整实例代码点击此处本站下载。
二、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游戏设计的学习有一定的借鉴价值。


猜你喜欢
- what's the math 模块Python math 模块提供了许多对浮点数的数学运算函数。需要注意的是,这些函数一般是对平台
- 这篇文章主要介绍了调用其他python脚本文件里面的类和方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 使用ktl工具实现mysql向mysql同步数据1.新建作业步骤2.完善作业步骤,主要是完成作业中的转换工作3.首先要确定数据来源库,也就是
- 在Python2和Python3中都提供print()方法来打印信息,但两个版本间的print稍微有差异主要体现在以下几个方面:1.pyth
- 1.问题复现:有时候我们去点击.py文件 文件里明明有打印信息,却一闪而过,没有任何显示比如以下内容#!/usr/local/bin/pyt
- 更改mysql密码-- 查询用户权限show grants for 'root'@'%';update my
- Python安装Graphviz画图器首先,要明确他是一个独立的软件,如果大家用pip的方法装了graphviz可以先卸载pip unins
- 例子:以百度文库中选择文档的类型为例问题一:遍历点击所有文档类型的单选框# coding=utf-8from selenium import
- 本文利用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REP
- 一、安装mongo plugs插件File->SettingPlugins查询Mongo选择Search in repositorie
- 摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率。这些函数包括数组元素的选取和多
- 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法
- 今天要聊聊用 PyTorch 进行 C++ 扩展。在正式开始前,我们需要了解 PyTorch 如何自定义module。这其中,最常见的就是在
- PyQtGraph是纯Python的,只是它底层调用的是PyQt,也就是Qt的Python封装,底层用C/C++语言开发的库,它是在PyQt
- OCR与Tesseract介绍将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。
- RPC是Remote Procedure Call的缩写,翻译成中文就是远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的
- 一、Vue.js简介1、Vue的主要特点: (1) 简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好 (6) 组件化(1)
- 本文实例讲述了Zend Framework教程之资源(Resources)用法。分享给大家供大家参考,具体如下:Zend_Applicati
- 以下内容给大家c#连接数据库的方法的相关介绍,本文非常具有参考借鉴价值,具体详情如下所示。ASP.NET连接数据库的技术叫ADO.NET,它
- 我使用的是anaconda安装的环境,其中有一个是h5py,自动安装的是2.7.0的版本,这个版本会导致保存模型时python奔溃。cond