来看看实现的效果图

游戏规则:双击颜色一样的星星,双击相同的部分就消失了

实例代码

* {margin:0; padding:0;}

body {background:#000; width:100%; height:100%;}

#box {position:absolute; margin-top:50px;}

#star_box {position:relative; }

#star_box .star {width:40px; height:40px; position:absolute; cursor:pointer; }

#star_box .star img {border-radius:5px;}

#star_box .link img {border:2px solid #fff; border-radius:5px;}

$(function(){

app.run();

});

// 2015-1-30 16:26

// 基本都已经实现

// 积分系统还没开始

var app = {};

app.linkStars = [];

app.searchStars = [];

app.stars = [];

app.newStars = [];

app.colsNoneNum = 0;

app.star = {

width:30, // 星星的宽度

height:30, // 高度

margin:5, // 每个星星的边距

rowNum:10, // 行数

colsNum:10, // 列数

colorNum:5, // 星星颜色数量 最大值为5 因为我TMD就做了5张星星图片

};

app.timer = null;

app.run = function() {

this.box = $('#box');

this.starBox = this.box.find('#star_box');

this.initCanvas();

this.initStars();

this.draw();

this.initBox();

// this.write();

}

app.initCanvas = function() {

var height = $(window).height();

$('body').css('height', height+'px');

}

// 初始化box样式

app.initBox = function() {

var boxWidth = this.star.width*this.star.colsNum+this.star.margin*this.star.colsNum;

var boxHeight = this.star.height*this.star.rowNum+this.star.margin*this.star.rowNum;

var left = ($(window).width() - boxWidth) / 2;

this.box.css('left', left+'px');

this.box.css('width', boxWidth+'px');

this.box.css('height', boxHeight+'px');

}

// 初始化星星数组

app.initStars = function() {

for(var i = 0; i < this.star.rowNum; i++) {

this.stars[i] = [];

for(var k = 0; k < this.star.colsNum; k++) {

var color_index = Math.floor((Math.random()*this.star.colorNum));

this.stars[i][k] = color_index;

}

}

// this.stars = [[0,1,0,1,1],[0,0,0,1,0]]; // bug测试

this.newStars = left2Array(this.stars);

this.noLeftChangeStars = left2Array(this.stars);

}

app.initColsLink = function() {

// 当前查找状态,一个数组对象,每个对象代表一列

this.colsLink = [];

for(var i = 0; i < this.star.colsNum; i++) {

this.colsLink[i] = {x:[], num:0, max:Number(-1), count:this.initRowArray(1)};

}

}

app.click = function(x, y) {

x = parseInt(x);

y = parseInt(y);

var searchStars = [];

searchStars[0] = {x:x, y:y};

this.count = 0;

this.linkStars = [];

this.searchStars = [];

this.bigSearch(searchStars); // 搜索 连接的星星

this.clickAnimate();

}

app.mouseup = function() {

clearTimeout(app.timer);

app.timer = setTimeout(function() {

app.starBox.find('.star').removeClass('link');

}, 500);

}

// 触摸某个星星

// X坐标 和 Y坐标

app.touch = function(x, y) {

x = parseInt(x);

y = parseInt(y);

var searchStars = [];

searchStars[0] = {x:x, y:y};

this.count = 0;

this.linkStars = [];

this.searchStars = [];

this.bigSearch(searchStars); // 搜索 连接的星星

this.initColsLink();

this.colsNoneLenth = this.initColsArray(0);

this.leftData = {min:Number(this.star.colsNum), y:[], num:0, count:this.initColsArray(1)};

this.makeStars(); // 重新生成星星数组

this.animate();

// this.draw(); // 重新绘制星星

// this.write(); // debug

}

// 星星动画

app.animate = function() {

if(this.linkStars.length < 2) return;

for(var i in this.linkStars) {

var x = parseInt(this.linkStars[i].x);

var y = parseInt(this.linkStars[i].y);

app.delAnimate(x, y);

}

for(var i in this.colsLink) {

var x = parseInt(this.colsLink[i].max);

var y = parseInt(i);

if(this.colsLink[i].x.length > 1) {

var mOffset = 0;

for(var j = this.colsLink[i].x.length-1; j >= 0; j--) {

mOffset += this.colsLink[i].count[j];

var r = this.colsLink[i].x[j-1];

if(j - 1 < 0) r=-1;

for(var t_x = this.colsLink[i].x[j]-1; t_x > r; t_x--) {

this.downAnimate(t_x, y, mOffset);

}

}

}

else {

for(var t_x = x-1; t_x >= 0; t_x--) {

this.downAnimate(t_x, y, this.colsLink[y].num);

}

}

}

if(this.leftData.min > -1) {

if(this.leftData.y.length > 1) {

var mOffset = 0;

for(var j = 0; j <= this.leftData.y.length-1; j++) {

mOffset += this.leftData.count[j];

var r = this.leftData.y[j+1];

if(j + 1 > this.leftData.y.length-1) r=this.star.colsNum;

for(var n_x = 0; n_x <= this.star.rowNum-1; n_x++) {

for(var n_y = this.leftData.y[j]+1; n_y < r; n_y++) {

this.leftAnimate(n_x, n_y, mOffset);

}

}

}

}

else {

var y = parseInt(this.leftData.min);

for(var n_x = 0; n_x <= this.star.rowNum-1; n_x++) {

for(var n_y = y+1; n_y < this.star.colsNum; n_y++) {

this.leftAnimate(n_x, n_y, this.leftData.num);

}

}

}

}

// this.leftAnimate();

}

/* 消除星星的动画效果 */

app.delAnimate = function(x,y) {

var index = x*this.star.colsNum + y; // 根据x、y计算对应dom中星星的 id

var starDiv = this.starBox.find('.id_'+index);

var left = parseInt(starDiv.css('left')) + this.star.width/2

var top = parseInt(starDiv.css('top')) + this.star.height/2

starDiv.find('img').animate({width:'0',height:'0'}, 500);

starDiv.animate({ left:left+'px', top:top+'px', opacity:0}, 500, function(){$(this).hide();});

starDiv.removeClass('id_'+index);

}

/* 星星向下移动的动画效果 */

app.downAnimate = function(x, y, move_num) {

if(this.checkRepeat(x, y)) {

return ;

}

var index = x*this.star.colsNum + y;

var starDiv = this.starBox.find('.id_'+index);

var dTop = parseInt(starDiv.css('top'));

var top = dTop + (this.star.height + this.star.margin) * move_num;

starDiv.animate({top:top+'px'}, 300);

var n_x_ = x + move_num;

starDiv.attr('ondblclick', 'app.touch('+n_x_+','+y+')');

starDiv.attr('onmousedown', 'app.click('+n_x_+','+y+')');

starDiv.removeClass('id_'+index);

var id = parseInt(n_x_*this.star.colsNum) + parseInt(y);

starDiv.addClass('id_'+id);

}

/* 星星向左移动的动画效果 */

app.leftAnimate = function(x, y, move_num) {

var index = x*this.star.colsNum + y;

var starDiv = this.starBox.find('.id_'+index);

var dLeft = parseInt(starDiv.css('left'));

var left = dLeft - (this.star.width + this.star.margin) * move_num;

starDiv.animate({left:left+'px'}, 300);

var n_y_ = y - move_num;

starDiv.attr('ondblclick', 'app.touch('+x+','+n_y_+')');

starDiv.attr('onmousedown', 'app.click('+x+','+n_y_+')');

starDiv.removeClass('id_'+index);

var id = parseInt(x*this.star.colsNum) + parseInt(n_y_);

starDiv.addClass('id_'+id);

}

// 点击提示连接星星动画

app.clickAnimate = function() {

if(this.linkStars.length < 2) return;

this.starBox.find('.star').removeClass('link');

for(var i in this.linkStars) {

var x = parseInt(this.linkStars[i].x);

var y = parseInt(this.linkStars[i].y);

var index = x*this.star.colsNum + y;

var starDiv = this.starBox.find('.id_'+index);

starDiv.addClass('link');

}

}

/* 递归遍历查找 */

app.bigSearch = function(searchStars) {

if(searchStars.length == 0) return ;

this.newSearchStars = [];

this.s_count = 0;

for(var i in searchStars) {

var star = searchStars[i];

var x = parseInt(star.x);

var y = parseInt(star.y);

if(!this.checkRepeat(x, y)) {

this.linkStars[this.count] = {x:x, y:y};

}

this.count++;

this.search(x, y, 'top');

this.search(x, y, 'right');

this.search(x, y, 'down');

this.search(x, y, 'left');

}

this.bigSearch(this.newSearchStars);

}

/* 上下左右 查找 */

app.search = function(x, y, position) {

if(position == 'top') {

var top = x-1;

if(top < 0) return;

if(this.stars[x][y] == this.stars[top][y] && !this.checkRepeat(top, y)) {

this.newSearchStars[this.s_count] = {x:top, y:y};

}

}

else if(position == 'right') {

var right = y+1;

if(right > this.star.colsNum-1) return;

if(this.stars[x][y] == this.stars[x][right] && !this.checkRepeat(x, right)) {

this.newSearchStars[this.s_count] = {x:x, y:right};

}

}

else if(position == 'down') {

var down = x+1;

if(down > this.star.rowNum-1) return;

if(this.stars[x][y] == this.stars[down][y] && !this.checkRepeat(down, y)) {

this.newSearchStars[this.s_count] = {x:down, y:y};

}

}

else if(position == 'left') {

var left = y-1;

if(left < 0) return;

if(this.stars[x][y] == this.stars[x][left] && !this.checkRepeat(x, left)) {

this.newSearchStars[this.s_count] = {x:x, y:left};

}

}

this.s_count++;

}

// 根据传递的x, y来检测是否存在在linkStars中 如果存在则返回 true

app.checkRepeat = function(x, y) {

if(this.linkStars.length == 0) return false;

for(var i in this.linkStars) {

var star = this.linkStars[i];

if(parseInt(star.x) == parseInt(x) && parseInt(star.y) == parseInt(y)) return true;

}

return false;

}

// 从新构造“星星”数组

// stars、newStars必须初始化完成

// linkStars必须>=2个星星

app.makeStars = function() {

if(this.stars.length==0 || this.newStars.length==0 || this.linkStars.length==0 || this.linkStars.length<2) return false;

// -== setp-1 ==-

/*

在相连数组中查找当前星星是否是相连的

如果是相连的星星 则在newStars中把该星星以上的星星的值都赋值给x+1的星星

然后在newStars中把最上面的一个元素 即[0][y]的元素值设为-1;

*/

var clx_count = this.initColsArray(0);

for(var x in this.stars) {

x = parseInt(x);

for(var y in this.stars[x]) {

y = parseInt(y);

if(this.stars[x][y] != -1 && this.checkRepeat(x,y)) {

for(var n_x = x-1; n_x >= 0; n_x--) {

this.newStars[n_x+1][y] = this.newStars[n_x][y];

}

this.newStars[0][y] = -1;

this.colsLink[y].num += 1;

if(this.colsLink[y].max < x) {

this.colsLink[y].max = x;

if((x+1 <= this.stars.length-1 && !this.checkRepeat(x+1,y)) || (x == this.stars.length-1 && this.checkRepeat(x,y))) {

this.colsLink[y].x[clx_count[y]] = x;

clx_count[y]++;

}

else if(x+1 <= this.stars.length-1 && this.checkRepeat(x+1,y)) {

this.colsLink[y].count[clx_count[y]] += 1;

}

}

this.colsNoneLenth[y] += 1;

}

}

}

// -== setp-2 ==-

// 主要是为生成左移动画统计数据

this.noLeftChangeStars = left2Array(this.newStars);

var ld_count = 0;

for(var y = 0; y <= this.star.colsNum-1; y++) {

y = parseInt(y);

// if(this.star.colsNum - (y+1) < this.colsNoneNum) continue;

// 判断当前列是否全部被设置为-1

if(this.checkColsNone(y)) {

if(this.leftData.min > y) {

this.leftData.min = y;

}

if((y+1 <= this.star.colsNum-1 && !this.checkColsNone(y+1)) || (y == this.star.colsNum-1)) {

this.leftData.y[ld_count] = y;

ld_count++;

}

else if(y+1 <= this.star.colsNum-1 && this.checkColsNone(y+1)) {

this.leftData.count[ld_count] += 1;

}

this.leftData.num += 1;

// this.colsNoneNum += 1;

}

}

// -== setp-3 ==-

// 左移数据 并从新构造新数组

if(this.leftData.min > -1) {

var check = this.leftData.min;

for(var y = 0; y < this.star.colsNum; y++) {

if(this.checkNewColsNone(check)) {

for(var n_x = 0; n_x <= this.star.rowNum-1; n_x++) {

for(var n_y = check+1; n_y < this.star.colsNum; n_y++) {

this.newStars[n_x][n_y-1] = this.newStars[n_x][n_y];

}

this.newStars[n_x][this.star.colsNum-1] = -1;

}

}

else {

check += 1;

}

}

}

// 把新构造的数组 再赋值给星星数组

this.stars = left2Array(this.newStars);

}

// 检测当前列是否全部消空 如果消空返回true

// 数组未被左移破坏,只被下移修改过

app.checkColsNone = function(y) {

var count = 0;

for(var x = 0; x < this.star.rowNum; x++) {

if(this.noLeftChangeStars[x][y] == Number(-1)) count++;

}

if(count == this.star.rowNum) return true;

return false;

}

// 检测当前列是否全部消空 如果消空返回true

// 数组为每次下移和左移之后新生成的数组

app.checkNewColsNone = function(y) {

var count = 0;

for(var x = 0; x < this.star.rowNum; x++) {

if(this.newStars[x][y] == Number(-1)) count++;

}

if(count == this.star.rowNum) return true;

return false;

}

app.draw = function() {

var starsDiv = '';

for(var x in this.stars) {

x = parseInt(x);

for(var y in this.stars[x]) {

y = parseInt(y);

var star = this.stars[x][y];

if(star == -1) {

continue;

}

var left = y*this.star.width+y*5;

var top = x*this.star.height+x*5;

var index = x*this.star.colsNum + y;

starsDiv += '

';

}

}

$('#star_box').html(starsDiv);

}

app.initColsArray = function(val) {

var array = [];

if(val == 'undefined') val = 0;

for(var i = 0; i < this.star.colsNum; i++) {

array[i] = val;

}

return array;

}

app.initRowArray = function(val) {

var array = [];

if(val == 'undefined') val = 0;

for(var i = 0; i < this.star.rowNum; i++) {

array[i] = val;

}

return array;

}

app.write = function() {

var html = '';

for(var i in this.stars) {

var line = this.stars[i];

for(var j in line) {

var star = line[j];

var color = 'red';

if(star == -1) {

color = 'blue';

}

html += ''+star+'('+i+','+j+') ';

}

html += '
';

}

html += '

--===================================================--

';

$('#show').append(html);

}

function left2Array(array) {

if(array.length < 0) return array;

var newArray = [];

for(var i in array) {

newArray[i] = [];

for(var j in array[i]) {

newArray[i][j] = array[i][j];

}

}

return newArray;

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。谢谢大家对脚本之家的支持。

消灭星星类游戏java语言_javascript实现消灭星星小游戏简单版相关推荐

  1. 猜数字游戏java编程_Java编写猜数字小游戏

    本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 以下是Java语言写的一个猜数字小游戏引用片段: import java.text.SimpleDateFormat; impo ...

  2. 井字棋游戏 c语言实现,井字棋小游戏(C语言)

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 void drawBoard(char *board) //绘制棋盘 8 {9 p ...

  3. 圈叉棋游戏c语言编写,圈叉棋小游戏的简单实现代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include int game[3][3]={0}; void Show(int turn,int x,int y) { int i=0,j=0; i ...

  4. 用JAVA写一款自己的小游戏

    用JAVA写一款自己的小游戏 我目前也处于一个学习的阶段,所以代码会有很多的错误,但是经过我几天的瞎调试目前还是可以玩的,但是可玩性还是很差 说一说怎么玩这个游戏把 设计初衷:KoalaChess,顾 ...

  5. Java实现的经典坦克大战小游戏

    Java实现的经典坦克大战小游戏 先看一下游戏结构: 有点多,没有耐心的可以不用看,这里先给出链接吧! 云链接:经典坦克大战 提取码:s9ai 这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自 ...

  6. java面向对象思想编写原谅帽小游戏 原谅帽游戏思路解析

    java面向对象思想编写原谅帽小游戏 原谅帽游戏思路解析: 面向对象思想 作品展示 类(游戏端)继承Frame: 首先要创建一个方法去让游戏开始和结束 使用text执行这个游戏的方法(需要有游戏标题和 ...

  7. c语言算24点答案,C语言-纸牌计算24点小游戏

    C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...

  8. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc

    C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...

  9. c语言自动按键脚本,C语言键盘控制走迷宫小游戏

    本文实例为大家分享了C语言键盘控制走迷宫小游戏的具体代码,供大家参考,具体内容如下 在看了<啊哈C语言>之后想写一个游戏demo 游戏的截图 首先是启动界面 然后是初始化 接下来是键盘操控 ...

最新文章

  1. Spark的transformation和action算子简介
  2. 6.11 将分割数据转换为多值IN列表
  3. 在linux系统 挂载光盘:mount时提示: you must specify the filesystem type
  4. 【资源】学 AI 该学哪些斯坦福 CS 课程,这个清单安排得明明白白
  5. 处理JS异常的一个想法
  6. js 格式化 java时间格式化_用JavaScript(js)对时间格式化
  7. 用C#获取当前的路径
  8. android 100以内的随机数
  9. 复制pdf里的文字,去掉多余换行符的最简单方法(不用word不用python)
  10. Win10下ImageAI-gpu训练自己的数据集
  11. 关于H5的标签整理合集(一)
  12. iOS 日本日历、佛教日历取date的问题及公历转换,时间戳获取不准确
  13. 【Android工具】音频频率发生器,声音测试,音响测试,各种频率声音合成工具...
  14. 织梦后台编写网站的操作步骤
  15. 选题阶段:课堂展示脚本
  16. 桌面html文件图标异常,.htm .html文件图标显示异常的解决办法
  17. WIN10环境下配置hadoop+spark并运行实例的教程
  18. ubuntu apt update时W: GPG error http://ppa.launchpad.net lucid Release没有公钥无法验证NO_PUBKEY签名问题解决
  19. 全媒社:媒体报道宣传和渠道选择有密切关联
  20. BZOJ 2820 YY的GCD(莫比乌斯反演)

热门文章

  1. 【打表】Round Numbers rndnum.pas/c/cpp
  2. Mybatis+Oracle插入万条数据
  3. Ajax请求不带上cookie的原因
  4. spring mvc通过aop在控制台打印log日志,包含请求controller、method、url、remoteaddr、返回值,方便调试
  5. 一名合格的电子工程师英文水平应该达到什么标准?
  6. 用Python画路飞骷髅图案【附代码】
  7. 骁龙888 plus和天玑8100 哪个好
  8. HTML 5种空格表示 对齐文本框
  9. 一个菜鸟浅谈对 软件、程序、软件模型的认识 ——!
  10. 有些事情不是谁牛b谁做,而是谁做了谁牛b。