日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我花了一夜用数据结构给女朋友写个H5走迷宫游戏 | CSDN 博文精选

發布時間:2024/8/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我花了一夜用数据结构给女朋友写个H5走迷宫游戏 | CSDN 博文精选 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
戳藍字“CSDN云計算”關注我們哦! 作者 |?bigsai(同公眾號) 轉自| CSDN博客 責編 | 阿禿 先看效果圖(在線電腦嘗試地址http://biggsai.com/maze.html):

起因


又到深夜了,我按照以往在公眾號寫著數據結構!這占用了我大量的時間!我的超越妹妹嚴重缺乏陪伴而 怨氣滿滿!

超越妹妹時常埋怨,認為數據結構這么抽象難懂的東西沒啥作用,常會問道:天天寫這玩意,有啥作用。而我答道:能干事情多了,比如寫個小游戲啥的!

當我碼完字準備睡覺時:寫不好別睡覺!

分析
如果用數據結構與算法造出東西來呢?

  • 什么東西簡單容易呢?我百度一下,我靠,這個鳥游戲原來不好搞啊,得接觸一堆不熟悉的東西,搞不來搞不來。有了(靈光一閃),寫個猜數字游戲,問他加減乘除等于幾。
  • 超越妹妹又不是小孩子,糊弄不過去。
  • 經過一番折騰,終于在半夜12點確定寫迷宮小游戲了。大概弄清楚其中的幾個步驟。

大概是:畫線—>畫迷宮(擦線)—>方塊移動、移動約束(不出界不穿墻)—>完成游戲。
畫線(棋盤)
對于html+js(canvas)畫的東西,之前學過javaswing應該有點映像。在html中有個canvas 的畫布,可以在上面畫一些東西和聲明一些監聽(鍵盤監聽)。

對于迷宮來說,那些線條是沒有屬性的,只有位置x,y,你操作這個畫布時候,可能和我們習慣的面相對象思維不一樣。所以,在你設計的線或者點的時候,記得那個點、線在什么位置,在后續劃線還是擦線還是移動的時候根據這個位置進行操作。
<!DOCTYPE html><html><head><title>MyHtml.html</title></head><body><canvas id="mycanvas" width="600px" height="600px"></canvas></body><script type="text/javascript">var aa=14;var chess = document.getElementById("mycanvas");var context = chess.getContext('2d');// var context2 = chess.getContext('2d');// context.strokeStyle = 'yellow';var tree = [];//存放是否聯通var isling=[];//判斷是否相連for(var i=0;i<aa;i++){ tree[i]=[];for(var j=0;j<aa;j++){ tree[i][j]=-1;//初始值為0 } } for(var i=0;i<aa*aa;i++){ isling[i]=[];for(var j=0;j<aa*aa;j++){ isling[i][j]=-1;//初始值為0 } }function drawChessBoard(){//繪畫for(var i=0;i<aa+1;i++){ context.strokeStyle='gray';//可選區域 context.moveTo(15+i*30,15);//垂直方向畫15根線,相距30px; context.lineTo(15+i*30,15+30*aa); context.stroke(); context.moveTo(15,15+i*30);//水平方向畫15根線,相距30px;棋盤為14*14;context.lineTo(15+30*aa,15+i*30); context.stroke(); } } drawChessBoard();//繪制棋盤// var mymap=new Array(36);// for(var i=0;i<36;i++)// {mymap[i]=-1;}</script></html>
實現效果 畫迷宮
隨機迷宮怎么生成?怎么搞?一臉懵逼。

  • 因為我們想要迷宮,那么就需要這個迷宮出口和入口有連通路徑,你可能壓根不知道迷宮改怎么生成,用的什么算法。小聲BB:用并查集(不相交集合)。

迷宮和不相交集合有什么聯系呢?(規則)

  • 之前筆者在前面數據結構與算法系列中曾經介紹過并查集(不相交集合),它的主要功能是森林的合并,不聯通的通過并查集能夠快速將兩個森林合并,并且能夠快速查詢兩個節點是否在同一個森林中!

而我們的隨機迷宮:在每個方格都不聯通的情況下,是一個棋盤方格,這也是它的初始狀態。而這個節點可以跟鄰居可能相連,也可能不相連。我們可以通過并查集實現。

具體思路為:(主要理解并查集)

1:定義好不想交集合的基本類和方法(search,union等) 2:數組初始化,每一個數組元素都是一個集合,值為-1 3:隨機查找一個格子(一維數據要轉換成二維,有點麻煩),在隨機找一面墻(也就是找這個格子的上下左右),還要判斷找的格子出沒出界。 具體在格子中找個隨機數m——>隨機數m在二維中的位置[m/長,m%長]——>這個二維的上下左右隨機找一個位置p[m/長+1,m%長]或[m/長-1,m%長]或[m/長,m%長+1]或[m/長,m%長-1]——>判斷是否越界 4:判斷兩個格子(一維數組編號)是否在一個集合(并查集查找)。如果在,則重新找,如果不在,那么把墻挖去 5:把墻挖去有點繁瑣,需要考慮奇偶判斷它那種墻(上下還是左右,還要考慮位置),然后擦掉。(根據數組轉換成真實距離)。具體為找一個節點,根據位置關系找到一維數組的號位用并查集判斷是否在一個集合中。 6:最終得到一個完整的迷宮。直到第一個(1,1)和(n,n)聯通停止。雖然采用隨機數找墻,但是效果并不是特別差。其中要搞清一維二維數組的關系。一維是真實數據,并查集操作。二維是位置。要搞懂轉化! 注意:避免混淆,搞清數組的地址和邏輯矩陣位置。數組從0開始的,邏輯上你自己判斷。別搞混淆!

主要邏輯為: while(search(0)!=search(aa*aa-1))//主要思路 {var num = parseInt(Math.random() * aa*aa );//產生一個小于196的隨機數var neihbour=getnei(num);if(search(num)==search(neihbour)){continue;}else//不在一個上 { isling[num][neihbour]=1;isling[neihbour][num]=1; drawline(num,neihbour);//劃線 union(num,neihbour); } }

那么在前面的代碼為 <!DOCTYPE html><html><head><title>MyHtml.html</title></head><body><canvas id="mycanvas" width="600px" height="600px"></canvas></body><script type="text/javascript">//自行添加上面代碼// var mymap=new Array(36);// for(var i=0;i<36;i++)// {mymap[i]=-1;}function getnei(a)//獲得鄰居號 random{var x=parseInt(a/aa);//要精確成整數var y=a%aa;var mynei=new Array();//儲存鄰居if(x-1>=0){mynei.push((x-1)*aa+y);}//上節點if(x+1<14){mynei.push((x+1)*aa+y);}//下節點if(y+1<14){mynei.push(x*aa+y+1);}//有節點if(y-1>=0){mynei.push(x*aa+y-1);}//下節點var ran=parseInt(Math.random() * mynei.length );return mynei[ran]; }function search(a)//找到根節點{if(tree[parseInt(a/aa)][a%aa]>0)//說明是子節點 {return search(tree[parseInt(a/aa)][a%aa]);//不能壓縮路徑路徑壓縮 }elsereturn a; }function value(a)//找到樹的大小{if(tree[parseInt(a/aa)][a%aa]>0)//說明是子節點 {return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路徑壓縮 }elsereturn -tree[parseInt(a/aa)][a%aa]; }function union(a,b)//合并{var a1=search(a);//a根var b1=search(b);//b根if(a1==b1){}else {if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//這個是負數(),為了簡單減少計算,不在調用value函數 { tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//個數相加 注意是負數相加 tree[parseInt(b1/aa)][b1%aa]=a1; //b樹成為a樹的子樹,b的根b1直接指向a;}else { tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa]; tree[parseInt(a1/aa)][a1%aa]=b1;//a所在樹成為b所在樹的子樹 } } }function drawline(a,b)//劃線,要判斷是上下還是左右{var x1=parseInt(a/aa);var y1=a%aa;var x2=parseInt(b/aa);var y2=b%aa; var x3=(x1+x2)/2;var y3=(y1+y2)/2;if(x1-x2==1||x1-x2==-1)//左右方向的點 需要上下劃線 {//alert(x1);// context.beginPath(); context.strokeStyle = 'white';// context.moveTo(30+x3*30,y3*30+15); context.lineTo(30+x3*30,y3*30+45); context.clearRect(29+x3*30, y3*30+16,2,28);// context.stroke(); }else {// context.beginPath(); context.strokeStyle = 'white';// context.moveTo(x3*30+15,30+y3*30); context.lineTo(45+x3*30,30+y3*30); context.clearRect(x3*30+16, 29+y3*30,28,2);// context.stroke(); } }while(search(0)!=search(aa*aa-1))//主要思路 {var num = parseInt(Math.random() * aa*aa );//產生一個小于196的隨機數var neihbour=getnei(num);if(search(num)==search(neihbour)){continue;}else//不在一個上 { isling[num][neihbour]=1;isling[neihbour][num]=1; drawline(num,neihbour);//劃線 union(num,neihbour); } }</script></html>
實現效果:


方塊移動
這部分我采用的方法不是動態真的移動,而是一格一格的跳躍。也就是當走到下一個格子將當前格子的方塊擦掉,在移動的那個格子中再畫一個方塊。選擇方塊是因為方塊更方便擦除,可以根據像素大小精準擦除。

另外,再移動中要注意不能穿墻、越界。那么怎么判斷呢?很好辦,我們再前面會判斷兩個格子是否聯通,如果不連通我們將把這個墻拆開。再拆的時候把這個墻的時候記錄這兩點拆墻可走即可(數組)

另外,事件的監聽上下左右查一查就可以得到,添加按鈕對一些事件監聽,這些不是最主要的。

為了豐富游戲可玩性,將方法封裝,可以設置關卡(只需改變迷宮大小)。這樣就可以實現通關了。另外,如果寫成動態存庫那就更好了。

結語

在線嘗試地址,代碼直接查看網頁源代碼即可!

掃描下方二維碼,看作者大大原文~



福利 掃描添加小編微信,備注“姓名+公司職位”,入駐【CSDN博客】,加入【云計算學習交流群】,和志同道合的朋友們共同打卡學習!


推薦閱讀:

總結

以上是生活随笔為你收集整理的我花了一夜用数据结构给女朋友写个H5走迷宫游戏 | CSDN 博文精选的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天看天天爽 | 国产91视频播放 | 在线免费看污视频 | 成年人午夜免费视频 | 黄色大片网 | 国产精品久久在线观看 | 狠狠操在线播放 | 中文字幕观看在线 | 国产乱了高清露脸对白 | 扒开jk护士狂揉免费 | 日日干日日摸 | 97超碰人人看 | 九月激情网 | 国产成年无码久久久久毛片 | 欧美黑人性xxx猛交 少妇无套内谢久久久久 | 亚洲一区二区在线免费 | 好吊色一区二区三区 | av天堂一区 | 国产成人精品一区二区 | 99久久久久无码国产精品 | 亚洲国产成人精品视频 | 日韩激情影院 | 粉嫩av.com| 新版天堂资源中文8在线 | 乌克兰av在线 | 娇小激情hdxxxx学生 | 国产中文字幕在线免费观看 | 激情一区 | 韩国中文字幕hd久久精品 | 免费一级特黄特色毛片久久看 | 99自拍视频 | 亚洲艹 | 色网站在线看 | 久久精品一二三 | 国精品无码一区二区三区 | 国产精品久久久久三级 | 天天爱夜夜爱 | 日本做爰三级床戏 | 久久久综合| 国产熟女一区二区丰满 | 欧美精品色呦呦 | 亚洲精品电影院 | 午夜久久 | 国产精品电影网站 | 日批黄色| 国模吧无码一区二区三区 | 日韩免费黄色 | 久久天堂视频 | 91日韩在线 | 国产女人和拘做受视频免费 | 日日日噜噜噜 | 游戏涩涩免费网站 | 日日夜夜操视频 | 林天顾悦瑶笔趣阁 | 内射毛片内射国产夫妻 | 四川丰满妇女毛片四川话 | 91插插插影库永久免费 | 二区三区免费 | 男女交性视频 | 日日干夜夜干 | 黄色爱爱视频 | av手机免费看 | 国产精品情侣 | 亚洲天堂五月 | 国产又爽又黄游戏 | 黄片毛片在线看 | 天天综合干 | 亚洲色图35p | 最近中文字幕 | 成人激情小视频 | sese综合| 国产性av | 超碰人人91 | 成年网站免费在线观看 | 亚洲区久久 | 亚洲黑丝在线 | 夜夜看| 日本成人三级电影 | 91夜色视频 | 福利小视频在线 | 亚洲国产精品99久久久久久久久 | 最新不卡av | 美日韩视频| 中文字幕有码无码人妻av蜜桃 | av在线视 | 永久免费看片在线播放 | 性视频一区 | 日韩av电影一区 | av在线片| 日本成人午夜视频 | 日批网址 | 免费黄视频在线观看 | 免费萌白酱国产一区二区三区 | 日韩精品欧美激情 | 久久精品国产大片免费观看 | 男生舔女生的屁股 | 欧美在线一二三区 | 看全黄大色黄大片美女人 | 日韩成人免费在线视频 |