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

其他教程   发布日期:2023年10月24日   浏览次数:616

今天小编给大家分享一下基于Javascript怎么开发连连看游戏小程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

01、程序设计的步骤

1. 设计点类Point

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

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

2. 设计游戏主逻辑

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

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

3. 编写函数代码

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

  1. **
  2. *按地图map中记录图案信息将图标图案显示在Canvas对象中,生成游戏开始的界面。
  3. */
  4. print_map: function() { //输出map地图
  5. let ctx = this.ctx
  6. for (var x = 0; x < Width; x++)
  7. for (var y = 0; y < Height; y++)
  8. if (map[x][y] != ' ') {
  9. var img1 = '/images/' + map[x][y] + ".jpg";
  10. //ctx.drawImage('/images/4.jpg', 50 * i, 50, 50, 50)
  11. ctx.drawImage(img1, 25 * x, 25 * y, 25, 25);
  12. }
  13. },

用户在窗口中上单击时,由屏幕像素坐标(e.touches[0].x, e.touches[0].y)计算被单击方块的地图棋盘位置坐标(x,y)。判断是否是第一次选中方块,是则仅仅对选定方块加上红色示意框线。如果是第二次选中方块,则加上黑色示意框线,同时要判断是否图案相同且连通。假如连通则画选中方块之间连接线。

Canvas对象触屏事件则调用智能查找功能find2Block()。

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

  1. touchStart: function(e) {
  2. var x = Math.floor(e.touches[0].x / 25);
  3. var y = Math.floor(e.touches[0].y / 25);
  4. let ctx = this.ctx;
  5. var pair=false; //是否配对成功
  6. this.print_map(); //输出map地图
  7. console.log("clicked at" + x + "," + y);
  8. if (map[x][y] == " ")
  9. console.log("提示此处无方块");
  10. else {
  11. if (Select_first == false) {
  12. p1 = new Point(x, y);
  13. //画选定(x1,y1)处的框线
  14. ctx.setStrokeStyle("red");
  15. ctx.strokeRect(x * 25, y * 25, 25, 25);
  16. Select_first = true;
  17. } else {
  18. p2 = new Point(x, y);
  19. //判断第二次单击的方块是否已被第一次单击选取,如果是则返回。
  20. if ((p1.x == p2.x) && (p1.y == p2.y))
  21. return;
  22. //画选定(x2,y2)处的框线
  23. console.log('第二次单击的方块' + x + ', ' + y)
  24. ctx.strokeRect(x * 25, y * 25, 25, 25);
  25. if (this.IsSame(p1, p2) && this.IsLink(p1, p2)) { //判断是否连通
  26. console.log('连通' + x + ', ' + y);
  27. Select_first = false;
  28. //画选中方块之间连接线
  29. this.drawLinkLine(p1, p2);
  30. map[p1.x][p1.y] = ' '; //清空记录地图中第1个方块
  31. map[p2.x][p2.y] = ' '; //清空记录地图中第2个方块
  32. pair=true; //配对成功,定时0.5秒后刷新屏幕
  33. linePointStack=[];
  34. if(this.isWin()) { //游戏结束
  35. console.log("游戏结束,你通关了!!");
  36. }
  37. } else {
  38. //不能连通则取消选定的2个方块
  39. Select_first = false;
  40. }
  41. }
  42. }
  43. ctx.draw();
  44. if (pair) { //配对成功
  45. this.print_map(); //重新输出map地图
  46. //定时0.5秒后刷新屏幕
  47. setTimeout(function () {
  48. ctx.draw();
  49. }, 500); //过半秒
  50. }
  51. },

IsSame(p1,p2)判断p1 ( x1, y1)与p2(x2, y2)处的方块图案是否相同。

  1. IsSame: function(p1, p2) {
  2. if (map[p1.x][p1.y] == map[p2.x][p2.y]) {
  3. console.log("clicked at IsSame");
  4. return true;
  5. }
  6. return false;
  7. },

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

drawLinkLine(p1,p2)绘制(p1,p2)所在2个方块之间的连接线。判断linePointStack数组长度,如果为0,则是直接连通。linePointStack数组长度为1,则是一折连通,linePointStack存储是一折连通的折点。linePointStack数组长度为2,则是2折连通,linePointStack存储是2折连通的两个折点。

  1. drawLinkLine: function(p1, p2) { //画连接线
  2. console.log("折点数" + linePointStack.length);
  3. if (linePointStack.length == 0) //直线联通
  4. this.drawLine(p1, p2);
  5. if (linePointStack.length == 1) { //一折连通
  6. var z = linePointStack.pop();
  7. console.log("一折连通点z" + z.x + z.y);
  8. this.drawLine(p1, z);
  9. this.drawLine(p2, z);
  10. }
  11. if (linePointStack.length == 2) { //2折连通
  12. var z1 = linePointStack.pop()
  13. //print("2折连通点z1",z1.x,z1.y)
  14. this.drawLine(p2, z1)
  15. var z2 = linePointStack.pop()
  16. //print("2折连通点z2",z2.x,z2.y)
  17. this.drawLine(z1, z2);
  18. this.drawLine(p1, z2);
  19. }
  20. },

drawLinkLine(p1,p2)绘制(p1,p2)之间的直线。

  1. drawLine: function(p1, p2) { //绘制(p1, p2)之间的直线
  2. let ctx = this.ctx;
  3. ctx.beginPath();
  4. ctx.moveTo(p1.x * 25 + 12, p1.y * 25 + 12);
  5. ctx.lineTo(p2.x * 25 + 12, p2.y * 25 + 12);
  6. ctx.stroke();
  7. },

IsWin()检测是否尚有非未被消除的方块,即地图map中元素值非空(" "),如果没有则已经赢得了游戏。

  1. /**
  2. *#检测是否已经赢得了游戏
  3. */
  4. isWin: function() {
  5. //检测是否尚有非未被消除的方块
  6. //(非BLANK_STATE状态)
  7. for (var y = 0; y < Height; y++)
  8. for (var x = 0; x < Width; x++)
  9. if (map[x][y] != " ")
  10. return false;
  11. return true;
  12. }

以上就是基于Javascript怎么开发连连看游戏小程序的详细内容,更多关于基于Javascript怎么开发连连看游戏小程序的资料请关注九品源码其它相关文章!