js&html5实现消星星游戏
前段时间看见园子里有同学用js+jquery实现了消星星游戏,自己也早有这个想法,于是就利用业余时间用js+html5实现了一下消星星游戏。
主要是想实现效果,运用了css3中的动画属性。游戏积分算法是随便写的,所以玩起来难度不高。
由于时间仓促,代码上还有一些冗余,还可以进一步优化。等以后有时间吧。
上代码:
<!doctype html>
<html>
<head>
<title></title>
<style>
#box{height:600px;width:600px;margin:20px auto;border:2px solid #123;position:relative;}
#box div{position:absolute;height:58px;width:58px;border:1px solid #fff;border-radius:4px;transition:all linear 0.25s 0s;-moz-transition:all linear 0.25s 0s;}
[r="1"]{top:540px;}
[r="2"]{top:480px;}
[r="3"]{top:420px;}
[r="4"]{top:360px;}
[r="5"]{top:300px;}
[r="6"]{top:240px;}
[r="7"]{top:180px;}
[r="8"]{top:120px;}
[r="9"]{top:60px;}
[r="10"]{top:0px;}
[c="1"]{left:0px}
[c="2"]{left:60px}
[c="3"]{left:120px}
[c="4"]{left:180px}
[c="5"]{left:240px}
[c="6"]{left:300px}
[c="7"]{left:360px}
[c="8"]{left:420px}
[c="9"]{left:480px}
[c="10"]{left:540px}
#box div[s="s"]{border-color:red;}
.red {
background-color: rgba(255, 0, 0, 0.5);
}
.green {
background-color: rgba(0, 255, 0, 0.5);
}
.blue {
background-color: rgba(0, 0, 255, 0.5);
}
.yellow {
background-color: rgba(255, 255, 0, 0.5);
}
.lightblue {
background-color: rgba(0, 255, 255, 0.5);
}
</style>
</head>
<body> <div id="title"> </div>
<div id="msg"> </div>
<div id="box">
</div> <script> Array.prototype.has_item = function(item){
for(var i=0,l=this.length;i<l;i++){
//if(d == true) console.log(item,this[i],item == this[i]);
if(item == this[i]){
return true;
}
}
return false;
} !function(){
var stage = 0,
stage_target = 0,
score = 0,
selected_color = null,
selected_stars = [],
colors = ['red','green','blue','yellow','lightblue'],
box = $('box');
if(box === null) return false;
init(); function $(id){
return document.getElementById(id) ? document.getElementById(id) : null;
} // 页面初始化函数
function init(){
stage++;
if(stage == 1){
stage_target = 1000;
}else{
stage_target = stage_target + 2000;
}
$('title').innerHTML = "stage:"+stage+";target:"+stage_target;
var frag = document.createDocumentFragment();
for(var r=1;r<=10;r++){
for(var c=1;c<=10;c++){
var color = colors[Math.floor(Math.random() * 5)];
var div = document.createElement('div');
div.id = r+'_'+c;
div.setAttribute('r',r);
div.setAttribute('c',c);
div.className = color;
div.onclick = click_star;
frag.appendChild(div);
}
}
box.appendChild(frag);
} // 单机星星事件函数
function click_star(){
if(selected_stars.length == 0 || !selected_stars.has_item(this)){ clear_selected();
select_stars(this);
}else if(selected_stars.length > 1){
pop_selected();
clear_selected();
after_pop();
check_single();
}
} // 首次单击时选中相同颜色相邻星星
function select_stars(current_star){
if(current_star.getAttribute('s') == 's') return;
current_star.setAttribute('s','s');
selected_color = current_star.className;
selected_stars.push(current_star); var r = parseInt(current_star.getAttribute('r')),
c = parseInt(current_star.getAttribute('c')),
t_star = {},
r_star = {},
b_star = {},
l_star = {};
var all_stars = $('box').getElementsByTagName('div');
for(var i=0,l=all_stars.length;i<l;i++){
if(all_stars[i].getAttribute('r') == r+1 && all_stars[i].getAttribute('c') == c){
t_star = all_stars[i];
}else if(all_stars[i].getAttribute('r') == r && all_stars[i].getAttribute('c') == c+1){
r_star = all_stars[i];
}else if(all_stars[i].getAttribute('r') == r-1 && all_stars[i].getAttribute('c') == c){
b_star = all_stars[i];
}else if(all_stars[i].getAttribute('r') == r && all_stars[i].getAttribute('c') == c-1){
l_star = all_stars[i];
}
}
if(t_star.className == selected_color){
select_stars(t_star);
}
if(r_star.className == selected_color){
select_stars(r_star);
}
if(b_star.className == selected_color){
select_stars(b_star);
}
if(l_star.className == selected_color){
select_stars(l_star);
}
} // 取消已选中星星状态
function clear_selected(){
selected_stars = [];
var all_stars = $('box').getElementsByTagName('div');
for(var i=0,l=all_stars.length;i<l;i++){
all_stars[i].setAttribute('s','');
}
} // 消掉已选中星星
function pop_selected(){
for(var i=0,l=selected_stars.length;i<l;i++){
selected_stars[i].parentNode.removeChild(selected_stars[i]);
}
score += 5 * l * l;
$('msg').innerHTML = 'score:'+score;
} // 一次消星星动作完成以后的回调函数,用来填补已消掉星星空出来的空白
function after_pop(){
var all_stars = $('box').getElementsByTagName('div');
var not_exist_c = [1,2,3,4,5,6,7,8,9,10];
for(var i=0,l=all_stars.length;i<l;i++){
var r = all_stars[i].getAttribute('r');
var c = parseInt(all_stars[i].getAttribute('c'));
//console.log('======='+c+'=======');
if(not_exist_c.has_item(c)){
not_exist_c.splice(c-1,1,null);
}
if(r > 1){
after_pop_d(all_stars[i],r-1,c);
}
}
//console.log(not_exist_c);
for(var i=9;i>=0;i--){
if(not_exist_c[i] == null){
not_exist_c.splice(i,1);
}
}
after_pop_l(not_exist_c.reverse());
} // 消星星以后被消星星上面的星星向下移动,填补空白
function after_pop_d(star,r,c){
if(document.getElementById(r+'_'+c)){
return;
}else{
star.setAttribute('r',r);
star.id=r+'_'+c;
if(r > 1){
after_pop_d(star,r-1,c)
}
}
} // 消星星以后被如果出现空列,空列右侧的列向左移动,填补空白列
function after_pop_l(not_exist_c){
for(var i=0,l=not_exist_c.length;i<l;i++){
var all_stars = $('box').getElementsByTagName('div');
for(var j=0,n=all_stars.length;j<n;j++){
var c = all_stars[j].getAttribute('c');
var r = all_stars[j].getAttribute('r');
if(c > not_exist_c[i]){
c--;
all_stars[j].setAttribute('c',c);
all_stars[j].id = r+'_'+c;
}
}
}
} //
function check_single(){
if(selected_stars.length>1) return;
var all_stars = $('box').getElementsByTagName('div');
for(var i=0,l=all_stars.length;i<l;i++){
clear_selected();
select_stars(all_stars[i]);
//console.log(selected_stars);
if(selected_stars.length>1){
clear_selected();
return true;
}
}
setTimeout(
function(){
clear_star();
if(stage_target>score){
box.innerHTML = "game over!";
return false;
}
init();
},
2000
);
} //
function clear_star(){
box.innerHTML = '';
}
}(window); </script>
</body>
</html>
js&html5实现消星星游戏的更多相关文章
- 用HTML5+原生js实现的推箱子游戏
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- WebGL实现HTML5贪吃蛇3D游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- video.js html5 视频播放器
我个人感觉很不错 https://github.com/videojs/video.js <head> <title>Video.js | HTML5 Video Player ...
- Chart.js | HTML5 Charts for your website.
Chart.js | HTML5 Charts for your website. Chart.js
- cocos2d-x 消类游戏,类似Diamond dash 设计
前几天刚刚在学习cocos2d-x,无聊之下自己做了一个类似Diamond dash的消类游戏,今天放到网上来和大家分享一下.我相信Diamond dash这个游戏大家都玩过,游戏的规则是这样的,有一 ...
- <!--[if IE]><script type="text/javascript" src="matrix/js/html5.js"></script><![endif]-->代码解释
块注释例子 1. <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->2. <!--[if IE]> 所有的I ...
- 原生JS实现的h5小游戏-植物大战僵尸
代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...
- js实现表格配对小游戏
js实现表格配对小游戏 一.总结 一句话总结: 二.js实现表格配对 1.配对游戏案例说明 实例描述: 当用户点击两个相同的图案或字符后配对成功,全部配对成功后游戏获胜 案例008采用了大家常见的小游 ...
随机推荐
- iOS项目开发中的目录结构
目录结构: 1.AppDelegate 这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来. 2.Models 这个目录下放一些与数据相关的Mod ...
- [译]rabbitmq 2.5 Where’s my message? Durability and you
我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. There’s a dirty secret about creating queues and exchanges in ...
- APP_Store - 怎样为iOS8应用制作预览视频
关于iOS 8应用预览视频的话题,从设计.技术规范,到录屏.编辑工具,介绍的都比较详尽:建议收藏,在接下来用的到的时候作以参考.下面进入译文. 最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更 ...
- 数据持久化-Plist文件写入
数据持久化,常见4种:归档,plist文件,sqlite,coreData.今天复习的是plist文件读写. // // ViewController.m // Test_Plist // // Cr ...
- [转]强悍的跨平台开源多媒体中心XBMC介绍
[转]强悍的跨平台开源多媒体中心XBMC介绍 http://www.cnblogs.com/mythou/p/3220898.html 最近都在了解Android下的音视频,因为最近需要做一个多媒体中 ...
- 27.some company's Spi Flash chip replace altera epcsxxx
由于altera公司的epcsxxx芯片比较贵,所以一般用其它公司的spi flash芯片代替也可以.据AlteraFAE描述:“EPCS器件也是选用某家公司的SPIFlash,只是中间经过Alter ...
- gvim 常用配置
set nocompatible set nu! filetype on syntax on set autoindent set ai! "set bg=dark set autoinde ...
- iTween基础之Shake(摆动)
一.基础介绍:二.基础属性 原文地址 :http://blog.csdn.net/dingkun520wy/article/details/50836780 一.基础介绍 ShakePosition: ...
- ED/EP简介
ED:electronic Deposit,电子存折 EP:electronic Purse,电子钱包 PIN:personal identification number,个人识别码 MAC:Mes ...
- <<梦断代码>>读书笔记
从任何角度,Chandler项目开始时都是值得羡慕的.虽然是讲一个软件项目是如何失败的,不过里面有让我觉得很有意思. 失败了就进行反思:定位不能逆时代的潮流, 互联网的趋势不可逆转,人员沟通与合作是永 ...