基于Javascript开发连连看游戏小程序

目录
  • 01、程序设计的步骤
    • 1. 设计点类Point
    • 2. 设计游戏主逻辑
    • 3. 编写函数代码

“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。“连连看”考验的是各位的眼力,在有限的时间内,只要把所有能连接的相同图案,两个一对地找出来,每找出一对,它们就会自动消失,只要把所有的图案全部消完即可获得胜利。所谓能够连接,指得是:无论横向或者纵向,从一个图案到另一个图案之间的连线不能超过两个弯,其中,连线不能从尚未消去的图案上经过。

连连看游戏的规则总结如下:

● 两个选中的方块是相同的。

● 两个选中的方块之间连接线的折点不超过两个。(连接线由x轴和y轴的平行线组成)。

本篇开发连连看游戏,游戏效果如图1所示。

图1  连连看运行界面

本游戏增加智能查找功能,当玩家自己无法找到时,可以右键单击画面,则会出现提示可以消去的两个方块(被加上红色边框线)。

01、程序设计的步骤

1. 设计点类Point

点类Point比较简单,主要存储方块所在棋盘坐标(x,y)。

//定义坐标点类
function Point(_x, _y) {
  this.x = _x;
  this.y = _y;
}

2. 设计游戏主逻辑

整个游戏在Canvas对象中进行,在页面加载时调用create_map( )实现将图标图案随机放到地图中,地图map中记录的是图案的数字编号。最后调用print_map()按地图map中记录图案信息将图2中图标图案绘制在Canvas对象中,生成游戏开始的界面。同时绑定Canvas对象触屏开始事件,对玩家触屏操作做出反应。

var map = [];
var Select_first = false; //是否已经选中第一块
var linePointStack = []; //存储连接的折点棋盘坐标
var Height = 12;
var Width = 10;
var p1, p2; //存储选中第一块,第二块方块对象坐标
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    //创建画布上下文
    this.init(); //初始化地图, 将地图中所有方块区域位置置为空方块状态
    this.create_map() ; //生成随机地图
    this.print_map(); //输出map地图
    this.ctx = wx.createCanvasContext('myCanvas')
    this.ctx.draw();
  },
init: function() {
    //初始化地图, 将地图中所有方块区域位置置为空方块状态
    for (var x = 0; x < Width; x++) {
      map[x] = new Array();
      for (var y = 0; y < Height; y++) {
        map[x][y] = " "; //" "表示空的
      }
    }
  },

3. 编写函数代码

print_map( )按地图map中记录图案信息将图2中图标图案显示在Canvas对象中,生成游戏开始的界面。

**
   *按地图map中记录图案信息将图标图案显示在Canvas对象中,生成游戏开始的界面。
   */
  print_map: function() { //输出map地图
    let ctx = this.ctx
    for (var x = 0; x < Width; x++)
      for (var y = 0; y < Height; y++)
        if (map[x][y] != ' ') {
          var img1 = '/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()。

Canvas对象触屏开始事件代码。

touchStart: function(e) {
    var x = Math.floor(e.touches[0].x / 25);
    var y = Math.floor(e.touches[0].y / 25);
    let ctx = this.ctx;
    var pair=false; //是否配对成功
    this.print_map(); //输出map地图
    console.log("clicked at" + x + "," + y);
    if (map[x][y] == " ")
      console.log("提示此处无方块");
    else {
      if (Select_first == false) {
        p1 = new Point(x, y);
        //画选定(x1,y1)处的框线
        ctx.setStrokeStyle("red");
        ctx.strokeRect(x * 25, y * 25, 25, 25);
        Select_first = true;
      } else {
        p2 = new Point(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");
      return true;
    }
    return false;
  },

以下是画方块之间连接线的方法。

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) { //一折连通
      var z = linePointStack.pop();
      console.log("一折连通点z" + z.x + z.y);
      this.drawLine(p1, z);
      this.drawLine(p2, z);
    }
    if (linePointStack.length == 2) { //2折连通
      var z1 = linePointStack.pop()
      //print("2折连通点z1",z1.x,z1.y)
      this.drawLine(p2, z1)
      var z2 = 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)之间的直线
    let ctx = 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 (var y = 0; y < Height; y++)
      for (var x = 0; x < Width; x++)
        if (map[x][y] != " ")
          return false;
    return true;
  }

至此完成连连看游戏。

到此这篇关于基于Java开发连连看游戏小程序的文章就介绍到这了,更多相关Java连连看小程序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用JavaScript做一款无框架浏览器直接运行的益智类数字棋牌小游戏

    目录 一.游戏效果展示 二.游戏逻辑与交互设计 (一)游戏逻辑 (二)人机交互 (三)游戏界面设计 (四)游戏音乐设计 二.游戏制作过程 (一)游戏资源收集和制作 (二)游戏布局 (三)游戏响应开发 游戏界面 一.游戏效果展示 二.游戏逻辑与交互设计 由于技术有限不能做太复杂的游戏,所以做个休闲数字游戏是比较合适的,下手之前做了挺多准备,包括思考游戏逻辑.收集和制作游戏图片.音乐素材等,最后确定要完成一下几个游戏必备的内容.    (一)游戏逻辑 游戏玩法就是在原来“井字过三关”游戏的基础上加上

  • JavaScript+Canvas模拟实现支付宝画年兔游戏

    目录 动手前的思路 思考1.如何让鼠标只能在特定区域内画画? 思考2.如何让绘制的图画动起来 思考3.如何撤销上一步操作 思考4.如何判断线条绘制完毕 关键步骤 接近过年了,支付宝的集福的活动又开始了,集美们的五福集齐了没有.每年的集福活动都有一些小游戏,今年也不例外,画年画就是其中之一,本篇用canvas来写一个画年兔的游戏. 动手前的思路 画年画游戏规则是:跟着特定轮廓画出线条来. 思考1.如何让鼠标只能在特定区域内画画? 首先要获取到这个轮廓区域所在画布上的位置,判断鼠标绘画的位置是否在指

  • 基于JavaScript编写一个翻卡游戏

    目录 前言 翻卡动画 生成随机分布数组 均匀元素下的随机算法 不均匀元素下的随机算法 生成最终数组 点击事件 完整代码 前言 首先将这个游戏需求拆分成三个部分: 翻卡动画 生成随机分布数组 点击事件 翻卡动画 假如我们的盒子模型不是个二维的平面,而是有个三维的体积,让它可以有正反两面,那我们在做的时候是不是只要将它真实的翻个面就可以了.让我们来想想将它变成三维的方法. 之后发现了这个属性: transform: translateZ(1px); 使用了它,就可以把盒子内部的元素与盒子的底部撑出个

  • 一文教你用JavaScript制作个简单的大转盘游戏

    目录 背景 一.开始前的准备 二.画出大转盘 三.把奖励放上去 四.让大转盘滚起来 个人总结 背景 日常生活中,我们经常会见到形形色色的抽奖活动,例如九宫格.大转盘等等……以前都没去深入考虑过,如果让我去做这些小游戏,有哪些需要注意的事项,不试不知道,一试全是坑.正好最近有需求让我做一个大转盘游戏,那我也总结一下我的一些感想和经验. 一.开始前的准备 首先就是确定产品需求,仔细一看,emmm,就是正常的一个大转盘该有的东西,也没啥特殊要求,唯一需要注意的是大转盘的转盘个数需要动态变化,即用户设置

  • 基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)

    随着html5的兴起,那些公司对大型游戏的开发正在慢慢疏远,一.开发周期长:二.运营花费高:他们正找一些能够克服这些缺点的替代品.正好,html5的出现可以改变这些现状,在淘宝.京东等一些大型电商网站.QQ.微信等聊天软件都出现了html5的小游戏,这说明html5越来越受到大家的青睐.接下来我用javascript实现一个小型游戏---打地鼠. 一.游戏简介 打地鼠这个游戏相信大家都不陌生,也是童年时候一款经典的游戏.本次游戏的编写是以html文件形式完成的,并且使用HBulider软件进行编

  • Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html : 本文是对接微信小程序自定义登录的一个完整例子实现 ,技术栈为 : SpringBoot+Shiro+JWT+JPA+Redis. 如果对该例子比较感兴趣或者觉得言语表达比较啰嗦,可查看完整的项目地址 : https://github.com/EalenXie/shiro-jwt-applet

  • java实现打字游戏小程序

    本文实例为大家分享了java实现打字游戏小程序的具体代码,供大家参考,具体内容如下 一.设计思路 1.创建一个窗体 2.在窗体上放置一个面板,用paint方法画出英文字母,随机放置字母位置,并随时间自动下落 3.设置得分扣分机制 4.在面板上添加键盘监听器,输入正确得分,输入错误则扣分 ps:面板和监听器用一个类实现(这样简单方便) 二.具体实现 MyPanel.java import java.awt.Color; import java.awt.Font; import java.awt.G

  • 五步完成unity与微信(游戏)小程序交互创建视频

    本文基于minigame-unity-webgl-transform方案,此方案支持大部分Unity组件及方法,比较可惜的是目前版本不支持任何形式的Video播放(不管是MovieoTexture.VideoPlayer还是其他第三方的视频播放插件,比如AVPro.EasyMovieTexture). 而且当前版本中也无法通过微信的sdk来创建视频 通过unity与微信小程序交互的方式调用微信小程序原生sdk来创建视频 (目前仅支持覆盖在游戏界面上播放,无法做到类似videoplayer那样在场

  • 基于Python制作天眼查小程序的示例代码

    目录 界面搭建 整体布局 界面美化 天眼查爬虫 获取信息 代码编写 结果展示 今天我们一起来制作一个天眼查GUI程序,开宗明义,我们先来看下最终的效果 这次的GUI程序,我们使用的框架是PyQt5,该框架拥有比tkinter更为丰富的内置组件,在界面美化方面,貌似也更胜一筹! 从上图也可以看出,我们的目标还是蛮远大的,最终我们希望可以完成一个工具集合,把我们日常当中常用的功能都集成的该GUI程序中,比如天眼查公司信息,知乎用户知识图谱,B视频弹幕抓取等等. 好了,今天我们先完成天眼查的功能吧~

  • 基于angular实现模拟微信小程序swiper组件

    这段时间的主业是完成一个家政类小程序,终于是过审核发布了.不得不说微信的这个小程序生态还是颇有想法的,抛开他现有的一些问题不说,其提供的组件系统乍一看还是蛮酷的.比如其提供的一个叫swiper的视图组件,就可以在写界面的时候省不少时间和代码,轮播图片跟可滑动列表都可以用.导致现在回来写angular项目时也想整一个这样的组件出来,本文就将使用angular的组件能力和服务能力完成这么一个比较通用,耦合度较低的swiper出来. 首先要选择使用的技术,要实现的是与界面打交道的东西,自然是实现成一个

  • C#开发之微信小程序发送模板消息功能

    步骤一:获取模板ID 有两个方法可以获取模版ID 通过模版消息管理接口获取模版ID 在微信公众平台手动配置获取模版ID 步骤二:页面的 <form/> 组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息.或者当用户完成支付行为,可以获取prepay_id用于发送模板消息. 步骤三:调用接口下发模板消息 今天重要的说第三步怎么实现,前面的步骤比较简单就略过. ----------------------------

  • 原生JavaScript实现连连看游戏(附源码)

    向大家推荐一款原生JavaScript版连连看游戏,源码下载,首页如下图所示:  首先看一下html的布局方式在index.html文件中: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head>

  • 基于java socket实现 聊天小程序

    服务器 package demo04; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataInputStream; import java.io.DataOutp

  • C++开发截屏小程序功能

    C++开发截屏小程序,Win32程序,可以显示截屏区域并保存. 上次的流星雨屏幕程序就简单涉及到GDI绘图了,这次简单介绍几个API函数,涉及到GDI的. GetDC,获取当前创建的窗口的设备环境. CreateDC,获取当前屏幕的设备环境. CreateCompatibleDC,创建一个兼容性的设备环境(相当于一个虚拟的设备环境) BitBlt,这个函数,相当于拷贝,将一个环境的设备内容拷贝到另一个设备中. CreateCompatibleBitmap,创建一块画布,将其放在兼容性的DC里面,

随机推荐