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

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

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">你已经获胜了</text>
<text class="win-num">{{winNum}}次</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">出拳吧,少年~</text>
<view class="imageGroup">
<image type="primary" class="btn" bindtap="btnclick" data-choose="0" src="/images/shitou.png" class="image"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="1" src="/images/jiandao.png" class="image"></image>
<image type="primary" class="btn" bindtap="btnclick" data-choose="2" src="/images/bu.png" class="image"></image>
</view>
</view>
<button class="btn-again" bindtap="again">再来!</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>

以下三个是供玩家选择的出拳图片。bindtap绑定单击事件,data-choose用于单击时识别那个

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

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

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


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

image.png

■ 图2  石头剪刀布图片


2. 游戏脚本

// pages/index/index.js
var timer; //定时器
Page({
  data: {
    srcs: [
      '/images/shitou.png',
      '/images/jiandao.png',
      '/images/bu.png',
    ],
    imgAi: '', //电脑随机显示的图片
    imgUser: '/images/wenhao.png', //用户选中的图片
    notice: '', //猜拳对比结果
    winNum: wx.getStorageSync('winNum'), //用户猜拳赢的次数
    btnpunches: false, //用户是否单击出拳,false表示未出拳
  },
  onLoad: function () {
    this.timerGo();
  },
  //设置电脑每间隔0.2s随机显示石头剪刀布
  timerGo: function () {
    timer = setInterval(this.change, 200); //200毫秒
  },
  //设置电脑随机显示石头剪刀布
  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记录电脑方的出拳图片。


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

//当用户单击下面方框的石头剪刀布,将用户数据设置为对用的图片
  btnclick:function (e) {
    if (this.data.btnpunches == true) { //用户已出拳,直接返回
      return;
    }
    var num = this.data.winNum; //用户赢的次数
    this.setData({ //先假设的值
      notice: '你输了',
      btnpunches: true,
    })
    //以下是赢的情况
    if (e.target.dataset.choose == 0) { //用户选择石头
      this.setData({
        imgUser: '/images/shitou.png', //将用户选择的石头图片设置给imgUser变量
      })
      //清除计时器
      clearInterval(timer);
      if (this.data.imgAi == '/images/jiandao.png') { //电脑是刀
        num++;
        wx.setStorageSync('winNum', num)
        this.setData({
          notice: '你赢了',
          winNum: num,
        })
      }
    } else if (e.target.dataset.choose == 1) { //用户选择剪刀
      this.setData({
        imgUser: '/images/jiandao.png', //将用户选择的剪刀图片设置给imgUser变量
      })
      //清除计时器
      clearInterval(timer);
      if (this.data.imgAi == '/images/bu.png') { //电脑是布
        num++;
        wx.setStorageSync('winNum', num) //本地缓存赢的次数
        this.setData({
          notice: '你赢了',
          winNum: num,
        })
      }
    } else { //用户选择布
      this.setData({
        imgUser: '/images/bu.png', //将用户选择的布图片设置给imgUser变量
      })
      //清除计时器
      clearInterval(timer);
      if (this.data.imgAi == '/images/shitou.png') { //电脑是石头
        num++;
        wx.setStorageSync('winNum', num)
        this.setData({
          notice: '你赢了',
          winNum: num,
        })
      }
    }
    //以下是平局的情况
    if (this.data.imgAi == this.data.imgUser) {
      this.setData({
        notice: '平局',
      })
      //清除计时器
      clearInterval(timer);
    }
  },


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

again() {
    if (this.data.btnpunches == false) { //用户还未出拳,不能再来
      return;
    }
    this.timerGo(); //电脑启动猜拳,每间隔0.2s随机显示石头剪刀布
    this.setData({
      btnpunches: false, //设置为用户未出拳状态
      imgUser: '/images/wenhao.png',
      notice: ' ',
    })
  },
})

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


目录
相关文章
|
2月前
|
Android开发 开发者 Python
手撸了一个全自动微信清粉小工具(源码详解)
微信清理僵尸粉工具利用Python和`uiautomator2`库,通过模拟转账操作自动检测并标记微信好友列表中被删除、被拉黑或账号存在问题的“僵尸粉”。工具支持开启调试模式、自动打开微信、获取好友信息、判断好友状态、管理标签等功能,最终将检测结果记录到文件中,便于用户管理和清理好友列表。此工具适用于Android设备,已在OPPO Reno4 Pro上测试成功。
157 5
|
1月前
|
小程序 数据安全/隐私保护
跑腿小程序系统源码
这是一款跑腿小程序,带有智能派单、系统派单、同城配送、校园跑腿、预约取件、用户端+骑手端 基于FastAdmin+thinkphp和uniapp开发的优创同城跑腿系统,支持帮取、帮送模式,包含用户端、骑手端、运营后台。
77 32
|
1月前
|
移动开发 开发框架 小程序
轻松搭建婚恋交友系统源码,H5/小程序/APP自动适配,智能匹配恋爱交友平台快速落地
婚恋交友系统涵盖在线交友、线下活动、专业服务、社交娱乐等,满足用户多样化需求。系统设计简洁易用,提供实名认证、多注册方式及安全保护,确保用户隐私和数据安全。功能丰富,支持图文展示、筛选匹配、聊天互动、虚拟礼物等,提升互动趣味性。平台可分类管理用户、审核信息、智能推荐,优化用户体验。基于TP6+Uni-app框架,实现跨平台同步,支持二次开发,适应不同市场需求。 [了解更多](https://gitee.com/multi-customer-software/jy)
|
1月前
|
小程序 IDE PHP
圈子源码如何打包生成App小程序/开发一个圈子系统软件所需要的费用体现在哪里?
将PHP源码打包成App的过程涉及多个步骤和技术选择。以圈子源码为例,首先明确需求,确定App功能和目标用户群体,并根据需求开发小程序页面,如用户注册、圈子列表等。源码准备阶段确保源码适用于小程序开发,环境配置需安装IDE(如微信开发者工具)及依赖库。最后在IDE中打包小程序并上传至管理平台,通过审核后发布。费用方面,模板开发成本较低,定制开发则更高,具体取决于需求复杂度和第三方服务费用。
74 0
|
1月前
|
JavaScript
jQuery+HTML5实现的微信大转盘抽奖源码
这是一款基于jQuery+HTML5实现的微信大转盘抽奖效果源码,是一款可配置奖品抽奖的jQuery大转盘抽奖代码,可实现点击按钮转轮旋转实现抽奖功能,效果逼真自然,代码里面有详细的注释,可以修改文字或者二次开发都可以
45 11
|
2月前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
29天前
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
27 0
|
2月前
|
小程序 安全 网络安全
清晰易懂!陪玩系统源码搭建的核心功能,陪玩小程序、陪玩app的搭建步骤!
陪玩系统源码包含多种约单方式、实时语音互动、直播间与聊天室、大神申请与抢单、动态互动与社交及在线支付与评价等核心功能。搭建步骤包括环境准备、源码上传与解压、数据库配置、域名与SSL证书绑定、伪静态配置及后台管理。注意事项涵盖源码安全性、二次开发、合规性和技术支持。确保平台安全、合规并提供良好用户体验是关键。
|
3月前
|
移动开发 小程序
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
138 3
|
26天前
|
小程序 前端开发 关系型数据库
基于Uniapp+php校园小程序,校园圈子论坛系统功能,校园跑腿二手交流功能设计
校园圈子论坛及综合服务平台集成了校园跑腿、兼职信息、外卖团购、闲置交换、租赁服务、表白墙等多功能模块,提供一站式校园生活解决方案。系统采用uniapp前端和PHP后端开发,支持多城市、多学校切换,配备分站式后台管理,确保稳定性和安全性。通过融云IM SDK实现即时通讯功能,增强用户互动与粘性。适用于大学校园、城市及社区圈子,满足多样化需求,提升便捷体验。

热门文章

最新文章