js html5 css俄罗斯方块游戏再现


Posted in Javascript onOctober 17, 2016

这个游戏主要分为三部份,HTML5+CSS+JAVASCRIPT来完成的。在这里详细讲一下js的代码。因为这个游戏的主要部分其实就是js。

大多数都是靠js来完成的。

js html5 css俄罗斯方块游戏再现

完成后的效果如下:

HTML代码:

<body> 
 <div class="wrap"> 
 <div class="play_wrap"> 
 <div id="play_area"></div> 
 <div class="play_menu"> 
 <p>下一个:</p> 
 <div id="play_nextType"></div> 
 <a id="play_btn_start" class="play_btn" href="javascript:void(0);" 
 unselectable="on">开始</a><a id="play_btn_level" class="play_btn" href="javascript:void(0)" unselectable="on"><span class="level_text">中等</span class="level_icon"></span></a> 
 <div class="level_menu" id="play_menu_level"> 
 <ul> 
 <li><a href="javascript:void(0)" level=0>简单</a></li> 
 <li><a href="javascript:void(0)" level=1>中等</a></li> 
 <li><a href="javascript:void(0)" level=2>困难</a></li> 
 </ul> 
 </div> 
 <p> 
 分数:<span id="play_score">0</span> 
 </p> 
 <p> 
 方向:<span id="play_direction">bottom</span> 
 </p> 
 <p> 
 说明:<br> -“下”、“左”、“右”键控制方向,“上”为变形;<br> -游戏开始前、暂停时可调整难度;<br> 
 -难度分“简单”、“中等”、“困难”三级;<br> -对应的分值为10、20、40;<br> 
 -多行同时消去的倍数为1、4、10、20; 
 </p> 
 </div> 
 </div> 
 </div> 
 </body>

CSS代码:

<style> 
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,button,textarea,p,blockquote,th,td 
{ 
 padding: 0; 
 margin: 0; 
} 
 
body { 
 font-family: "Helvetica Neue", "Hiragino Sans GB", "Segoe UI", 
 "Microsoft Yahei", "微软雅黑", Tahoma, Arial, STHeiti, sans-serif; 
 font-size: 12px; 
 background: #fff; 
 color: #333; 
} 
 
a{ 
 outline:none; 
 -moz-outline:none; 
 text-decoration: none; 
} 
 
.wrap{ 
 width:1000px; 
 margin:80px auto; 
} 
 
.play_wrap{ 
 padding-left:260px; 
} 
 
#play_area{ 
 float:left; 
 width:300px; 
 height:480px; 
 margin:auto; 
 background-color:#fefefe; 
 border-radius:2px; 
 color:black; 
 box-shadow:0px 0px 8px #e5e5e5; 
 padding:1px 0 0 1px; 
} 
 
#play_area .play_cell{ 
 float:left; 
 width:19px; 
 height:19px; 
 border:1px solid #eee; 
 margin:-1px 0 0 -1px; 
} 
 
#play_area .play_cell.active{ 
 background:#999; 
 border:1px solid #ccc; 
} 
 
#play_area .play_cell.goal{ 
 background:#0c0; 
} 
 
.play_menu{ 
 float:left; 
 margin-left:60px; 
 font-size:14px; 
 padding-top:20px; 
} 
 
.play_menu #play_nextType{ 
 width:60px; 
 height:60px; 
 padding:1px 0 0 1px; 
 margin:10px 0 20px 0; 
} 
 
.play_menu .play_mini_cell{ 
 float:left; 
 width:14px; 
 height:14px; 
 border:1px solid #fff; 
 margin:-1px 0 0 -1px; 
} 
 
.play_menu .play_mini_cell.active{ 
 background:#999; 
 border:1px solid #ccc; 
} 
 
.play_menu p { 
 line-height:200%; 
 clear:both; 
} 
 
.play_menu a.play_btn{ 
 display:block; 
 margin-bottom:20px; 
 width:80px; 
 height:28px; 
 line-height:28px; 
 text-align:center; 
 text-decoration: none; 
 color:#333; 
 background:#fefefe; 
 border:1px solid #eee; 
 border-radius: 2px; 
 box-shadow: 1px 1px 2px #eee; 
 border-color:#ddd #d2d2d2 #d2d2d2 #ddd; 
 outline: none; 
 -moz-outline:none; 
} 
 
.play_menu a.play_btn:hover{ 
 background-color:#fcfcfc; 
 border-color:#ccc; 
 box-shadow: inset 0 -2px 6px #eee; 
} 
 
.play_menu a#play_btn_level{ 
 position:relative; 
 margin-bottom:30px; 
} 
 
.level_text{ 
 margin-left:-10px; 
} 
 
.level_icon{ 
 display: block; 
 position:absolute; 
 top:12px; 
 right:16px; 
 width:0; 
 height:0; 
 overflow: hidden; 
 border:5px solid #FFF; 
 border-color: #999 transparent transparent transparent; 
} 
 
.level_menu{ 
 position:absolute; 
 margin:-30px 0 0 1px; 
 display:none; 
} 
.level_menu ul{ 
 list-style:none; 
} 
.level_menu li{ 
 float:left; 
} 
.level_menu li a{ 
 display:block; 
 padding:3px 10px; 
 border:1px solid #e8e8e8; 
 margin-left:-1px; 
 color:#09c; 
} 
.level_menu li a:hover{ 
 background:#09c; 
 color:#fefefe; 
} 
</style>

HTML的代码其实就是一个游戏结构的框架,这里框架其实就是几个div的东西,所以不会太长,理解起来也是挺容易的。而CSS则是控制网页的布局与美观,所以要想吸引玩家,那CSS方面必须下功夫,而这里的CSS只是其实就将游戏区域与菜单区域分为左右两边了。而游戏域内的一个个框其实就是多个div,整齐排列在一起而已。

下面到了js了:

因为在代码已经将一些重要的部分做了注释,所以就不打算逐步分去分析了。说一下整体的写法吧。其实它首先是直接定义了一些图形的坐标,然后根据这些坐标画出一个下一个的图形出来,之后就是利用一个setInterval函数在游戏区域标出每个点,如果不能下落了就直接清除掉时间函数,之后在调用一个创建时间函数的函数出来,在画一个图形出来。具体的细节就看代码吧。

<script type="text/javascript" src="jquery-1.6.2.min.js"></script> 
 <script type="text/javascript"> 
 var Tetris = function(options){ 
 //方块区域 
 this.e_playArea = $("#play_area"); 
 //开始按钮 
 this.e_startBtn = $("#play_btn_start"); 
 //分数 
 this.e_playScore = $("#play_score"); 
 //方向 
 this.e_playDirection = $("#play_direction"); 
 //等级按钮 
 this.e_levelBtn = $("#play_btn_level"); 
 //等级菜单 
 this.e_levelMenu = $("#play_menu_level"); 
 //下一个方块的类型 
 this.e_nextType = $("#play_nextType"); 
 //总的列数 
 this.cellCol = 15; 
 //总的行数 
 this.cellRow = 24; 
 //每个小方块的属性数组 
 this.cellArr = []; 
 //保存右上方下一个那里的小图形数组 
 this.miniCellArr = []; 
 //分数 
 this.score = 0; 
 //方向 
 this.direction = "bottom"; 
 //定时器的ID 
 this.timer = null; 
 //定时器的时间数组 
 this.interval = [600,300,100]; 
 //等级的分数数组 
 this.levelScore = [10,20,40]; 
 //消除的行数多少而给的倍数 
 this.doubleScore = [1,4,10,20]; 
 //默认等级1 
 this.level = 1; 
 //游戏是否进行 
 this.playing = false; 
 //游戏暂停标记 
 this.turning = false; 
 //游戏结束标记 
 this.death = false; 
 //一开始方块列出现的位置 
 this.offsetCol = Math.floor(this.cellCol/2); 
 //一开始方块行出现的位置 
 this.offsetRow = -3; 
 
 this.tetrisArr = []; 
 /* 
 0,1,15,16 
 0,1,15,16 
 */ 
 this.tetrisArr[0] = [ 
 [0,1,this.cellCol,this.cellCol+1], 
 [0,1,this.cellCol,this.cellCol+1] 
 ]; 
 /* 
 1,14,15,16 
 0,15,30,31 
 14,15,16,29 
 -1,0,15,30 
 */ 
 this.tetrisArr[1] = [ 
 [1,this.cellCol-1,this.cellCol,this.cellCol+1], 
 [0,this.cellCol,this.cellCol*2,this.cellCol*2+1], 
 [this.cellCol-1,this.cellCol,this.cellCol+1,this.cellCol*2-1], 
 [-1,0,this.cellCol,this.cellCol*2] 
 ]; 
 /* 
 -1,14,15,16 
 0,1,15,30 
 14,15,16,31 
 0,15,29,30 
 */ 
 this.tetrisArr[2] = [ 
 [-1,this.cellCol-1,this.cellCol,this.cellCol+1], 
 [0,1,this.cellCol,this.cellCol*2], 
 [this.cellCol-1,this.cellCol,this.cellCol+1,this.cellCol*2+1], 
 [0,this.cellCol,this.cellCol*2-1,this.cellCol*2] 
 ]; 
 /* 
 0,15,16,31 
 15,16,29,30 
 */ 
 this.tetrisArr[3] = [ 
 [0,this.cellCol,this.cellCol+1,this.cellCol*2+1], 
 [this.cellCol,this.cellCol+1,this.cellCol*2-1,this.cellCol*2] 
 ]; 
 /* 
 0,14,15,29 
 14,15,30,31 
 */ 
 this.tetrisArr[4] = [ 
 [0,this.cellCol-1,this.cellCol,this.cellCol*2-1], 
 [this.cellCol-1,this.cellCol,this.cellCol*2,this.cellCol*2+1] 
 ]; 
 /* 
 0,14,15,16 
 0,15,16,30 
 14,15,16,30 
 0,14,15,30 
 */ 
 this.tetrisArr[5] = [ 
 [0,this.cellCol-1,this.cellCol,this.cellCol+1], 
 [0,this.cellCol,this.cellCol+1,this.cellCol*2], 
 [this.cellCol-1,this.cellCol,this.cellCol+1,this.cellCol*2], 
 [0,this.cellCol-1,this.cellCol,this.cellCol*2] 
 ]; 
 /* 
 0,15,30,45 
 14,15,16,17 
 */ 
 this.tetrisArr[6] = [ 
 [0,this.cellCol,this.cellCol*2,this.cellCol*3], 
 [this.cellCol-1,this.cellCol,this.cellCol+1,this.cellCol+2] 
 ]; 
 this.tetrisType = [1,1]; 
 this.tetrisType = [1,0]; 
 this.tetrisTypeArr = []; 
 
 this.preTetris = []; 
 this.thisTetris = []; 
 this.fullArr = []; 
 
 this.start(); 
 } 
 Tetris.prototype = { 
 //开始入口函数 
 start : function(){ 
 this.init(); 
 this.menu(); 
 this.control(); 
 }, 
 //选择设置 
 setOptions : function(options){ 
 this.score = options.score === 0 ? options.score 
 : (options.score || this.score); 
 this.level = options.level === 0 ? options.level 
 : (options.level || this.level); 
 }, 
 resetArea : function(){ 
 $(".play_cell.active").removeClass("active"); 
 this.setOptions({ 
 "score" : 0 
 }); 
 this.e.playScore.html(this.score); 
 }, 
 //菜单 
 menu : function(){ 
 var self = this; 
 this.e_startBtn.click(function(){ 
 self.e_levelMenu.hide(); 
 if(self.playing){ 
 self.pause(); 
 } else if(self.death){ 
 self.resetArea(); 
 self.play(); 
 } else { 
 self.play(); 
 } 
 }); 
 this.e_levelBtn.click(function(){ 
 if(self.playing)return; 
 self.e_levelMenu.toggle(); 
 }); 
 this.e_levelMenu.find("a").click(function(){ 
 self.e_levelMenu.hide(); 
 self.e_levelBtn.find(".level_text").html($(this).html()); 
 self.setOptions({ 
 "level" : $(this).attr("level") 
 }); 
 }); 
 }, 
 play : function(){ 
 var self = this; 
 this.e_startBtn.html("暂停"); 
 this.playing = true; 
 this.death = false; 
 if(this.turning){ 
 this.timer = setInterval(function(){ 
 self.offsetRow++; 
 self.showTetris(); 
 },this.interval[this.level]); 
 } else { 
 this.nextTetris(); 
 } 
 }, 
 pause : function(){ 
 this.e_startBtn.html("开始"); 
 this.playing = false; 
 clearTimeout(this.timer); 
 }, 
 //初始化游戏 
 init : function(){ 
 var self =this,_ele,_miniEle,_arr = []; 
 //创建小方块放进cellArr里 
 for(var i=0;i<this.cellCol;++i){ 
 for(var j=0;j<this.cellRow;++j){ 
 _ele = document.createElement("div"); 
 _ele.className = "play_cell"; 
 _ele.id = "play_cell_"+ i + "_" + j; 
 this.cellArr.push($(_ele)); 
 this.e_playArea.append(_ele); 
 } 
 } 
 //创建下一个图形的小方块 
 for(var m=0;m<16;++m){ 
 _miniEle = document.createElement("div"); 
 _miniEle.className = "play_mini_cell"; 
 this.miniCellArr.push($(_miniEle)); 
 this.e_nextType.append(_miniEle); 
 } 
 //保存三维数组tetrisArr的前两维数据编号,k为其第一维编号,j为其二维 
 for(var k=0,klen=this.tetrisArr.length;k<klen;++k){ 
 for(var j=0,jlen=this.tetrisArr[k].length;j<jlen;++j){ 
 this.tetrisTypeArr.push([k,j]); 
 } 
 } 
 //下一个图形的【x】【y】 
 this.nextType = this.tetrisTypeArr[Math.floor(this.tetrisTypeArr.length*Math.random())]; 
 this.showNextType(); 
 }, 
 //按键控制函数 
 control : function(){ 
 var self = this; 
 $("html").keydown(function(e){ 
 if(!self.playing) 
 return !self.playing; 
 switch(e.keyCode){ 
 case 37: 
 self.direction = "left"; 
 break; 
 case 38: 
 self.direction = "top"; 
 break; 
 case 39: 
 self.direction = "right"; 
 break; 
 case 40: 
 self.direction = "bottom"; 
 break; 
 default: 
 return; 
 break; 
 } 
 //显示当前的按键操作 
 self.e_playDirection.html(self.direction); 
 //实行按键的操作函数 
 self.drive(); 
 return false; 
 }); 
 }, 
 //改变图形的状态 
 changTetris : function(){ 
 var _len = this.tetrisArr[this.tetrisType[0]].length; 
 if(this.tetrisType[1] < _len-1){ 
 this.tetrisType[1]++; 
 } else { 
 this.tetrisType[1] = 0; 
 } 
 }, 
 //按键的操作函数 
 drive : function(){ 
 switch(this.direction){ 
 case "left": 
 if(this.offsetCol>0){ 
 this.offsetCol--; 
 } 
 break; 
 case "top": 
 this.changTetris(); 
 break; 
 case "right": 
 this.offsetCol++; 
 break; 
 case "bottom": 
 if(this.offsetRow<this.cellRow-2){ 
 this.offsetRow++; 
 } 
 break; 
 default: 
 break; 
 } 
 //显示图形的函数 
 this.showTetris(this.direction); 
 }, 
 //显示图形的函数 
 showTetris : function(dir){ 
 var _tt = this.tetrisArr[this.tetrisType[0]][this.tetrisType[1]],_ele,self=this; 
 this.turning = true; 
 this.thisTetris = []; 
 for(var i=_tt.length-1;i>=0;--i){ 
 _ele = this.cellArr[_tt[i]+this.offsetCol+this.offsetRow*this.cellCol]; 
 //规定左右移动不能超出边框 
 if(this.offsetCol<7&&(_tt[i]+this.offsetCol+1)%this.cellCol==0){ 
 this.offsetCol++; 
 return; 
 }else if(this.offsetCol>7&&(_tt[i]+this.offsetCol)%this.cellCol==0){ 
 this.offsetCol--; 
 return; 
 } 
 //判断是否下落是与方块碰撞了,排除向左移动时碰到左边的方块而停止下落 
 if(_ele&&_ele.hasClass("active")&&dir=="left"&&($.inArray(_ele,this.preTetris)<0)){ 
 if(($.inArray(_ele,this.cellArr)-$.inArray(this.preTetris[i],this.cellArr))%this.cellCol!=0){ 
 this.offsetCol++; 
 return; 
 } 
 } 
 if(_ele&&_ele.hasClass("active")&&dir=="right"&&($.inArray(_ele,this.preTetris)<0)){ 
 if(($.inArray(_ele,this.cellArr)-$.inArray(this.preTetris[i],this.cellArr))%this.cellCol!=0){ 
 this.offsetCol--; 
 return; 
 } 
 } 
 //找到某个div进行下落的过程 
 //否则找不到直接结束下落的过程 
 if(_ele){ 
 //找到一个div有class=active,而且不是上一次自身的位置,那么就停止 
 //向下走了,因为遇到障碍物了 
 //否则这个div符合,存起来 
 if(_ele.hasClass("active")&&($.inArray(_ele,this.preTetris)<0)){ 
 this.tetrisDown(); 
 return; 
 } else { 
 this.thisTetris.push(_ele); 
 } 
 } else if(this.offsetRow>0){ 
 this.tetrisDown(); 
 return; 
 } 
 } 
 //将上一次的位置的标记全部去除 
 for(var j=0,jlen=this.preTetris.length;j<jlen;++j){ 
 this.preTetris[j].removeClass("active"); 
 } 
 //标记这一次的位置 
 for(var k=0,klen=this.thisTetris.length;k<klen;k++){ 
 this.thisTetris[k].addClass("active"); 
 } 
 //储存起现在的位置,会成为下一次的前一次位置 
 this.preTetris = this.thisTetris.slice(0); 
 }, 
 //无法下落时进行的函数 
 tetrisDown : function(){ 
 clearInterval(this.timer); 
 var _index; 
 this.turning = false; 
 //是否填充满一行的检测 
 forOuter:for(var j=0,jlen=this.preTetris.length;j<jlen;++j){ 
 _index = $.inArray(this.preTetris[j],this.cellArr); 
 for(var k=_index-_index%this.cellCol,klen=_index-_index%this.cellCol+this.cellCol;k<klen;++k){ 
 if(!this.cellArr[k].hasClass("active")){ 
 continue forOuter; 
 } 
 } 
 if($.inArray(_index-_index%this.cellCol,this.fullArr)<0) 
 this.fullArr.push(_index-_index%this.cellCol); 
 } 
 if(this.fullArr.length){ 
 this.getScore(); 
 return; 
 } 
 //如果图形在6-9的div内被标记,那么游戏结束 
 for(var i=6;i<9;++i){ 
 if(this.cellArr[i].hasClass("active")){ 
 this.gameOver(); 
 alert("you lost!"); 
 return; 
 } 
 } 
 this.nextTetris(); 
 }, 
 //下一个图形 
 nextTetris : function(){ 
 var self = this; 
 clearInterval(this.timer); 
 this.preTetris = []; 
 this.offsetRow = -2; 
 this.offsetCol = 7; 
 this.tetrisType = this.nextType; 
 this.nextType = this.tetrisTypeArr[Math.floor(this.tetrisTypeArr.length*Math.random())]; 
 this.showNextType(); 
 this.timer = setInterval(function(){ 
 self.offsetRow++; 
 self.showTetris(); 
 },this.interval[this.level]); 
 }, 
 showNextType : function(){ 
 //_nt为找到在this.nextType[0]行,this.nextType[1]列的一行数据 
 var _nt = this.tetrisArr[this.nextType[0]][this.nextType[1]],_ele,_index; 
 //找到class=active的元素,之后全部删除class元素 
 this.e_nextType.find(".active").removeClass("active"); 
 for(var i=0,ilen=_nt.length;i<ilen;++i){ 
 //因为offsetCol的最小值只能为2,所以在tetrisArr数组中赋的值都减了2 
 //这里要加回2来处理,才能在小的视图里安放图形 
 if(_nt[i]>this.cellCol-2){ 
 _index = (_nt[i]+2)%this.cellCol-1+4*parseInt((_nt[i]+2)/this.cellCol); 
 }else{ 
 _index = _nt[i] + 1; 
 } 
 _ele = this.miniCellArr[_index]; 
 _ele.addClass("active"); 
 } 
 }, 
 //获取分数 
 getScore : function(){ 
 var self = this; 
 //对完整的行消除,对元素进行向下移动 
 for(var i=this.fullArr.length-1;i>=0;--i){ 
 for(var j=0;j<this.cellCol;++j){ 
 this.cellArr[j+this.fullArr[i]].removeClass("active"); 
 if(j==this.cellCol-1){ 
 for(var k=this.fullArr[i];k>=0;--k){ 
 if(this.cellArr[k].hasClass("active")){ 
  this.cellArr[k].removeClass("active"); 
  this.cellArr[k+this.cellCol].addClass("active"); 
 } 
 } 
 } 
 } 
 } 
 this.score += this.levelScore[this.level]*this.doubleScore[this.fullArr.length-1]; 
 this.e_playScore.html(this.score); 
 this.fullArr = []; 
 this.nextTetris(); 
 }, 
 //游戏结束 
 gameOver : function(){ 
 this.death = true; 
 this.pause(); 
 return; 
 } 
 }; 
 $(document).ready(function(e){ 
 var t = new Tetris(); 
 }); 
 </script>

源码下载:http://xiazai.3water.com/201610/yuanma/js-html5els(3water.com).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE JS编程需注意的内存释放问题
Jun 23 Javascript
基于jquery.Jcrop的头像编辑器
Mar 01 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
使用canvas实现仿新浪微博头像截取上传功能
Sep 02 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
微信小程序 条件渲染详解
Oct 09 Javascript
纯JS实现表单验证实例
Dec 24 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
Jan 19 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
react 原生实现头像滚动播放的示例
Apr 21 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
Node.js包管理器Yarn的入门介绍与安装
Oct 17 #Javascript
深入理解JS实现快速排序和去重
Oct 17 #Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 #Javascript
Angular 2应用的8个主要构造块有哪些
Oct 17 #Javascript
jQuery表单验证简单示例
Oct 17 #Javascript
jQuery右下角悬浮广告实例
Oct 17 #Javascript
WEB前端实现裁剪上传图片功能
Oct 17 #Javascript
You might like
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
cakephp常见知识点汇总
2017/02/24 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python中super的用法实例
2015/05/28 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
numpy基础教程之np.linalg
2019/02/12 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
护士辞职信模板
2014/01/20 职场文书
入党自我评价优缺点
2014/01/25 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
银行求职信
2014/05/31 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
师德师风学习材料
2014/12/19 职场文书
个人欠条范本
2015/07/03 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏