微信小程式 實現最簡單的漢諾塔

2022-09-19 00:06:10 字數 3140 閱讀 1662

目錄遊戲介面

實現效果

其他遇到的坑

實現漢諾塔,主要需要實現的乙個功能是 元素元件的拖拽,關於元素拖拽在這篇部落格中已經有描述:

接下來就是把各式各樣的拖動後的邏輯 將其實現,然後體現在介面上;

首頁元素:

一張標題

輸入框開始遊戲 按鈕

實現功能:

輸入個數,然後點選按鈕跳轉到漢諾塔介面,生成相應資料量的木條數

xwml **

}

表單提交
formsubmit(e) )

}

介面元素:

操作次數

三個區域

木條(stick)

返回按鈕

實現功能:

木條初始化,擺放

木條拖拽

木條拖拽後校驗是否可放入指定位置

操作次數累計

遊戲完成校驗

wxml

操作次數:}

} }}

返回

id="item}" data-id="}" data-index="}"用於事件處理時能找到木條id資料

js 初始化資料

data: ,
js 生成初始化木條
onload: function (options) )

})var tempsticklist = ;

var tempstickidinlist = ;

// 構造木條

for (var i = 0; i < options.count; i++) ;// id、寬度20遞減、高度25、bottompos位置0->25->50;木條名稱

tempsticklist.push(stick);

tempstickidinlist.push(1);// 一開始 都在 1 : lsita

}this.setdata()

},

js木條拖動
// 開始觸控

touchstart: function (e)

else if (this.data.stickidinlist[id] == 3)

// 校驗拖動的是不是頂部木條

if (tempsticklist[tempsticklist.length - 1].id != id) )

console.log("can not move, because it is not top stick");

return

}tempdargoriginbottompos = tempsticklist[tempsticklist.length - 1].bottompos; // 獲取原始bottom座標值

// 準備好開始觸控的資訊

this.setdata();

},// 觸控移動

touchmove: function (e) );

},// 觸控結束

touchend: function (e)

else if (this.data.movefromlist == 3)

var sticklen = tempoldsticklist[tempoldsticklist.length - 1].width;

var stickmidposx = this.data.movingposx + sticklen / 2.0; // 得到中心位置

var _this = this;

var inlist = this.data.movefromlist;

// 可以放入的區域

if (stickmidposx < this.data.screenwidth / 3.0) // 放置在左側

else if (stickmidposx < this.data.screenwidth * 2.0 / 3.0 && this.data.screenwidth / 3.0 <= stickmidposx) // 放置在中間

else // 放置在 右側

// 資料恢復

this.setdata();

// 檢查是否完成

this.checkfinish()

},

其餘函式
// 根據木條id查詢當前(觸控的)木條的資訊,並更新

querymultiplenodes: function (id) )

})},

// 木條的移動,將stick從oldlist取出,放入newsticklist,並計算得到新的bottompos

movesticklist: function (oldlist, newlist, oldsticklist, newsticklist)

else

else

}var tempstickidinlist = this.data.stickidinlist;

tempstickidinlist[this.data.movingid] = newlist;

if (oldlist == 1) )

} else if (oldlist == 2) )

}else if (oldlist == 3) )

}if (newlist == 1) )

} else if (newlist == 2) )

}else if (newlist == 3) )

}var opcount = this.data.operatecount + 1;

this.setdata()

},// 檢查是否完成

漢諾塔的實現

漢諾塔是大學遇見的第乙個使用遞迴的問題。這個問題的解決方法充分展示了遞迴給程式帶來的遍歷 如果不使用遞迴的話,那麼就需要細緻的分析。這裡不談非遞迴的解法。漢諾塔問題介紹 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時...

漢諾塔的實現

漢諾塔的演算法就3個步驟 第一,把a上的n 1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第三,因為n 1個盤全在b上了,所以把b當做a重複以上步驟就好了。所以演算法看起來就簡單多了。不過,思考過程還是很痛苦的,難以理解。遞迴中會儲存資料的好處在這裡又得到體現,太神奇了。include in...

漢諾塔的java實現

漢諾塔問題描述 假設有三個命名為x tower 1 y tower 2 z tower 3 的塔座,在塔座x上有n個直徑大小各不相同,依次從小到大編號為1,2,3,n的圓盤。現要求將x塔座上的n個圓盤移到z塔座上並按同樣順序疊排,圓盤移動時必須遵循下列規則 1 每次只能移動乙個圓盤 2 圓盤可以插在...