微信小程序?qū)崿F(xiàn)掃雷游戲
本文實例為大家分享了微信小程序?qū)崿F(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
實驗小提醒,打開微信小程序模板時,一定要看清楚,要選js模板,不要選ts模板,因為ts中對數(shù)據(jù)類型檢查更嚴格,同樣的代碼在ts中可能無法運行!
實驗內(nèi)容:
編寫如下掃雷游戲,基本要求如下:
(1)方塊數(shù)為10行7列;
(2)有游戲計時(計時單位為秒);
(3)有一個“開始游戲”按鈕,按該按鈕能重新開始一局游戲。
可依據(jù)個人能力自由發(fā)揮點:
(1)讓玩家可以自由設(shè)定方塊數(shù);
(2)讓玩家可以自由設(shè)定地雷數(shù);
實驗效果:
程序優(yōu)勢:
1、必須點擊開始游戲,才能點擊方塊,避免用戶誤碰影響玩的體驗
2、游戲玩到中途,可以新開一局,也可以在點擊新開一局后,點擊取消,繼續(xù)玩
3、可以點擊設(shè)置,設(shè)置行數(shù),列數(shù)或者地雷數(shù)任意一個參數(shù),游戲怎么玩兒,由你定
代碼目錄:
這里面index目錄下面四個文件,放的是掃雷相關(guān)的代碼; 而setUp目錄中的四個文件放的是設(shè)置頁面相關(guān)的代碼!
實驗代碼:
index目錄下的代碼文件
index.wxml
<!--index.wxml--> <view class="time"> ? <view class="using-time">當(dāng)前用時:{{timeformat}}</view> ? ?<view class="start-game" bindtap="start"> 開始游戲 </view> ? ? </view> <view bindtap="setUp" class="set-up">設(shè)置</view> <view class="main"> ? <view wx:for="{{bts}}" wx:for-item="itemRow" class="yy">? ? ? <view wx:for="{{itemRow}}" wx:for-item="bt" class="xx" id="{{bt.id}}" style="background-color:{{bt.bgcolor}};color:{{bt.ftcolor}}" bindtap="click"> ? ? ? ?{{bt.text}} ? ? </view> ? </view> </view>
index.js
Page({ ? data: { ? ? bts: null, //9*6數(shù)組 ?54個方塊,根方塊有關(guān)的屬性全部存儲起來 ? ? timer:null, ? ? hour:0, ? ? minute:0, ? ? second:0, ? ? timeformat:'00:00:00', ? ? clickButton:false, ? ? cancelButton:false ? }, ? ?start:function(){ ? ? var that=this ? ? clearInterval(that.data.timer); ? ? ?wx.showModal({ ? ? ? ? title:'提示', ? ? ? ? content:'開始游戲', ? ? ? ?showCancel:true, ? ? ? ? ? ? ? ? 如何讓用戶點擊取消按鈕后,還能繼續(xù)玩(已解決) ? ? ? ? success(res){ ? ? ? ? ? // 剛開局點擊取消后,什么也不做 ? ? ? ? ? if(res.cancel ){ ? ? ? ? ? ? if(!that.data.cancelButton){ ? ? ? ? ? ? ? }else{ ? ? ? ? ? ? ?that.data.timer = setInterval(that.counter,1000) ? ? ? ? ? ? } ? ? ? ? ? ? ? // 點擊確定后,初始化界面,并回調(diào)時間函數(shù) ? ? ? ? ? }else{ ? ? ? ? ? ? that.data.cancelButton = true ? ? ? ? ? ? that.init() ? ? ? ? ? ? // clearInterval(this.data.timer) ? ? ? ? ? ? that.data.timer = setInterval(that.counter,1000) ? ? ? ? ? ? that.data.clickButton = true ? ? ? ? ? } ? ? ? ? }? ? ?? ? ? ?}) ? ? ? ? ? ?? ? ?}, ? ? second:'', ? ? minute:'', ? ? hour:'', ? ?counter:function(){ ? ? ?var second = this.data.second ? ? ?var minute = this.data.minute ? ? ?var hour = this.data.hour ? ? ?this.setData({ ? ? ? ?second:second+1 ? ? ?}) ? ? ?if(second == 60){ ? ? ? ?this.setData({ ? ? ? ? ?second:0, ? ? ? ? ?minute:minute+1 ? ? ? ?}) ? ? ?} ? ? ?if(minute == 60){ ? ? ? ?this.setData({ ? ? ? ? ?minute:0, ? ? ? ? ?hour:hour+1 ? ? ? ?}) ? ? ?} ? ? ?// 下面三個全局變量用于保證時間格式 ? ? ?this.second = second ? ? ?this.minute = minute ? ? ?this.hour = hour ? ? ?if(second < 10){ ? ? ? ?this.second="0"+second ? ? ?} ? ? ?if(minute < 10){ ? ? ? ?this.minute = "0"+minute ? ? ?} ? ? ?if(hour < 10){ ? ? ? ?this.hour="0"+hour ? ? ?} ? ? ?? ? ? ?this.setData({ ? ?? ? ? ? ?timeformat:this.hour+":"+this.minute+":"+this.second ? ? ?}) ? ?}, ? ?// 跳轉(zhuǎn)到設(shè)置頁面的函數(shù) ? ? setUp:function () { ? ? ? wx.navigateTo({ ? ? ? ? url: '../index/setUp/setUpPage', ? ? ? }) ? ? ? // 設(shè)置完以后應(yīng)該重新開始游戲 ? ? ? this.defaultRow = 10 ? ? ? this.defaultColumn = 7 ? ? ? this.defaultDilei = 10 ? ? ? this.init() ? ? }, ? ? // 設(shè)置默認數(shù)據(jù),用戶不設(shè)置也能玩 ? ?defaultRow:10, ? ?defaultColumn:7, ? ?defaultDilei:10, ? //初始化函數(shù) ? init: function () { ? ? //初始化時間 ? ? this.counter() ? ? ? ?// 下面代碼用于獲取全局變量數(shù)據(jù)(只能函數(shù)中用) ? ? var app = getApp() ? ? var setRow = app.globalData.row ? ? var setColumn = app.globalData.column ? ? var setDilei = app.globalData.dilei ? ? ? this.setData({ ? ? ? hour:0, ? ? ? minute:0, ? ? ? second:0, ? ? ? timeformat:"00"+":"+"00"+":"+"00" ? ? }) ? ? ? // 檢查用戶修改了哪方面數(shù)據(jù) ? ? if(typeof(setRow) != 'undefined'){ ? ? ? this.defaultRow = setRow ? ? } ? ? if(typeof(setColumn) != 'undefined'){ ? ? ? this.defaultColumn = setColumn ? ? } ? ? if(typeof(setDilei) != 'undefined'){ ? ? ? this.defaultDilei = setDilei ? ? } ? ? ? //生成指定行和列的方塊數(shù)組,并初始化 ? ? var ds = new Array() ? ? for (var i = 0; i <this.defaultRow; i++) { ? ? ? ds[i] = new Array(); ? ? ? for (var j = 0; j < this.defaultColumn; j++) { ? ? ? ? ds[i][j] = { ? ? ? ? ? id: "" + i + j, //方塊id ? ? ? ? ? bgcolor: "yellow", //方塊背景色 ? ? ? ? ? ftcolor: "red", //方塊文字顏色 ? ? ? ? ? text: "", //方塊顯示的文本信息 ? ? ? ? ? dilei: 0 //方塊下是否有雷 0:無雷,1有雷 ? ? ? ? } ? ? ? } ? ? } ? ? this.data.bts=ds; ? ? //隨機產(chǎn)生地雷 ? ? for (var v = 0; v < this.defaultDilei; v++) { ? ? ? var i = Math.floor(Math.random() * (this.defaultRow-1)) ? ? ? var j = Math.floor(Math.random() * (this.defaultColumn-1)) ? ? ? this.data.bts[i][j].dilei = 1 ? ? ? this.data.bts[i][j].text = "" ? ? ? this.data.bts[i][j].ftcolor = "red" ? ? } ? ? this.setData({ bts: this.data.bts }) ? ? this.data.clickButton = false ? ? ?clearInterval(this.data.timer) ? }, ? onLoad: function () { ? ? this.counter() ? ? this.init()? ? ?? ? }, ? countDilei:function(i,j){ ? ? ?var N=0 ? ? ?if(i>0 && j>0) N=N+this.data.bts[i-1][j-1].dilei//左上? ? ? ?if(i>0) N=N+this.data.bts[i-1][j].dilei//上 ? ? ?if(i>0 && j<this.defaultColumn-1) N=N+this.data.bts[i-1][j+1].dilei //右上 ? ? ?if(j>0) N=N+this.data.bts[i][j-1].dilei//左 ? ? ?if(j<this.defaultColumn-1) N=N+this.data.bts[i][j+1].dilei//右 ? ? ?if(i<this.defaultRow-1 && j>0) N=N+this.data.bts[i+1][j-1].dilei ? ? ?if(i<this.defaultRow-1) N=N+this.data.bts[i+1][j].dilei ? ? ?if(i<this.defaultRow-1 && j<this.defaultColumn-1) N=N+this.data.bts[i+1][j+1].dilei ? ? ?return N; ? }, ? aotoClick: function (i, j) { ? ? var n = this.countDilei(i, j) ? ? //無論周圍是否有雷都首先將當(dāng)前翻開,這樣遞歸才可以作為條件判斷 ? ? this.data.bts[i][j].bgcolor = "white" ? ? this.data.bts[i][j].ftcolor = "blue" ? ? //再根據(jù)周圍是否有雷決定是否遞歸 ? ? if (n != 0) { ? ? ? this.data.bts[i][j].text = n ? ? }else{//三個條件:存在、未翻開、不是雷 ? ? ? if (i > 0 && j > 0 && this.data.bts[i - 1][j - 1].bgcolor == "yellow" && this.data.bts[i - 1][j - 1].dilei != 1) this.aotoClick(i - 1, j - 1) //左上? ? ? ? if (i > 0 && this.data.bts[i - 1][j].bgcolor == "yellow" && this.data.bts[i - 1][j].dilei != 1) this.aotoClick(i - 1, j) //上 ? ? ? if (i > 0 && j < this.defaultColumn-1 && this.data.bts[i - 1][j + 1].bgcolor == "yellow" && this.data.bts[i - 1][j + 1].dilei != 1) this.aotoClick(i - 1, j + 1) //右上 ? ? ? if (j > 0 && this.data.bts[i][j - 1].bgcolor == "yellow" && this.data.bts[i][j - 1].dilei != 1) this.aotoClick(i, j - 1) //左 ? ? ? if (j < this.defaultColumn-1 && this.data.bts[i][j + 1].bgcolor == "yellow" && this.data.bts[i][j + 1].dilei != 1) this.aotoClick(i, j + 1) //右 ? ? ? if (i < this.defaultRow-1 && j > 0 && this.data.bts[i + 1][j - 1].bgcolor == "yellow" && this.data.bts[i + 1][j - 1].dilei != 1) this.aotoClick(i + 1, j - 1) ? ? ? if (i < this.defaultRow-1 && this.data.bts[i + 1][j].bgcolor == "yellow" && this.data.bts[i + 1][j].dilei != 1) this.aotoClick(i + 1, j) ? ? ? if (i <this.defaultRow-1 && j <this.defaultColumn-1 && this.data.bts[i + 1][j + 1].bgcolor == "yellow" && this.data.bts[i + 1][j + 1].dilei != 1) this.aotoClick(i + 1, j + 1) ? ? } ? } ? , ? click: function (e) { ? ? ? ?//要求用戶必須點擊開始游戲 才能開始玩 ? ? if(this.data.clickButton == false){ ? ? ? wx.showModal({ ? ? ? ? title:'提示', ? ? ? ? content:'請點擊開始游戲,才能玩', ? ? ? ?? ? ? ? }) ? ? ? return ? ? } ? ? //找到點擊位置 ? ? var ds = e.target.id? ? ? var i = Number(ds.substr(0, 1)) ? ? var j = Number(ds.substr(1, 2)) ? ? ? ? ? // this.data.bts[i][j].bgcolor="white" ? ? // this.data.bts[i][j].text="" ? ? // // this.data.bts[i][j].ftcolor="" ? ? //如果點到地雷 ? ? if (this.data.bts[i][j].dilei == 1) { ? ? ? this.data.bts[i][j].bgcolor="white" ? ? ? this.data.bts[i][j].text="*" ? ? ? this.data.bts[i][j].ftcolor="red" ? ? ? wx.showModal({ ? ? ? ? title: '提示', ? ? ? ? content: '你點到地雷了,游戲結(jié)束!'+'\n'+'所用時間為:'+this.data.timeformat, ? ? ? ? }) ? ?? ? ? ? ? clearInterval(this.data.timer) ? ? ? this.init() ? ? ? }else{ //沒點到地雷 ? ? ? this.aotoClick(i,j)//開始遞歸當(dāng)前的周圍 ? ? ? //每次點擊后都檢查是否勝利 ? ? ? if(this.isVictory()==true){ ? ? ? ? wx.showModal({ ? ? ? ? ? title: '提示', ? ? ? ? ? content: '恭喜你翻開所有地雷!', ? ? ? ? }) ? ? ? ? this.init() ? ? ? ? } ? ? } ? ? this.setData({ bts: this.data.bts }) ? ? ? }, ? isVictory:function(){ ? ? var flag = true; ? ? for (var i = 0; i < this.defaultRow; i++) { ? ? ? for (var j = 0; j < this.defaultColumn; j++) {? ? ? ? ? if(this.data.bts[i][j].dilei==0 && this.data.bts[i][j].bgcolor=="yellow")? ? ? ? ? { ? ? ? ? ? flag=false ? ? ? ? ? break ? ? ? ? } ? ? ? } ? ? } ? ? return flag ? } })
index.wxss
.main{ ? ? ? display: flex; ? ? ? flex-direction: column; ? ? ? border: 1px solid black; ? ? } ? ? ?.yy{ ? ? ?display: flex; ? ? ?flex-direction: row; ? ?} ? .xx{ ? ? border: 1px solid black; ? ? width: 100%; ? ? height: 60px; ? ? margin: 2px; ? ? text-align: center; ? ? line-height: 60px; ? ? font-size: 35px; ? } ? ?.time{ ? ? ?display: flex; ? ? ?background: blueviolet; ? ? ?padding-left: 2vw; ? ? ?height: 7vh; ? ? ?line-height: 7vh; ? ?} ? ?.using-time{ ? ? ?width: 150px; ? ? ?font-weight: 700; ? ?} ? ?.start-game{ ? ? ?/* position: relative; */ ? ? ?font-size: 15px; ? ? ?padding-left: 80px; ? ? ?font-weight: 700; ? ? ?color: rgb(63, 204, 34); ? ?} ? ?.set-up{ ? ? ?padding-left: 85vw; ? ? ?margin-bottom: 2vh; ? ? ?height: 20px; ? ? ? ? ?}
setUp目錄下的代碼文件
setUp.wxml (微信中所有頁面代碼它默認名叫 index.wxml,不用管它)
<!--index.wxml--> ? <label class="title">你可以只設(shè)置一個數(shù)據(jù),其他數(shù)據(jù)為系統(tǒng)默認數(shù)據(jù)</label> <view class="firstNum"> ? ? <!-- <text>請輸入第一個運算數(shù):</text> --> ? ? <label class="text" >請輸入方塊數(shù)的行數(shù): </label> ? ? <input type="digit" bindinput="input1" ? ? style=" border: 2rpx solid #ccc; width:150px; ?margin-left: 5px; "/> </view> <view class="secondNum"> ? ? <text class="text">請設(shè)置方塊數(shù)的列數(shù):</text> ? ? <input type="digit" bindinput="input2" ? ? style=" border: 2rpx solid #ccc; width:150px; ?margin-left: 5px;"/> </view> <view class="dilei"> ? ? <text class="text">請設(shè)置地雷數(shù):</text> ? ? <input type="digit" bindinput="input3" ? ?style=" border: 2rpx solid #ccc; width:150px; ?margin-left: 5px;"/> </view> ? <button bindtap="jump" class="jump">確定</button>
setUp.js
// index.js ? const app = getApp() ? Page({ ? // data: { ? // ? ? num1: 0, ? // ? ? num2: 0, ? // ? ? result: 0 ? // }, ? ? ? ? input1(e) { ? ? ? ? // 下面代碼將本頁面數(shù)據(jù)傳給全局變量 ? ? ? ? // var app = getApp() ? ? ? ? app.globalData.row = e.detail.value ? ? ? // this.setData({ ? ? ? // ? ? ? ? num1: parseFloat(e.detail.value) ? ? ? // ? ? }) ? ? ? ? ?? ? }, ? ? ?input2(e) { ? ? ? app.globalData.column = e.detail.value ? ? ? // this.setData({ ? ? ? // ? ? ? ? num2: parseFloat(e.detail.value) ? ? ? // ? ? }) ? }, ? ? input3(e){ ? ? ? app.globalData.dilei = e.detail.value ? ? }, ? ? jump:function(){ ? ? ? wx.navigateTo({ ? ? ? ? url: '../index' ? ? ? }) ? } ? })
setUp.wxss
/**index.wxss**/ .text{ ? font-size: 13px; ? font-weight: 600; } .firstNum, .secondNum { ? margin: 50rpx; ? display: flex; ? flex-direction: row; ? height:50px; } .dilei{ ? ?display: flex; ? ?font-size: 13px; ? ?font-weight: 600; ? ?padding-left: 18vw; } ? .jump{ ? background: rgb(204, 19, 221); ? margin-top: 50px; } .title{ ? font-size: 13px; ? color:crimson; ? padding-left: 6vw; }
由于涉及頁面?zhèn)鬟f數(shù)據(jù),所以還有一個app代碼
app.js
// app.js App({ ? globalData:{ ? ? ? row:0, ? ? ? column:0, ? ? ? dilei:0 ? }, ? onLaunch() { ? ? // 展示本地存儲能力 ? ? const logs = wx.getStorageSync('logs') || [] ? ? logs.unshift(Date.now()) ? ? wx.setStorageSync('logs', logs) ? ? ? // 登錄 ? ? wx.login({ ? ? ? success: res => { ? ? ? ? // 發(fā)送 res.code 到后臺換取 openId, sessionKey, unionId ? ? ? } ? ? }) ? }, ? globalData: { ? ? userInfo: null ? } })
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
window.event.srcElement 得到事件源對象
window.event.srcElement 得到事件源對象代碼,大家可以參考腳本之家以前發(fā)的代碼,多瀏覽兼容的。2009-05-05JavaScript Tips 使用DocumentFragment加快DOM渲染速度
大家在開發(fā)JavaScript應(yīng)用的時候,如果遇到這種大量節(jié)點的情況,不妨將DocumentFragment作為一個備選的方案。2010-06-06使用?Angular?服務(wù)器端渲染?Transfer?State?Service
這篇文章主要介紹了使用?Angular?服務(wù)器端渲染?Transfer?State?Service,假設(shè)我們使用?Angular?Universal?開發(fā)一個服務(wù)器端渲染的?Angular?應(yīng)用,這個應(yīng)用會消費一個第三方的?Restful?API2022-06-06echarts幾個公司內(nèi)部數(shù)據(jù)可視化圖表必收藏
最近公司有一個需求,要做一個數(shù)據(jù)可視化的頁面,所有的圖表都在下面,做這些都是本人自己寫的,全部都是真是的項目中的代碼,包含有柱狀圖、折線圖、水球圖以及散點圖,這里直接打出來給大家練手,希望大家多多支持,如果這篇文章對您有用的話必須收藏2022-08-08