微信小程序游戏开发│石头剪刀布游戏(附源码)

微信小程序游戏开发│石头剪刀布游戏(附源码)

石头剪刀布游戏功能中一方是电脑,另一方是玩家。游戏时电脑一直快速切换出拳显示,当玩家选择底部的剪子、石头、布后,则电脑出拳停止,并在紫色方块中显示用户的出拳图片。游戏判断出输赢结果,记录玩家赢的次数。对战一局后可以单击”再来!”按钮重新一局。运行效果如图1所示。

微信小程序游戏开发│石头剪刀布游戏(附源码)

(a)玩家出拳前 (b)玩家出拳后

■ 图1 石头剪刀布游戏运行效果

01、 程序设计的思路

1. 控制剪子、石头、布的快速切换

猜拳游戏的核心就是快速切换剪子、石头、布三个图像,电脑的出拳一直是动态切换的,一直到用户选择剪子、石头、布的图片后才停止。这里将这三个图像文件名存储在一个srcs数组中,并使用定时器快速从这个数组中依次循环获取图像文件名,并将该文件名指定的图像显示到image组件中即可。

data: {
    srcs: [
      '/images/shitou.png',
      '/images/jiandao.png',
      '/images/bu.png',
    ] ,
    imgAi: '', // 电脑随机显示的图片
    imgUser: '/images/wenhao.png', // 用户选中的图片
  },
  //设置电脑每间隔0.2s随机显示石头剪刀布
  timerGo() {
    timer = setInterval(this.change, 200); //200毫秒
  },
  //设置电脑随机显示石头剪刀布,0对应石头,1对应剪刀、2对应布
  change() {
    this.setData({
      imgAi: this.data.srcs[parseInt(Math.random() * 3)],
    })
  },

这里涉及到两个主要变量:srcs(图片数组)和imgAi(电脑出拳),这两个都定义在data对象中。

本游戏对石头、剪子、布进行编号,其中0对应石头,1对应剪刀、2对应布。所以电脑随机出拳就是产生0~2之间的随机自然数。

这里使用了Math中的parseInt()函数和Math中的random()函数,其中random()函数会产生0~1之间的小数,当Math.random() * 3时,random函数就会生成0~3之间的一个随机小数,然后通过parseInt()函数进行取整处理得到0~2之间的随机自然数。接着通过this.data.srcs[parseInt(Math.random()*3)]就完成了使电脑随机选择石头剪刀布中的一种情况。

2. 用户出拳

用户出拳比较简单,这里提供3个图像组件(image)供用户单击选择。对此3个图像组件分别绑定单击事件,单击事件获取并识别那个image图像组件,从而得知玩家用户的出拳。

02、 程序设计的步骤

新建一个微信小程序后,在app.json中修改原有的”window”值,实现导航条标题文字为”石头剪刀布游戏”,具体如下:

"window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "石头剪刀布游戏",
    "navigationBarTextStyle": "black"

1. 游戏布局

猜拳游戏的布局是纵向显示4个文本组件(text)、5个图像组件(image)和1个按钮组件(button)。在创建小程序工程时,默认建立了两个页面:index和logs。我们不需要管logs,在这个例子中只需修改和index页面相关的文件,index是小程序第一个显示的页面,其中index.wxml文件是index页面的布局文件。

按猜拳游戏的布局修改index.wxml文件如下:

<!--pages/index/index.wxml-->
<view class="container">
<text class="win-text">&#x4F60;&#x5DF2;&#x7ECF;&#x83B7;&#x80DC;&#x4E86;</text>
<text class="win-num">{{winNum}}&#x6B21;</text>
<view class="result">
<image src="{{imgAi}}" class="imgAi"></image>
<text class="notice">{{notice}}</text>
<image src="{{imgUser}}" class="imgUser"></image>
</view>
<view class="test">
<text class="notice-punches">&#x51FA;&#x62F3;&#x5427;&#xFF0C;&#x5C11;&#x5E74;~</text>
<view class="imageGroup">
<image type="primary" class="btn" bindtap="btnclick" data-choose="0" src="/images/shitou.png"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="1" src="/images/jiandao.png"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="2" src="/images/bu.png"></image>
</view>
</view>
<button class="btn-again" bindtap="again">&#x518D;&#x6765;&#xFF01;</button>
</view>

在这段代码中,image和text组件的内容都需要动态改变,所以image组件的src属性和text组件的文本值(夹在

下面2个

<view class="result">
<image src="{{imgAi}}" class="imgAi"></image>
<text class="notice">{{notice}}</text>
<image src="{{imgUser}}" class="imgUser"></image>
</view>

以下三个

<image type="primary" class="btn" bindtap="btnclick" data-choose="0" src="/images/shitou.png"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="1" src="/images/jiandao.png"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="2" src="/images/bu.png"></image>

对应样式文件index.wxss如下:

.win-text&#xA0;{
&#xA0;&#xA0;text-align: center;
}
.win-num&#xA0;{
&#xA0;&#xA0;color: red;
&#xA0;&#xA0;text-align: center;
}
.result&#xA0;{
&#xA0;&#xA0;height:&#xA0;160rpx;
&#xA0;&#xA0;display: inline-block;
}
.notice&#xA0;{
&#xA0;&#xA0;width:&#xA0;100rpx;
&#xA0;&#xA0;color: red;
&#xA0;&#xA0;/*height:140rpx;*//*line-height:140rpx;*/
&#xA0;&#xA0;text-align: center;
&#xA0;&#xA0;display: inline-block;
&#xA0;&#xA0;padding-top:&#xA0;0rpx;
}
.imgAi&#xA0;{
&#xA0;&#xA0;width:&#xA0;140rpx;
&#xA0;&#xA0;height:&#xA0;140rpx;
&#xA0;&#xA0;padding:&#xA0;10rpx&#xA0;0&#xA0;10rpx&#xA0;10rpx;
}
.imgUser&#xA0;{
&#xA0;&#xA0;width:&#xA0;140rpx;
&#xA0;&#xA0;height:&#xA0;140rpx;
&#xA0;&#xA0;padding:&#xA0;10rpx&#xA0;0&#xA0;10rpx&#xA0;10rpx;
}
.notice-punches&#xA0;{
&#xA0;&#xA0;text-align: center;
&#xA0;&#xA0;display: block;
&#xA0;&#xA0;padding-top:&#xA0;20rpx;
}
image&#xA0;{
&#xA0;&#xA0;width:&#xA0;100px;
&#xA0;&#xA0;height:&#xA0;100px;
&#xA0;&#xA0;border-radius:&#xA0;50%;
}

并在小程序工程根目录建立一个images目录,将剪子、石头和布三个图片文件和一个wenhao.png放到该目录中。对应图片下图2所示。

微信小程序游戏开发│石头剪刀布游戏(附源码)

■ 图2 石头剪刀布图片

2. 游戏脚本

// pages/index/index.js
var timer; //&#x5B9A;&#x65F6;&#x5668;
Page({
  data: {
    srcs: [
      '/images/shitou.png',
      '/images/jiandao.png',
      '/images/bu.png',
    ],
    imgAi: '', //&#x7535;&#x8111;&#x968F;&#x673A;&#x663E;&#x793A;&#x7684;&#x56FE;&#x7247;
    imgUser: '/images/wenhao.png', //&#x7528;&#x6237;&#x9009;&#x4E2D;&#x7684;&#x56FE;&#x7247;
    notice: '', //&#x731C;&#x62F3;&#x5BF9;&#x6BD4;&#x7ED3;&#x679C;
    winNum: wx.getStorageSync('winNum'), //&#x7528;&#x6237;&#x731C;&#x62F3;&#x8D62;&#x7684;&#x6B21;&#x6570;
    btnpunches: false, //&#x7528;&#x6237;&#x662F;&#x5426;&#x5355;&#x51FB;&#x51FA;&#x62F3;&#xFF0C;false&#x8868;&#x793A;&#x672A;&#x51FA;&#x62F3;
  },
  onLoad: function () {
    this.timerGo();
  },
  //&#x8BBE;&#x7F6E;&#x7535;&#x8111;&#x6BCF;&#x95F4;&#x9694;0.2s&#x968F;&#x673A;&#x663E;&#x793A;&#x77F3;&#x5934;&#x526A;&#x5200;&#x5E03;
  timerGo: function () {
    timer = setInterval(this.change, 200); //200&#x6BEB;&#x79D2;
  },
  //&#x8BBE;&#x7F6E;&#x7535;&#x8111;&#x968F;&#x673A;&#x663E;&#x793A;&#x77F3;&#x5934;&#x526A;&#x5200;&#x5E03;
  change: function () {
    this.setData({
      imgAi: this.data.srcs[parseInt(Math.random() * 3)],
    })
  },

btnclick:function(e)主要用来处理单(点)击事件,其中e是方法的回调,当我们触发了单击事件,小程序会调用该方法并传入一个Object对象,这个Object对象主要存储了单击事件的一些信息。其中当玩家单击剪刀的时候,在Object对象e的target下有个dataset中有个choose记录了玩家的选择。例如用户选择的石头,this.setData({imgUser: ‘/images/shitou.png’})将用户选择的石头图片设置给imgUser变量从而更新页面的显示。同时clearInterval(timer)清除计时器,这样相当于停止电脑方的剪子、石头、布三个图像切换,并在imgAi记录电脑方的出拳图片。

后面根据玩家的选择和电脑的出拳情况判断出输赢。

//&#x5F53;&#x7528;&#x6237;&#x5355;&#x51FB;&#x4E0B;&#x9762;&#x65B9;&#x6846;&#x7684;&#x77F3;&#x5934;&#x526A;&#x5200;&#x5E03;&#xFF0C;&#x5C06;&#x7528;&#x6237;&#x6570;&#x636E;&#x8BBE;&#x7F6E;&#x4E3A;&#x5BF9;&#x7528;&#x7684;&#x56FE;&#x7247;
  btnclick:function (e) {
    if (this.data.btnpunches == true) { //&#x7528;&#x6237;&#x5DF2;&#x51FA;&#x62F3;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;
      return;
    }
    var num = this.data.winNum; //&#x7528;&#x6237;&#x8D62;&#x7684;&#x6B21;&#x6570;
    this.setData({ //&#x5148;&#x5047;&#x8BBE;&#x7684;&#x503C;
      notice: '&#x4F60;&#x8F93;&#x4E86;',
      btnpunches: true,
    })
    //&#x4EE5;&#x4E0B;&#x662F;&#x8D62;&#x7684;&#x60C5;&#x51B5;
    if (e.target.dataset.choose == 0) { //&#x7528;&#x6237;&#x9009;&#x62E9;&#x77F3;&#x5934;
      this.setData({
        imgUser: '/images/shitou.png', //&#x5C06;&#x7528;&#x6237;&#x9009;&#x62E9;&#x7684;&#x77F3;&#x5934;&#x56FE;&#x7247;&#x8BBE;&#x7F6E;&#x7ED9;imgUser&#x53D8;&#x91CF;
      })
      //&#x6E05;&#x9664;&#x8BA1;&#x65F6;&#x5668;
      clearInterval(timer);
      if (this.data.imgAi == '/images/jiandao.png') { //&#x7535;&#x8111;&#x662F;&#x5200;
        num++;
        wx.setStorageSync('winNum', num)
        this.setData({
          notice: '&#x4F60;&#x8D62;&#x4E86;',
          winNum: num,
        })
      }

    } else if (e.target.dataset.choose == 1) { //&#x7528;&#x6237;&#x9009;&#x62E9;&#x526A;&#x5200;
      this.setData({
        imgUser: '/images/jiandao.png', //&#x5C06;&#x7528;&#x6237;&#x9009;&#x62E9;&#x7684;&#x526A;&#x5200;&#x56FE;&#x7247;&#x8BBE;&#x7F6E;&#x7ED9;imgUser&#x53D8;&#x91CF;
      })
      //&#x6E05;&#x9664;&#x8BA1;&#x65F6;&#x5668;
      clearInterval(timer);
      if (this.data.imgAi == '/images/bu.png') { //&#x7535;&#x8111;&#x662F;&#x5E03;
        num++;
        wx.setStorageSync('winNum', num) //&#x672C;&#x5730;&#x7F13;&#x5B58;&#x8D62;&#x7684;&#x6B21;&#x6570;
        this.setData({
          notice: '&#x4F60;&#x8D62;&#x4E86;',
          winNum: num,
        })
      }

    } else { //&#x7528;&#x6237;&#x9009;&#x62E9;&#x5E03;
      this.setData({
        imgUser: '/images/bu.png', //&#x5C06;&#x7528;&#x6237;&#x9009;&#x62E9;&#x7684;&#x5E03;&#x56FE;&#x7247;&#x8BBE;&#x7F6E;&#x7ED9;imgUser&#x53D8;&#x91CF;
      })
      //&#x6E05;&#x9664;&#x8BA1;&#x65F6;&#x5668;
      clearInterval(timer);
      if (this.data.imgAi == '/images/shitou.png') { //&#x7535;&#x8111;&#x662F;&#x77F3;&#x5934;
        num++;
        wx.setStorageSync('winNum', num)
        this.setData({
          notice: '&#x4F60;&#x8D62;&#x4E86;',
          winNum: num,
        })
      }
    }
    //&#x4EE5;&#x4E0B;&#x662F;&#x5E73;&#x5C40;&#x7684;&#x60C5;&#x51B5;
    if (this.data.imgAi == this.data.imgUser) {
      this.setData({
        notice: '&#x5E73;&#x5C40;',
      })
      //&#x6E05;&#x9664;&#x8BA1;&#x65F6;&#x5668;
      clearInterval(timer);
    }
  },

again()是再来按钮事件,电脑重新启动猜拳。

again() {
    if (this.data.btnpunches == false) { //&#x7528;&#x6237;&#x8FD8;&#x672A;&#x51FA;&#x62F3;&#xFF0C;&#x4E0D;&#x80FD;&#x518D;&#x6765;
      return;
    }
    this.timerGo(); //&#x7535;&#x8111;&#x542F;&#x52A8;&#x731C;&#x62F3;&#xFF0C;&#x6BCF;&#x95F4;&#x9694;0.2s&#x968F;&#x673A;&#x663E;&#x793A;&#x77F3;&#x5934;&#x526A;&#x5200;&#x5E03;
    this.setData({
      btnpunches: false, //&#x8BBE;&#x7F6E;&#x4E3A;&#x7528;&#x6237;&#x672A;&#x51FA;&#x62F3;&#x72B6;&#x6001;
      imgUser: '/images/wenhao.png',
      notice: ' ',
    })
  },
})

至此完成剪刀石头布游戏。

Original: https://blog.csdn.net/qq_41640218/article/details/126335426
Author: TiAmo zhang
Title: 微信小程序游戏开发│石头剪刀布游戏(附源码)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542634/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球