1. 程式人生 > >JavaScript實戰操作—成語消消樂

JavaScript實戰操作—成語消消樂

一 預覽

在這裡插入圖片描述

二 開發步驟

基本面向過程的思想。沒有面向物件的部分。

準備好成語庫。db.js 選出每一關的成語。 對成語進行亂序。 初始化表格的同時,將單個字放到每個單元格的按鈕上展示。 對tbody進行點選事件的監聽。事件函式中獲取btn。用變數記錄選中的文字。 判斷得分、判斷下一關、判斷遊戲結束(成語庫畢竟用陣列來儲存。成語數量有限。) 三 程式碼

只有兩個檔案:index.html和db.js

1 index.html程式碼如下:

<!DOCTYPE HTML>
<HTML>
<head>
	 <meta charset="UTF-8" />
	 <style>
	    table{
			margin:0 auto;
			width:200px;
			border:1px solid black;
		}
		table button{
			width:100%;
			height:40px;
		}
		table td{
			width:25%;
		}
		table td .selectbtn{
		   background:blue;
		   color:white;
		}
	 </style>
	<script type="text/javascript" src="db.js"></script>
</head>
<body >
   <div align="center">成語消消樂</div>
   <div align="center">
	當前第<font color="green" id="current_level_text">1</font>關&nbsp;
    得分<font id="gain_scores_txt" color="green">0</font>分&nbsp;
	思考<font id="think_time" color="red">0</font>s&nbsp;
	總耗時<font id="total_times" color="blue">0</font>s&nbsp;
   </div>
   <table  border='0' cellpadding='0' cellspacing='0'>
	 <tbody id="mytbody">
	 </tbody>
   </table>
<script>
	window.onload=function(){
		var XXL={
			dom:{
				level:document.getElementById("current_level_text"),
				scores:document.getElementById("gain_scores_txt"),
				think_time:document.getElementById("think_time"),
				total_times:document.getElementById("total_times"),
				tbody:document.getElementById("mytbody")
			},
			dbs:listWords,//從外部js中載入。
			chooseData:[],//記錄從資料庫從取出的成語。
			recordChooseText:"",//記錄使用者選擇的文字。
			recordChooseBtn:[],//記錄使用者選擇的按鈕的jq物件。
			current_index:0,//當前關數。 不可調。
			every_words:6,//每一關的成語個數。可調。
			every_right_num:0,//當前關答對的成語個數。 不可調。
			current_words:0,//當前關的成語個數。 ,不可調。
			last_time:Date.now(),//最後一次答題時間。
			gain_scores:0,//得分。不可調。
			every_scores:5,//每題得分。可調。
			//從成語庫中選取成語。
			initWords:function(){
					var dbtxt = "";
					var start =  this.current_index * this.every_words;
					var end = start + this.every_words  <= this.dbs.length ? start + this.every_words : this.dbs.length; 
					//此段是後來完善的。
					this.current_words = end - start;
					if( this.current_words <=0 ){
					   end = 0;
					   this.current_words = 0;
					}
					//
					for(var i=start;i<end;i++){
						dbtxt +=this.dbs[i];
						this.chooseData.push(this.dbs[i]);
					}
					return dbtxt;//返回亂序前的拼接字串。
					
			},
			luanxu:function(dbtxt){
					var luanxu=[];
					while(dbtxt.length>0){
						var index = parseInt(Math.random()*dbtxt.length);
						luanxu.push(dbtxt.charAt(index));
						dbtxt = dbtxt.substring(0,index)+dbtxt.substring(index+1,dbtxt.length);
					}	
				return luanxu;//返回亂序後的字元。
			},
			createTable:function(words){
				var len = 0;
				var tbody = document.getElementById("mytbody");
				tbody.innerHTML="";//清空tbody。
				var tbodyhtml = "";
				for(var i=0;i<XXL.current_words; i++){
					var tr = "<tr>";
					for(var j=0;j<4;j++){
						var td = "<td>" ;
								td+=("<button type='button'>"+words[len++]+"</button>");
						    td+="</td>";
						tr+=td; 
					}
					tr+="</tr>";
					tbodyhtml+=tr;
				}
				tbody.innerHTML = tbodyhtml;
			},
			removeBtn:function(){
				for(var i=0;i<XXL.recordChooseBtn.length;i++){
					XXL.recordChooseBtn[i].remove();
				}
			},
			//下一關。
			nextLevel:function(){
			   //答對成語個數和當前關的成語個數相等。則下一關。
			   if(this.every_right_num == this.current_words){
				  //下一關。
				   this.current_index ++;
			       alert("恭喜您進入第"+ (this.current_index+1) +"關");
				  //清空當前答對成語個數。
				   this.every_right_num = 0;
				   //1重新初始化表格。
				   this.init();
				  
				    this.dom.level.innerText = this.current_index+1;
				   //判斷終極結束。
				   if(this.current_words <= 0){
					  alert("您已經是這個宇宙最厲害的人了。");
					  //重新載入網頁。
					  window.location.reload();
				   } 
			   }
			},
			//檢測得分。
			check:function(){
				//如果點選的按鈕個數少於4。直接退出函式。
				if(this.recordChooseBtn.length <4)return;
				//判斷選擇的成語,是否能夠組成一個四字成語。
				var find = false;//是否匹配標誌位。
				for(var i=0;i<this.chooseData.length;i++){
					if(this.recordChooseText == this.chooseData[i]){
						find = true;
						break;
					}
				}
				//如果能匹配上。
				if(find){
					//答對成語個數 ++。
					this.every_right_num ++;
				   //介面中消去成語。
				   this.removeBtn();
				   //判斷是否需要跳轉下一關。
				   this.nextLevel();
				   //更新答題時間。
				   this.last_time = Date.now();
				   //更新得分。
				   this.gain_scores += this.every_scores;
				   //
				   this.dom.scores.innerText = this.gain_scores;
				} 
				//還原按鈕樣式。
				document.querySelectorAll(".selectbtn").forEach(function(btn){
					btn.className="";
				});
				 //清空按鈕陣列。
				 this.recordChooseBtn=[];
				 //清空選中的成語字串
				 this.recordChooseText = "";
			},
			init:function(){
				//1 從成語庫中選出當前關的成語。
				var worstxt = this.initWords();
				//2 準備亂序成語。
				var dbs = this.luanxu( worstxt );
				//3 準備好介面。
				this.createTable(dbs);
			},
			bindEvent:function(){
				var _this = this;
				//對tbody進行點選事件的繫結。利用事件的冒泡。
				//當點選子元素時,tbody事件函式能夠進行響應。
				this.dom.tbody.onclick = function(e){
				var btn = e.target;//dom物件。
				   if( btn.type =="button"){
				       _this.recordChooseText += btn.innerText;
					   _this.recordChooseBtn.push( btn );
					   //新增一個class屬性,控制選中樣式。
					   btn.className="selectbtn";
					   //檢測得分。
					   _this.check();
				   }
			   }
			},
			executeTask:function(){
				//定時1s執行一次。
				setInterval(function(){
					//思考時間
					XXL.dom.think_time.innerText = parseInt((Date.now()-XXL.last_time)/1000);
					 
					//總時間
					XXL.dom.total_times.innerText = parseInt( XXL.dom.total_times.innerText )+1;
				},1000);
			}
		};
		XXL.init();
		XXL.bindEvent();
		XXL.executeTask();
	};
</script>
</body>
</HTML>

2 db.js檔案如下:

var listWords=[“金蟬脫殼”,“百裡挑一”,“金玉滿堂”,“背水一戰”,“霸王別姬”,“天上人間”,“不吐不快”,“海闊天空”,“情非得已”,“滿腹經綸”,“兵臨城下”,“春暖花開”,“插翅難逃”,“黃道吉日”,“天下無雙”,“偷天換日”,“兩小無猜”,“臥虎藏龍”,“珠光寶氣”,“簪纓世族”,“花花公子”,“繪聲繪影”,“國色天香”,“相親相愛”,“八仙過海”,“金玉良緣”,“掌上明珠”,“皆大歡喜”,“逍遙法外”,“生財有道”,“極樂世界”,“情不自禁”,“愚公移山”,“魑魅魍魎”,“龍生九子”,“精衛填海”,“海市蜃樓”,“高山流水”,“臥薪嚐膽”,“壯志凌雲”,“金枝玉葉”,“四海一家”,“穿針引線”,“無憂無慮”,“無地自容”,“三位一體”,“落葉歸根”,“相見恨晚”,“驚天動地”,“滔滔不絕”,“相濡以沫”,“長生不死”,“原來如此”,“女媧補天”,“三皇五帝”,“萬箭穿心”,“水木清華”,“窈窕淑女”,“破釜沉舟”,“天涯海角”,“牛郎織女”,“傾國傾城”,“飄飄欲仙”,“福星高照”,“妄自菲薄”,“永無止境”,“學富五車”,“飲食男女”,“英雄豪傑”,“國士無雙”,“塞翁失馬”,“萬家燈火”,“石破天驚”,“精忠報國”,“養生之道”,“覆雨翻雲”,“六道輪迴”,“鷹擊長空”,“日日夜夜”,“厚德載物”,“亡羊補牢”,“萬里長城”,“黃金時代”,“出生入死”,“一路順風”,“隨遇而安”,“千軍萬馬”,“鄭人買履”,“棋逢對手”,“葉公好龍”,“後會無期”,“守株待兔”,“鳳凰于飛”,“一生一世”,“花好月圓”,“世外桃源”,“韜光養晦”,“畫蛇添足”,“青梅竹馬”,“風花雪月”,“濫竽充數”,“總而言之”,“沒完沒了”,“欣欣向榮”,“時光荏苒”,“差強人意”,“好好先生”,“無懈可擊”,“隨波逐流”,“袖手旁觀”,“群雄逐鹿”,“血戰到底”,“唯我獨尊”,“買櫝還珠”,“龍馬精神”,“一見鍾情”,“喜聞樂見”,“負荊請罪”,“三人成虎”,“河東獅吼”,“程門立雪”,“金戈鐵馬”,“笑逐顏開”,“千鈞一髮”,“紙上談兵”,“風和日麗”,“邯鄲學步”,“大器晚成”,“庖丁解牛”,“甜言蜜語”,“雷霆萬鈞”,“浮生若夢”,“大開眼界”,“汗牛充棟”,“百鳥朝鳳”,“以德服人”,“白駒過隙”,“難兄難弟”,“鬼哭神嚎”,“聲色犬馬”,“指鹿為馬”,“龍爭虎鬥”,“霧裡看花”,“男大當婚”,“未雨綢繆”,“南轅北轍”,“三從四德”,“一絲不掛”,“高屋建瓴”,“陽春白雪”,“杯弓蛇影”,“聞雞起舞”,“四面楚歌”,“登堂入室”,“張燈結綵”,“而立之年”,“飲鴆止渴”,“杏雨梨雲”,“龍鳳呈祥”,“勇往直前”,“左道旁門”,“莫衷一是”,“馬踏飛燕”,“掩耳盜鈴”,“大江東去”,“鑿壁偷光”,“色厲內荏”,“花容月貌”,“越俎代庖”,“鱗次櫛比”,“美輪美奐”,“緣木求魚”,“再接再厲”,“馬到成功”,“紅顏知己”,“赤子之心”,“迫在眉睫”,“風流韻事”,“相形見絀”,“諸子百家”,“鬼迷心竅”,“星火燎原”,“畫地為牢”,“歲寒三友”,“花花世界”,“紙醉金迷”,“狐假虎威”,“縱橫捭闔”,“滄海桑田”,“不求甚解”,“暴殄天物”,“吃喝玩樂”,“樂不思蜀”,“身不由己”,“小家碧玉”,“文不加點”,“天馬行空”,“人來人往”,“千方百計”,“天高地厚”,“萬人空巷”,“爭分奪秒”,“如火如荼”,“大智若愚”,“斗轉星移”,“七情六慾”,“大禹治水”,“空穴來風”,“孟母三遷”,“繪聲繪色”,“九五之尊”,“隨心所欲”,“干將莫邪”,“相得益彰”,“借刀殺人”,“浪跡天涯”,“剛愎自用”,“鏡花水月”,“黔驢技窮”,“肝膽相照”,“多多益善”,“叱吒風雲”,“杞人憂天”,“作繭自縛”,“一飛沖天”,“殊途同歸”,“風捲殘雲”,“因果報應”,“無可厚非”,“趕盡殺絕”,“天長地久”,“飛龍在天”,“桃之夭夭”,“南柯一夢”,“口是心非”,“江山如畫”,“風華正茂”,“一帆風順”,“一葉知秋”,“草船借箭”,“鐵石心腸”,“望其項背”,“頭暈目眩”,“大浪淘沙”,“縱橫天下”,“有問必答”,“無為而治”,“釜底抽薪”,“吹毛求疵”,“好事多磨”,“空谷幽蘭”,“懸樑刺股”,“白手起家”,“完璧歸趙”,“忍俊不禁”,“沐猴而冠”,“白雲蒼狗”,“賊眉鼠眼”,“圍魏救趙”,“煙雨濛濛”,“炙手可熱”,“尸位素餐”,“出水芙蓉”,“禮儀之邦”,“一丘之貉”,“鵬程萬里”,“歎為觀止”,“韋編三絕”,“今生今世”,“草木皆兵”,“寧缺毋濫”,“迴光返照”,“露水夫妻”,“諱莫如深”,“貽笑大方”,“紫氣東來”,“萬馬奔騰”,“一諾千金”,“老馬識途”,“五花大綁”,“捉襟見肘”,“瓜田李下”,“水漫金山”,“苦心孤詣”,“可見一斑”,“五湖四海”,“虛懷若谷”,“欲擒故縱”,“風聲鶴唳”,“毛遂自薦”,“蛛絲馬跡”,“中庸之道”,“迷途知返”,“自由自在”,“龍飛鳳舞”,“樹大根深”,“雨過天晴”,“乘風破浪”,“篳路藍縷”,“朝三暮四”,“患得患失”,“君子好逑”,“鞭長莫及”,“竭澤而漁”,“飛黃騰達”,“囊螢映雪”,“飛蛾撲火”,“自怨自艾”,“風馳電掣”,“白馬非馬”,“退避三舍”,“三山五嶽”,“稱心如意”,“望梅止渴”,“煢煢孑立”,“振聾發聵”,“運籌帷幄”,“逃之夭夭”,“杯水車薪”,“有的放矢”,“矯枉過正”,“睚眥必報”,“姍姍來遲”,“一鳴驚人”,“孜孜不倦”,“一馬平川”,“入木三分”,“沆瀣一氣”,“天倫之樂”,“兄弟鬩牆”,“藕斷絲連”,“心猿意馬”,“想入非非”,“盲人摸象”,“眉飛色舞”,“三教九流”,“高樓大廈”,“鍥而不捨”,“過猶不及”,“狗尾續貂”,“斗酒學士”,“高山仰止”,“形影不離”,“小心翼翼”,“返璞歸真”,“見賢思齊”,“按圖索驥”,“槍林彈雨”,“桀驁不馴”,“遇人不淑”,“道貌岸然”,“名揚四海”,“虛與委蛇”,“門可羅雀”,“水落石出”,“不卑不亢”,“無法無天”,“拔苗助長”,“大快朵頤”,“因地制宜”,“單刀直入”,“時來運轉”,“天方夜譚”,“一蹴而就”,“躊躇滿志”,“戰無不勝”,“插翅難飛”,“圖窮匕見”,“鬼話連篇”,“亢龍有悔”,“望洋興嘆”,“愛屋及烏”,“驚鴻一瞥”,“風華絕代”,“名勝古蹟”,“如履薄冰”,“持之以恆”,“潛移默化”,“曇花一現”,“巫山雲雨”,“狡兔三窟”,“櫛風沐雨”,“駭人聽聞”,“斷章取義”,“曲突徙薪”,“謝天謝地”,“脫穎而出”,“垂簾聽政”,“一馬當先”,“不恥下問”,“不以為然”,“春華秋實”,“欲蓋彌彰”,“人琴俱亡”,“投鼠忌器”,“歧路亡羊”,“金風玉露”,“落花流水”,“春風化雨”,“心如刀割”,“錙銖必較”,“一葉障目”,“來歷不明”,“名副其實”,“中流砥柱”,“繞樑三日”,“安步當車”,“放蕩不羈”,“天衣無縫”,“自相矛盾”,“神機妙算”,“滄海一粟”,“衝鋒陷陣”,“龍虎風雲”,“言簡意賅”,“九死一生”,“鐵樹開花”,“畫龍點睛”,“風雨無阻”,“不恥下問”,“不以為然”,“春華秋實”,“欲蓋彌彰”,“人琴俱亡”,“投鼠忌器”,“歧路亡羊”,“金風玉露”,“落花流水”,“春風化雨”,“心如刀割”,“錙銖必較”,“一葉障目”,“來歷不明”,“名副其實”,“中流砥柱”,“繞樑三日”,“安步當車”,“放蕩不羈”,“天衣無縫”,“自相矛盾”,“神機妙算”,“滄海一粟”,“衝鋒陷陣”,“龍虎風雲”,“言簡意賅”,“九死一生”,“鐵樹開花”,“畫龍點睛”,“風雨無阻”,“坐井觀天”,“奇貨可居”,“浮光掠影”,“牝雞司晨”,“沽名釣譽”,“天作之合”,“甚囂塵上”,“鎩羽而歸”,“劫後餘生”,“涇渭分明”,“節哀順變”,“有恃無恐”,“不絕如縷”,“馬革裹屍”,“監守自盜”,“耳濡目染”,“金屋藏嬌”,“不約而同”,“逐鹿中原”,“龍潭虎穴”,“江郎才盡”,“明日黃花”,“栩栩如生”,“人山人海”,“面面相覷”,“脣亡齒寒”,“知法犯法”,“相敬如賓”,“曾幾何時”,“歡聚一堂”,“紛至沓來”,“李代桃僵”,“毛骨悚然”,“衣冠禽獸”,“有鳳來儀”,“見微知著”,“旗鼓相當”,“無與倫比”,“摸金校尉”,“牛頭馬面”,“鳳毛麟角”,“難得糊塗”,“衣香鬢影”,“馬到功成”,“鳩佔鵲巢”,“狹路相逢”,“春秋筆法”,“厲兵秣馬”,“約法三章”,“豁然開朗”,“平步青雲”,“步步為營”,“蠅營狗苟”,“心如止水”,“從善如流”,“殫精竭慮”,“十字路口”,“矢志不渝”,“九九歸一”,“井底之蛙”,“居安思危”,“不一而足”,“周而復始”,“望穿秋水”,“秦晉之好”,“不落窠臼”,“司空見慣”,“怙惡不悛”,“百年好合”,“出神入化”,“身體力行”,“敬謝不敏”,“嗤之以鼻”,“天之驕子”,“賢妻良母”,“能說會道”,“進退維谷”,“甘之如飴”,“人心不古”,“頤指氣使”,“墨守成規”,“左右逢源”,“回心轉意”,“插科打諢”,“別來無恙”,“翩翩公子”,“窮兵黷武”,“舌戰群儒”,“字字珠璣”,“義無反顧”];

相信有很多想學前端的小夥伴,今年年初我花了一個月整理了一份最適合2018年學習的web前端乾貨,從最基礎的HTML+CSS+JS到移動端HTML5到各種框架都有整理,送給每一位前端小夥伴,731771211