WeChatアプレットがスネークゲームを実装

WeChatアプレットがスネークゲームを実装

この記事では、参考までに、スネークゲームを実装するためのWeChatアプレットの具体的なコードを紹介します。具体的な内容は次のとおりです。

1. プロジェクトのスクリーンショット

2. ソースコード

1. XML

コードは次のとおりです(例):

<ビュークラス='コンテナ'>
 <view class='content-bottom' bindtouchmove='touchMove' bindtouchstart='touchStart' bindtouchend='touchEnd'>
  <view wx:for="{{ground}}" wx:for-item="cols" class='ground-row'>
   <view wx:for="{{cols}}" class='ground-col'>
    <view class='block block{{item}}'></view>
   </ビュー>   
  </ビュー>
 </ビュー>
 <view class='content-top'>
  <view class='トップアイテムトップスコア'>
   <view class='score-description'>スコア</view>
   <view class='score-number'>{{score}}</view>
  </ビュー>
  <view class='top-item top-start' bindtap='goStart'>開始</view>
  <view class='トップアイテムトップスコア'>
   <view class='score-description'>史上最高</view>
   <view class='スコア番号'>{{最大スコア}}</view>
  </ビュー>
 </ビュー>
</ビュー>

2. WXSS

コードは次のとおりです(例):

/* ページ/デモ/snake/snake.wxss */
.コンテンツトップ{
 ディスプレイ: フレックス;
}
.トップアイテム{
 フレックス: 1;
 高さ: 150rpx;
 マージン: 0 20rpx;
 行の高さ: 150rpx;
 テキスト配置: 中央;
 境界線の半径: 16rpx;
}
.トップスタート{
 フォントサイズ: 22px;
 背景: deepskyblue;
 色: #fff;
}
.トップスコア{
 背景: #eee4da;
}
.スコアの説明 {
 行の高さ: 70rpx;
}
.スコア番号{
 行の高さ: 60rpx;
}
.コンテンツボトム{
 ディスプレイ: フレックス;
 flex-direction: 列;
 幅: 660rpx;
 高さ: 840rpx;
 マージン: 50rpx 自動 0;
}
.ground-row {
 ディスプレイ: フレックス;
}
.ground-col {
 フレックス: 1;
 幅: 30rpx;
 高さ: 30rpx;
}
。ブロック {
 幅: 100%;
 高さ: 100%;
 背景: #eee;
}
.ブロック1 {
 背景:黒;
 境界線の半径: 5px;
}
.ブロック2 {
 背景:赤;
 境界線の半径: 5px;
}

3.JS

コードは次のとおりです(例):

// ページ/デモ/snake/snake.js
ページ({

  /**
   * ページの初期データ */
  データ: {
  gameStart: false, // ゲームが開始されたかどうか score: 0, // 現在のスコア maxScore: 0, // 履歴の最高スコア isMaxActive: false,
  rows: 28, // 遊び場の行 cols: 22, // 遊び場の列 ground: [[]], // 遊び場のブロックの位置 snake: '', // ヘビの位置 food: [], // 食べ物の位置 startX: 0,
  開始Y: 0,
  終了X: 0,
  終了Y: 0,
  flag: 0, // ヘビの現在の移動方向。0 は右、1 は下、2 は左、3 は上。timer: null、
  モード非表示: true
  },

  /**
   * ライフサイクル機能 - ページの読み込みをリッスンする*/
  onLoad: 関数 (オプション) {
  this.initGround(this.data.rows, this.data.cols) // プレイグラウンドを初期化する console.log(wx.getStorageSync("MaxScore"))
  if (wx.getStorageSync("MaxScore")) {
   this.setData({
    最大スコア: wx.getStorageSync("最大スコア"),
    isMaxActive: 真
   })
  } それ以外 {
   this.setData({
    isMaxActive: 偽
   })
  }
  },

 goStart: 関数() {
  this.setData({
   ゲーム開始: true
  })
  onLoad() 関数
  this.initSnake(3) // ヘビの位置を初期化する this.initFood() // 食べ物を初期化する
  これを移動(0)
 },

 /**
  * プレイグラウンドを初期化する */
 initGround: 関数 (行、列) {
  this.data.ground = []
  (i = 0; i < 行; i++) の場合 {
   arr = [] とします
   this.data.ground.push(arr)
   (j = 0; j < cols; j++) の場合 {
    this.data.ground[i​​].push(0)
   }
  }
  this.setData({
   グラウンド: this.data.ground
  })
 },

 /**
  * スネークを初期化する */
 initSnake: 関数 (n) {
  this.data.snake = []
  (i = 0; i < n; i++ とします) {
   this.data.ground[0][i] = 1
   this.data.snake.push([0,i])
  }
  this.setData({
   グラウンド: this.data.ground、
   スネーク: this.data.snake
  })
 },

 /**
  * 食べ物を初期化する
  */
 initFood: 関数 () {
  row = Math.floor(Math.random()*this.data.rows) とします。
  col = Math.floor(Math.random() * this.data.cols) とします。
  var グラウンド = this.data.ground
  地面[行][列] = 2
  this.setData({
   地面: 地面、
   食べ物: [行、列]
  })
  console.log(このデータ食品)
 },

 /**
  * マウスのスライド方向を決定します */
 touchStart: 関数 (イベント) {
  this.data.startX = イベント.touches[0].pageX
  this.data.startY = イベント.touches[0].pageY
 },

 touchMove: 関数 (イベント) {
  this.data.endX = イベント.タッチ[0].ページX
  this.data.endY = イベント.touches[0].pageY
  // コンソールログ(this.data.endX、this.data.endY)
 },

 touchEnd: 関数 (イベント) {
  tX = this.data.endX ? (this.data.endX - this.data.startX) とします: 0
  tY = this.data.endY とします。(this.data.endY - this.data.startY) : 0
  コンソールログ(tX, tY)
  ゲーム開始時に
   偽を返す
  }
  if (tY < 0 && Math.abs(tX) <= Math.abs(tY)) { // 下にスライド this.data.flag = 3
  } else if (tY > 0 && Math.abs(tX) <= Math.abs(tY)) { // 上にスライド this.data.flag = 1
  } else if (tX < 0 && Math.abs(tX) > Math.abs(tY)) { // 左にスライド this.data.flag = 2
  } else if (tX > 0 && Math.abs(tX) > Math.abs(tY)) { // 右にスライド this.data.flag = 0
  }
  if(this.data.modalHidden){
   this.move(this.data.flag)
  }  
 },
 /**
  * ヘビが動く */
 移動: 関数 (状態) {
  クリア間隔(this.data.timer)
  // console.log(this.data.snake.length)
  var that = これ
  switch(state){ // スライド方向を決定する case 0:
    this.data.timer = setInterval(function(){
     that.moveRight()
    }, 600)
    壊す
   ケース1:
    this.data.timer = setInterval(関数() {
     that.moveBottom()
    }, 600)
    壊す
   ケース2:
    this.data.timer = setInterval(関数() {
     that.moveLeft()
    }, 600)
    壊す
   ケース3:
    this.data.timer = setInterval(関数() {
     that.moveTop()
    }, 600)
    壊す
  }
 },

 右へ移動: 関数 () {
  // コンソールログ(this.data.snake)
  var snakeArr = this.data.snake
  var snakeLen = snakeArr.length
  var snakeHead = snakeArr[snakeLen - 1]
  var snakeTail = snakeArr[0]
  var グラウンド = this.data.ground

  (var i = 0; i < snakeLen - 1; i++) の場合 {
   ヘビArr[i] = ヘビArr[i + 1]
  }

  var x = スネークヘッド[0]
  変数 y = スネークヘッド[1] + 1

  y >= this.data.cols の場合 {
   this.gameOver()
   戻る
  }

  snakeArr[snakeLen - 1] = [x, y]
  地面[x][y] = 1
  地面[ヘビの尾[0]][ヘビの尾[1]] = 0
  this.setData({
   ヘビ: ヘビArr、
   地面: 地面
  })
  this.checkGame(snakeTail, [x, y]) // ゲームオーバーかどうかをチェック
 },
 下へ移動: 関数 () {
  var snakeArr = this.data.snake
  var snakeLen = snakeArr.length
  var snakeHead = snakeArr[snakeLen - 1]
  var snakeTail = snakeArr[0]
  var グラウンド = this.data.ground

  (var i = 0; i < snakeLen - 1; i++) の場合 {
   ヘビArr[i] = ヘビArr[i + 1]
  }

  var x = スネークヘッド[0] + 1
  var y = スネークヘッド[1]

  (x >= this.data.rows) の場合 {
   this.gameOver()
   戻る
  }

  snakeArr[snakeLen - 1] = [x, y]
  地面[x][y] = 1
  地面[ヘビの尾[0]][ヘビの尾[1]] = 0
  this.setData({
   ヘビ: ヘビArr、
   地面: 地面
  })
  this.checkGame(snakeTail, [x, y]) // ゲームオーバーかどうかをチェック
 },
 左へ移動: 関数 () {
  var snakeArr = this.data.snake
  var snakeLen = snakeArr.length
  var snakeHead = snakeArr[snakeLen - 1]
  var snakeTail = snakeArr[0]
  var グラウンド = this.data.ground

  (var i = 0; i < snakeLen - 1; i++) の場合 {
   ヘビArr[i] = ヘビArr[i + 1]
  }

  var x = スネークヘッド[0]
  変数 y = スネークヘッド[1] - 1

  (y < 0)の場合{
   this.gameOver()
   戻る
  }

  snakeArr[snakeLen - 1] = [x, y]
  地面[x][y] = 1
  地面[ヘビの尾[0]][ヘビの尾[1]] = 0
  this.setData({
   ヘビ: ヘビArr、
   地面: 地面
  })
  this.checkGame(snakeTail, [x, y]) // ゲームオーバーかどうかをチェック
 },
 上へ移動: 関数 () {
  var snakeArr = this.data.snake
  var snakeLen = snakeArr.length
  var snakeHead = snakeArr[snakeLen - 1]
  var snakeTail = snakeArr[0]
  var グラウンド = this.data.ground

  (var i = 0; i < snakeLen - 1; i++) の場合 {
   ヘビArr[i] = ヘビArr[i + 1]
  }

  var x = スネークヘッド[0] - 1
  var y = スネークヘッド[1]

  (x < 0) の場合 {
   this.gameOver()
   戻る
  }

  snakeArr[snakeLen - 1] = [x, y]
  地面[x][y] = 1
  コンソールログ(y)
  地面[ヘビの尾[0]][ヘビの尾[1]] = 0
  this.setData({
   ヘビ: ヘビArr、
   地面: 地面
  })
  this.checkGame(snakeTail, [x, y]) // ゲームオーバーかどうかをチェック
 },

 /**
  * ゲームオーバーを確認
  * 壁にぶつかるとゲームオーバーとなり、再起動するかリロードするかを尋ねるポップアップボックスが表示されます。
  * 自分を攻撃するとゲームオーバー
  * 食べ物を食べる - ヘビの体が長くなり、食べ物を再生します*/
 checkGame: 関数 (snakeTail, snakeHead) {
  console.log("スネークの動きをテストする")
  コンソールログ(snakeHead)
  
  var snakeArrs = this.data.snake
  var len = this.data.snake.length
  var 食べ物 = this.data.food
  var グラウンド = this.data.ground

  console.log(this.data.snake[len-1])
  // 壁にぶつかったかどうかを判定します if (snakeHead[0] >= 0 & snakeHead[0] < this.data.rows & snakeHead[1] >= 0 & snakeHead[1] < this.data.cols)
  {   
   this.data.modalHidden = true
   this.collisionSnakeFood(snakeTail、snakeHead、food) の衝突
   this.setData({
    // スネーク: this.data.snakeArr,
    // グラウンド: this.data.ground,
    modalHidden: this.data.modaleHidden
   })
  } それ以外 {
   this.gameOver()
   戻る
  }
 },

 // 食べ物を叩くとゲームは続行されます collisionSnakeFood: function (tail, head, food) {
  snake = this.data.snake とします
  ground = this.data.ground とします。
  行をfood[0]とする
  col = food[1]とする
  スコア = this.data.score とします
  maxScore = this.data.maxScore とします
  (頭[0] === 食べ物[0] & 頭[1] === 食べ物[1]){
   地面[行][列] = 1
   ヘビの尾をシフト解除する
   地面[尾[0]][尾[1]] = 1
   this.initFood()
   スコア += 5
   if (!this.data.isMaxActive) {
    maxScore = スコア
   }
  }
  this.setData({
   ヘビ:ヘビ、
   地面: 地面、
   スコア: スコア、
   最大スコア: 最大スコア
  })
 },

 // ゲームオーバー gameOver: function () {
  クリア間隔(this.data.timer)
  _that = this とする
  maxS = this.data.maxScore とします。
  this.setData({
   モード非表示: false、
   タイマー: null
  })
  if (wx.getStorageSync("MaxScore")){
   hisScore = wx.getStorageSync("MaxScore") とします。
   (彼のスコア<maxS)の場合{
    wx.setStorageSync("MaxScore", maxS)
   }
  } それ以外 {
   wx.setStorageSync("MaxScore", maxS)
  }
  wx.showModal({
   タイトル: 「ゲームに失敗しました」
   内容: 「新しいゲームを再開するには[OK]をクリックします。ホームページに戻るには[キャンセル]をクリックします。」
   成功: function(res) {
    確認する場合
     _that.setData({
      スコア: 0,
      gameStart: false, // ゲームが開始したかどうか snake: '', // ヘビの位置 food: [], // 食べ物の位置 modalEdden: true
     })
     _that.onLoad()
    }
   }
  })
 },

  /**
   * ユーザーは右上隅をクリックして共有します*/
  onShareAppMessage: 関数 () {
  
  }
})

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • WeChat アプレットで実装されたスネーク ゲーム [ソース コードのダウンロードあり]

<<:  MySQL の int、char、varchar のパフォーマンスを比較する

>>:  nohup /dev/null 2>&1 の使い方の詳しい説明

推薦する

JavaScript でプライベート メンバーを作成する

目次1. クロージャを使用する2. ES6クラスを使用する3. ES2020提案を使用する4. We...

MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明

序文データベース トランザクションに関して言えば、トランザクションの ACID 特性、分離レベル、解...

Vueは動的クエリルール生成コンポーネントを実装します

1. 動的クエリルール動的クエリルールは、おおよそ次の図のようになります。ユーザのカスタマイズに応じ...

div間のギャップの解決策

HTMLのdivブロックを使用していて、ブロックの中央をしっかりと接続できず、解決できない場合1. ...

Zabbix で複数の JVM プロセスを監視する方法

1. シナリオの説明:私たちの環境ではマイクロサービスを使用しています。各プログラムには個別のプロセ...

HTML 形式の JSON 出力の例 (テスト インターフェース)

JSON データを美しいインデント形式で表示するには、最も単純な JSON.stringify 関...

キャンバスはスクラッチカード効果を描画します

この記事では、キャンバスでスクラッチカード効果を描画するための具体的なコードを参考までに共有します。...

MySQL 8.0.23のルートパスワードをリセットするための最適なソリューション

この方法は2021年2月7日に編集されました。私が使用しているバージョンは8.0.23です。事件の原...

Nginx を使用してクロスドメイン Vue 開発環境を処理する方法

1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...

vue+rem カスタムカルーセル効果

vue+remを使用したカスタムカルーセルチャートの実装は参考までに。具体的な内容は以下のとおりです...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

MySQLデータ損失の原因と解決策

目次序文問題の説明原因分析拡大する総括する序文最近、データの欠落やデータの損失に関するフィードバック...

純粋な CSS3 で水平無限スクロールを実装するためのサンプル コード

この記事の例はすべて小さなプログラムで書かれていますが、実装される機能には影響しません。 wxmlル...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

CSSは親要素の下の最初の子要素を選択します(:first-child)

序文最近、プロジェクトで :first-child を使用したのですが、すぐに思いつきました。これは...