zoukankan      html  css  js  c++  java
  • 拼图

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14332495.html

    拼图

    1.说明

    1.1游戏玩法

    1.1.1游戏1

    界面显示一张被2*3矩形分割后打乱顺序的图片,用户移动图片时,只能移动到相邻的格子,只需要给出方向,拖拽图片,把打乱顺序后的图片还原为原图片。

    1.1.2游戏2

    可以从手机获取图片,界面上显示一张被3*3矩形分割后打乱顺序的图片,用户移动图片时,只能移动到相邻的格子,只需要给出方向,拖拽图片,把打乱顺序后的图片还原为原图片。

    1.1.3游戏3

    可以拍照获取图片,界面上显示一张被4*4矩形分割后打乱顺序的图片(图片中会显示一张白色的图片,称为白色图片),用户移动图片时,只能移动白色图片附近的图片,只需要给出方向,拖拽图片,使图片和白色图片交换,最后把打乱顺序后的图片还原为原图片。

    1.2编程语言

    使用小程序开发拼图游戏。

    2.技术原型

    1.分割图片。

    2.移动图片。

    3.需求

    1.在界面固定坐标处显示几张图片。

    2.打乱图片顺序。

    4.交换图片。

    5.判断用户移动图片是否和原图片一致。

    4.思路

    4.1游戏1

    4.1.1说明

    使用工具分割图片,然后把图片地址存到一个数组中,给每个图片绑定一个编号。

    4.1.2实现思路

    1.显示图片:遍历数组中图片的地址,显示相应图片。

    2.移动图片:通过手势移动的坐标判断移动方向。

    3.交换图片,交换需要移动的图片和移动方向上图片的地址和编号。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    4.2游戏2

    4.2.1说明

    使用代码分割图片,把图片的背景位置存放到一个数组中,给每个图片绑定一个编号。

    4.2.2思路

    1.显示图片:获取用户自己选的图片并显示。

    2.分割图片:在图片上显示分割线,把分割后的图片坐标重新排序。

    3.获取用户点击事件:获取用户滑动事件,获取当前图片的坐标,判断用户移动方向,改变图片坐标。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    4.3游戏3

    4.3.1说明

    使用代码分割图片,把图片的背景位置存放到一个数组中,给每个图片绑定一个编号。这里和游戏2的区别是,游戏2用户可以向四个方向滑动图片,但是游戏3用户只能滑动和空白块相邻的图片。

    4.3.2思路

    1.显示图片:获取用户自己选的图片并显示。

    2.分割图片:在图片上显示分割线,把分割后的图片坐标重新排序。

    3.获取用户点击事件:获取用户滑动事件,获取当前图片的坐标,判断用户移动方向,改变图片坐标。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    5.关键技术和核心代码

    5.1判断用户滑动方向

    5.1.1说明

    拼图游戏中需要判断用户滑动方向。

    5.1.2技术

    1.判断横向还是纵向:取开始移动的坐标A和移动结束的坐标B在x和y轴上的投影差值比例关系判断用户是横向还是纵向移动的。

    2.判断用户向上还是向下,或者向左还是向右:当手势移动后的横坐标小于手势移动前的横坐标时,横坐标差的绝对值大于纵坐标差的绝对值时,说明手势向左移动;横坐标差的绝对值小于纵坐标差的绝对值,如果移动后的纵坐标大于开始的纵坐标,说明手势是向下移动,如果移动后的纵坐标小于开始的纵坐标,说明手势向上移动。

    当手势移动后的横坐标大于手势移动前的横坐标时,横坐标差的绝对值大于纵坐标差的绝对值时,说明手势向右移动;横坐标差的绝对值小于纵坐标差的绝对值,如果移动后的纵坐标大于开始的纵坐标,说明手势是向下移动,如果移动后的纵坐标小于开始的纵坐标,说明手势向上移动。

    5.1.3代码

    if(curPoint[0]<=startPoint[0]){
        if(Math.abs(curPoint[0]-startPoint[0])>=Math.abs(curPoint[1]-startPoint[1])){
          this.setData({
            dir:"left",
          })
          console.info(e.timeStamp+'touche left move')
        }
        else{
          if(curPoint[1]>=startPoint[1])
          {
            this.setData({
              dir:'down',
            })
            console.log(e.timeStamp+'touche down move')
          }
          else{
            this.setData({
              dir:'up',
            })
            console.log(e.timeStamp+'touche up move')
          }
        }
      }
      else{
        if(Math.abs(curPoint[0]-startPoint[0])>=Math.abs(curPoint[1]-startPoint[1])){
          this.setData({
            dir:'right',
          })
          console.info(e.timeStamp+'touche right move')
        }
        else{
          if(curPoint[1]>=startPoint[1])
          {
            this.setData({
              dir:'down',
            })
            console.log(e.timeStamp+'touche down move')
          }
          else{
            this.setData({
              dir:'up',
            })
            console.log(e.timeStamp+'touche up move')
          }
        
        }
      }

    5.2交换图片

    5.2.1说明

    当用户移动图片时,交换用户移动的图片和移动方向上的图片。

    5.2.2技术

    通过判断用户移动的方向,交换数组中存放两张图片元素对象的坐标。

    5.2.3数据结构

    定义一个一维数组,数组中存放一个对象,对象的第一个元素存放图片路径,对象的第二个元素存放图片编号。

    arr:[
          {
            src:'../image/abc3.png',
            name:'2'
          },
          {
            src:'../image/abc6.png',
            name:'3'
          },
          {
            src:'../image/abc1.png',
            name:'1'
          },
          {
            src:'../image/abc2.png',
            name:'4'
          },
          {
            src:'../image/abc5.png',
            name:'6'
          },
          {
            src:'../image/abc4.png',
            name:'5'
          },
        ]

    5.2.4代码

    for(var i=0;i<arr.length;i++)
         {
            if(dir=="up"&&index>2)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index-3];
              arr[index-3]=temp;
              count++
              break
            }
            if(dir=="down"&&index<arr.length-3)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index+3];
              arr[index+3]=temp;
              count++
              break
            }if(dir=="left"&&index!=3*i)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index-1];
              arr[index-1]=temp;
              count++
              break
            }if(dir=="right"&&index!=3*i+2)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index+1];
              arr[index+1]=temp;
              count++
              break
            }

     5.3分割图片

    5.3.1说明

    游戏2中用户可以选择自己手机中的照片拼图,这需要把用户提供的照片使用代码分割。

    5.3.2技术

    将图片作为view的背景图显示,然后利用background-position属性,将背景图的位置进行移动,让背景图从不同起始位置开始显示在界面上,从而看起来形成图片分隔效果。

    5.3.3代码

    .picture{
      float: left;
       250rpx;
      height: 250rpx;
      background-repeat: no-repeat;
      /* background-size: 250rpx 250rpx; */
      /* 不能给大小,不然显示的不是切割的图片,而是完整的图片 */
      box-sizing: border-box;
      padding: 1px;
      background-clip: content-box;
    }
    .picture1{
      background-position: 0px 0px;
    }
    .picture2{
      background-position: -250rpx 0;
    }
    .picture3{
      background-position: -500rpx 0px;
    }
    .picture4{
      background-position: 0rpx -250rpx;
    }
    .picture5{
      background-position: -250rpx -250rpx;
    }
    
    .picture6{
      background-position: -500rpx -250rpx;
    }

    5.4压缩或者拉伸图片

    5.4.1说明

    1.游戏2设计的是从相册选图片,从相册选择的图片在界面显示时,选择的图片大小可能与给定显示图片位置的大小不一致,可能比给定的位置大或者比给定的位置小。

    2.利用canvas api自带的绘图函数实现图片压缩功能。以下是微信小程序开发者文档中关于画布的接口说明。

     

    5.4.2技术

    记图片宽高分别为img_w,img_h,canvas画布宽高分别为canvas_w,canvas_h。若满足 img_w > canvas_w || img_h > canvas_h。则将原始图片的宽高绘制在canvas画布上。

    5.4.3代码

                var ctx = wx.createCanvasContext('myCanvas')
                ctx.drawImage(img_url, 0, 0, origin_width, origin_height, 0, 0, 375, 375)
                ctx.draw(false, function () {
                  wx.canvasToTempFilePath({
                    canvasId: 'myCanvas',
                    success: (res) => {
                      console.log(res.tempFilePath)
                      that.setData({
                        jigsaw_img_url: res.tempFilePath
                      })
                      that.init()
                    }
                  })
                })

    6.燃尽图

     

    7.todolist

    序号

    任务

    计划时间

    完成情况

    技术原型

    1

    分割图片

    2021.01.27

    已完成

    2

    移动图片

    2021.01.28

    已完成

    需求实现

    3

    游戏1显示图片

    2021.01.27

    已完成

    4

    游戏1打乱图片顺序

    2021.01.28

    已完成

    5

    游戏1判断图片移动方向

    2021.01.29

    已完成

    6

    游戏1交换图片

    2021.01.29

    已完成

    7

    游戏1用户移动碎片的坐标是否和原图片坐标一致

    2021.01.29

    已完成

    8

    游戏2代码分割图片

    2021.01.30

    已完成

    9

    游戏2获取用户图片

    2021.01.31

    已完成

    10

    游戏2压缩图片

    2021.02.01

    已完成

    11

    游戏3

    2021.02.03

    已完成

    8.实现

    8.1游戏1

    1.用画图 mspaint分割图片,在小程序中显示分割的图片。

    2.滑动图片,判断用户移动方向。

    3.交换图片位置。

    4.打乱图片位置。

    5.判断用户移动图片的坐标是否和原图片坐标一致。

    8.2游戏2

    1.在界面中显示同一张图片显示六遍。

    2.给每张显示的图片不同的背景样式。

    3.添加分割线。

    4.从本地选择照片

     5.在选择完图片后,因为选择的图片大小是不固定的,而我在分割图片时,是按照固定大小显示背景图片的,所以会出现选择的图片小,显示图片时,边界的图片显示不全。如下图所示。

     6.缩放图片的高宽。

    (1)使用wx.getImageInfo获取选择的图片长和宽。

    (2)判断图片的长和宽是否比屏幕大,如果图片比屏幕大,需要对图片进行压缩,如果图片比屏幕小,只需要把获取的图片按照真实值分割大小。这里一开始是把图片先压缩或者拉伸后对图片进行裁剪,但是这样会导致不能显示完整的图片。如下图所示,左图是裁剪后的图片,右图是原图。通过对比可以看出,左图被裁剪后,和原图差距还挺大。

     拉伸和裁剪技术参见压缩拉伸图片博客,博客链接:https://www.cnblogs.com/ping2yingshi/p/14369984.html 。

    (3)图片的长宽比屏幕小时,按照图片真实值对图片进行九等分,这里涉及要给样式赋值变量。

    (4)打乱图片顺序。

    (5)判断用户移动方向,判断图片是否被还原。

    8.3游戏3

    同游戏2步骤,和游戏2的区别在于,在显示图片时,让最后一张图片显示白色,用户在移动图片时,只能把其他图片和白色图片交换移动图片。

    9.实现效果

    9.1游戏1

     

    9.2游戏2

    9.3游戏3

     

    10.PSP

     

     

     

     

     11.代码地址

    coding.net地址:

    出来混总是要还的
  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14332495.html
Copyright © 2011-2022 走看看