close

「連連看」是源自台灣的桌面小遊戲,自從流入大陸以來風靡一時,也吸引眾多程序員開發出多種版本的「連連看」。「連連看」考驗的是各位的眼力,在有限的時間內,只要把所有能連接的相同圖案,兩個一對地找出來,每找出一對,它們就會自動消失,只要把所有的圖案全部消完即可獲得勝利。所謂能夠連接,指得是:無論橫向或者縱向,從一個圖案到另一個圖案之間的連線不能超過兩個彎,其中,連線不能從尚未消去的圖案上經過。


連連看遊戲的規則總結如下:

● 兩個選中的方塊是相同的。

● 兩個選中的方塊之間連接線的折點不超過兩個。(連接線由x軸和y軸的平行線組成)。

本章開發連連看遊戲,遊戲效果如圖10-1所示。


■圖10-1 連連看運行界面


本遊戲增加智能查找功能,當玩家自己無法找到時,可以右鍵單擊畫面,則會出現提示可以消去的兩個方塊(被加上紅色邊框線)。


01

程序設計的步驟


1. 設計點類Point


點類Point比較簡單,主要存儲方塊所在棋盤坐標(x,y)。

//定義坐標點類functionPoint(_x, _y) {this.x = _x;this.y = _y;}

2. 設計遊戲主邏輯


整個遊戲在Canvas對象中進行,在頁面加載時調用create_map( )實現將圖標圖案隨機放到地圖中,地圖map中記錄的是圖案的數字編號。最後調用print_map()按地圖map中記錄圖案信息將圖10-2中圖標圖案繪製在Canvas對象中,生成遊戲開始的界面。同時綁定Canvas對象觸屏開始事件,對玩家觸屏操作做出反應。
varmap = [];varSelect_first = false; //是否已經選中第一塊varlinePointStack = []; //存儲連接的折點棋盤坐標varHeight = 12;varWidth = 10;varp1, p2; //存儲選中第一塊,第二塊方塊對象坐標/*** 生命周期函數--監聽頁面加載*/onLoad: function(options) {//創建畫布上下文this.init(); //初始化地圖, 將地圖中所有方塊區域位置置為空方塊狀態this.create_map() ; //生成隨機地圖this.print_map(); //輸出map地圖this.ctx = wx.createCanvasContext('myCanvas')this.ctx.draw();},init: function() {//初始化地圖, 將地圖中所有方塊區域位置置為空方塊狀態for(varx = 0; x < Width; x++) {map[x] = newArray();for(vary = 0; y < Height; y++) {map[x][y] = " "; //" "表示空的}}},

3. 編寫函數代碼


print_map( )按地圖map中記錄圖案信息將圖10-2中圖標圖案顯示在Canvas對象中,生成遊戲開始的界面。

/***按地圖map中記錄圖案信息將圖標圖案顯示在Canvas對象中,生成遊戲開始的界面。*/print_map: function() { //輸出map地圖letctx = this.ctxfor(varx = 0; x < Width; x++)for(vary = 0; y < Height; y++)if(map[x][y] != ' ') {varimg1 = '/images/'+ map[x][y] + ".jpg";//ctx.drawImage('/images/4.jpg', 50 * i, 50, 50, 50)ctx.drawImage(img1, 25* x, 25* y, 25, 25);}},

用戶在窗口中上單擊時,由屏幕像素坐標(e.touches[0].x, e.touches[0].y)計算被單擊方塊的地圖棋盤位置坐標(x,y)。判斷是否是第一次選中方塊,是則僅僅對選定方塊加上紅色示意框線。如果是第二次選中方塊,則加上黑色示意框線,同時要判斷是否圖案相同且連通。假如連通則畫選中方塊之間連接線。

Canvas對象觸屏事件則調用智能查找功能find2Block()。

find2Block: function(){ #自動查找…… //見前文程序設計的思路}

Canvas對象觸屏開始事件代碼。

touchStart: function(e) {varx = Math.floor(e.touches[0].x / 25);vary = Math.floor(e.touches[0].y / 25);letctx = this.ctx;varpair=false; //是否配對成功this.print_map(); //輸出map地圖console.log("clicked at"+ x + ","+ y);if(map[x][y] == " ")console.log("提示此處無方塊");else{if(Select_first == false) {p1 = newPoint(x, y);//畫選定(x1,y1)處的框線ctx.setStrokeStyle("red");ctx.strokeRect(x * 25, y * 25, 25, 25);Select_first = true;} else{p2 = newPoint(x, y);//判斷第二次單擊的方塊是否已被第一次單擊選取,如果是則返回。if((p1.x == p2.x) && (p1.y == p2.y))return;//畫選定(x2,y2)處的框線console.log('第二次單擊的方塊'+ x + ', '+ y)ctx.strokeRect(x * 25, y * 25, 25, 25);if(this.IsSame(p1, p2) && this.IsLink(p1, p2)) { //判斷是否連通console.log('連通'+ x + ', '+ y);Select_first = false;//畫選中方塊之間連接線 this.drawLinkLine(p1, p2);map[p1.x][p1.y] = ' '; //清空記錄地圖中第1個方塊map[p2.x][p2.y] = ' '; //清空記錄地圖中第2個方塊pair=true; //配對成功,定時0.5秒後刷新屏幕 linePointStack=[];if(this.isWin()) { //遊戲結束console.log("遊戲結束,你通關了!!");}} else{ //不能連通則取消選定的2個方塊 Select_first = false;}}}ctx.draw();if(pair) { //配對成功this.print_map(); //重新輸出map地圖//定時0.5秒後刷新屏幕setTimeout(function() { ctx.draw();}, 500); //過半秒}},

IsSame(p1,p2)判斷p1 ( x1, y1)與p2(x2, y2)處的方塊圖案是否相同。

IsSame: function(p1, p2) {if(map[p1.x][p1.y] == map[p2.x][p2.y]) {console.log("clicked at IsSame");returntrue;}returnfalse;},

以下是畫方塊之間連接線的方法。

drawLinkLine(p1,p2)繪製(p1,p2)所在2個方塊之間的連接線。判斷linePointStack數組長度,如果為0,則是直接連通。linePointStack數組長度為1,則是一折連通,linePointStack存儲是一折連通的折點。linePointStack數組長度為2,則是2折連通,linePointStack存儲是2折連通的兩個折點。

drawLinkLine: function(p1, p2) { //畫連接線console.log("折點數"+ linePointStack.length);if(linePointStack.length == 0) //直線聯通this.drawLine(p1, p2);if(linePointStack.length == 1) { //一折連通varz = linePointStack.pop();console.log("一折連通點z"+ z.x + z.y);this.drawLine(p1, z);this.drawLine(p2, z);}if(linePointStack.length == 2) { //2折連通varz1 = linePointStack.pop()//print("2折連通點z1",z1.x,z1.y)this.drawLine(p2, z1)varz2 = linePointStack.pop()//print("2折連通點z2",z2.x,z2.y)this.drawLine(z1, z2);this.drawLine(p1, z2);}},

drawLinkLine(p1,p2)繪製(p1,p2)之間的直線。

drawLine: function(p1, p2) { //繪製(p1, p2)之間的直線letctx = this.ctx;ctx.beginPath();ctx.moveTo(p1.x * 25+ 12, p1.y * 25+ 12);ctx.lineTo(p2.x * 25+ 12, p2.y * 25+ 12);ctx.stroke();},

IsWin()檢測是否尚有非未被消除的方塊,即地圖map中元素值非空(" "),如果沒有則已經贏得了遊戲。

/***#檢測是否已經贏得了遊戲*/isWin: function(){//檢測是否尚有非未被消除的方塊//(非BLANK_STATE狀態)for(vary = 0; y < Height; y++)for(varx = 0; x < Width; x++)if(map[x][y] != " ")returnfalse;returntrue;},

至此完成連連看遊戲。


往期精選



★ 微信小程序遊戲開發|猜數字小遊戲(附源碼+視頻)

★ 微信小程序遊戲開發|石頭剪刀布遊戲(附源碼)

★ 微信小程序遊戲開發|智力測試遊戲——button版(附源碼)


精彩預告



★微信小程序遊戲開發|搖一搖變臉遊戲

★微信小程序遊戲開發|接寶石箱子遊戲


02

參考書籍

《微信小程序遊戲開發快速入門到實戰》

ISBN:9787302572985

作者:夏敏捷、尚展壘

定價:89.80元


03

精彩推薦


微信小程序遊戲開發│猜數字小遊戲(附源碼+視頻)
Flink編程基礎│Scala編程初級實踐
Flink編程基礎│FlinkCEP編程實踐
Flink編程基礎│DataStream API編程實踐
Flink編程基礎│DataSet API編程實踐
數據分析實戰│客戶價值分析
數據分析實戰│價格預測挑戰
數據分析實戰│時間序列預測
數據分析實戰│KaggleTitanic生存預測


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()