返回顶部
首页 > 资讯 > 精选 >怎么在VUE中使用Canvas实现一个五子棋游戏
  • 805
分享到

怎么在VUE中使用Canvas实现一个五子棋游戏

2023-06-15 00:06:22 805人浏览 八月长安
摘要

怎么在Vue中使用canvas实现一个五子棋游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue是什么Vue是一套用于构建用户界面的渐进式javascript框架,Vue与

怎么在Vue中使用canvas实现一个五子棋游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

vue是什么

Vue是一套用于构建用户界面的渐进式javascript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

在布局上,五子棋相比那些目标是随机运动的游戏,实现起来相对简单许多,思路也很清晰,总共分为:

(1)画棋盘;

(2)监听点击事件画黑白棋子;

(3)每次落子之后判断是否有5子相连,有则赢。

最复杂的恐怕就是如何判断五子棋赢了,那么就先从简单的开始,画个棋盘吧~

1、画棋盘

棋盘很简单,我们画个15*15的棋盘,横线竖线相交错:

drawCheckerboard() {      // 画棋盘      let _this = this;      _this.ctx.beginPath();      _this.ctx.fillStyle = "#fff";      _this.ctx.rect(0, 0, 450, 450);      _this.ctx.fill();      for (var i = 0; i < 15; i++) {        _this.ctx.beginPath();        _this.ctx.strokeStyle = "#D6D1D1";        _this.ctx.moveTo(15 + i * 30, 15); //垂直方向画15根线,相距30px;        _this.ctx.lineTo(15 + i * 30, 435);        _this.ctx.stroke();        _this.ctx.moveTo(15, 15 + i * 30); //水平方向画15根线,相距30px;        _this.ctx.lineTo(435, 15 + i * 30);        _this.ctx.stroke();         _this.resultArr.push(new Array(15).fill(0));      }}

先用一个450 * 450 的正方形打底,四周留15宽度的空白,然后画上间隔为30的线。在for循环里,我们还初始化了一个15 * 15的二维数组,并全部填上0,没错,就是记录落子的。

怎么在VUE中使用Canvas实现一个五子棋游戏

2、监听点击事件画黑白棋子

好了,我们在获取dom的时候顺便监听一下click事件,来画棋子:

let container = document.getElementById("Gobang");

container.addEventListener("click", _this.handleClick);

handleClick(event) {      let x = event.offsetX - 70;      let y = event.offsetY - 70;      if (x < 15 || x > 435 || y < 15 || y > 435) {        // 点出界的        return;      }      this.drawChess(x, y);      if(this.winGame){        this.drawResult();        return;      }      this.whiteTurn = !this.whiteTurn;      this.drawText();}

画棋子的代码:

drawChess(x, y) {      let _this = this;      let xLine = Math.round((x - 15) / 30); // 竖线第x条      let yLine = Math.round((y - 15) / 30); // 横线第y条      if(_this.resultArr[xLine][yLine] !== 0){        return;      }      let grd = _this.ctx.createRadialGradient(        xLine * 30 + 15,        yLine * 30 + 15,        4,        xLine * 30 + 15,        yLine * 30 + 15,        10      );      grd.addColorStop(0, _this.whiteTurn ? "#fff" : "#4c4c4c");      grd.addColorStop(1, _this.whiteTurn ? "#dadada" : "#000");      _this.ctx.beginPath();      _this.ctx.fillStyle = grd;      _this.ctx.arc(        xLine * 30 + 15,        yLine * 30 + 15,        10,        0,        2 * Math.PI,        false      );      _this.ctx.fill();      _this.ctx.closePath();       _this.setResultArr(xLine, yLine);      _this.checkResult(xLine, yLine);}

很容易可以计算出点击坐标最近的那个棋盘交叉点,当然,如果那里已经落了子,就得return。然后在交点处画上白子或者黑子,这里用渐变填充使棋子看起来更像那么回事。接着,在对应的二维数组里记录一下棋子状况:

setResultArr(m, n) {      let _this = this;      _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; // 白棋为1;黑棋为2 }

怎么在VUE中使用Canvas实现一个五子棋游戏

3、检查五子棋输赢结果

输赢结果怎么判断?肉眼看去,无非就是以当前落子为0,0原点建立坐标系,然后判断0°,180°,45°和135°四条线上是否有连续5子。相比于直接遍历计数,更好的方法就是取出四条线上的数据,然后判断是否有相连的5个1或者2字符。

假设我们落子的数组坐标是[m, n]。

(1)横线的结果数组字符串:this.resultArr[m].join('');

(2)竖线的结果数组字符串:

for(let i = 0; i<15; i++){        lineHorizontal.push(_this.resultArr[i][n]);}

(3)135°(左上到右下):j从0-15,分别取this.resultArr[m - j][n -j]结果unshift进临时数组头部,取this.resultArr[m + j][n + j]放到临时数组尾部,行成结果;

(4)45°(左下到右上):j从0-15,分别取this.resultArr[m + j][n -j]结果unshift进临时数组头部,取this.resultArr[m - j][n + j]放到临时数组尾部,行成结果;

当然这里面都是要判断一下数组越界。

得到结果字符串后,我们判断是否有“22222”或者“11111”这样的字符串存在,有则说明胜利。

checkResult(m ,n){ // 判断是否有5子相连      let _this = this;      let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack;      // 取出[m,n]横竖斜四条线的一维数组      let lineVertical = _this.resultArr[m].join('');      if(lineVertical.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let lineHorizontal = [];      for(let i = 0; i<15; i++){        lineHorizontal.push(_this.resultArr[i][n]);      }      lineHorizontal = lineHorizontal.join('');      if(lineHorizontal.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let line135 = [];      for(let j = 0; j < 15; j++){        if(m - j >= 0 && n - j >= 0){ // 左上角          line135.unshift(_this.resultArr[m - j][n -j]);        }        if(j > 0 && m + j < 15 && n + j < 15){ // 右下角          line135.push(_this.resultArr[m + j][n + j]);        }      }      line135 = line135.join('');      if(line135.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let line45 = [];      for(let j = 0; j < 15; j++){        if(m + j < 15 && n - j >= 0){ // 右上角          line45.unshift(_this.resultArr[m + j][n -j]);        }        if(j > 0 && m - j >=0 && n + j < 15){ // 左下角          line45.push(_this.resultArr[m - j][n + j]);        }      }      line45 = line45.join('');      if(line45.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }}

最后胜出,我们显示一下是哪方获胜。

怎么在VUE中使用Canvas实现一个五子棋游戏

至此,一个简单的黑白棋游戏就做好了~~~~~

老规矩,源码贴上:

<template>  <div class="gobang">    <canvas id="gobang" width="800" height="600"></canvas>  </div></template> <script>const CheckStrWhite = "11111";const CheckStrBlack = "22222";export default {  name: "Gobang",  data() {    return {      ctx: null,      winGame: false,      whiteTurn: false, // 白棋轮;true-黑棋轮      resultArr: [] // 记录棋子位置的数组    };  },  mounted() {    let _this = this;    let container = document.getElementById("gobang");     container.addEventListener("click", _this.handleClick);     _this.ctx = container.getContext("2d");    _this.ctx.translate(70,70);    _this.drawCheckerboard();  },  computed:{    chessText(){      return this.whiteTurn ? '白棋' : '黑棋';    }  },  methods: {    drawCheckerboard() {      // 画棋盘      let _this = this;      _this.ctx.beginPath();      _this.ctx.fillStyle = "#fff";      _this.ctx.rect(0, 0, 450, 450);      _this.ctx.fill();      for (var i = 0; i < 15; i++) {        _this.ctx.beginPath();        _this.ctx.strokeStyle = "#D6D1D1";        _this.ctx.moveTo(15 + i * 30, 15); //垂直方向画15根线,相距30px;        _this.ctx.lineTo(15 + i * 30, 435);        _this.ctx.stroke();        _this.ctx.moveTo(15, 15 + i * 30); //水平方向画15根线,相距30px;棋盘为14*14;        _this.ctx.lineTo(435, 15 + i * 30);        _this.ctx.stroke();         _this.resultArr.push(new Array(15).fill(0));      }      _this.drawText();    },    drawChess(x, y) {      let _this = this;      let xLine = Math.round((x - 15) / 30); // 竖线第x条      let yLine = Math.round((y - 15) / 30); // 横线第y条      if(_this.resultArr[xLine][yLine] !== 0){        return;      }      let grd = _this.ctx.createRadialGradient(        xLine * 30 + 15,        yLine * 30 + 15,        4,        xLine * 30 + 15,        yLine * 30 + 15,        10      );      grd.addColorStop(0, _this.whiteTurn ? "#fff" : "#4c4c4c");      grd.addColorStop(1, _this.whiteTurn ? "#dadada" : "#000");      _this.ctx.beginPath();      _this.ctx.fillStyle = grd;      _this.ctx.arc(        xLine * 30 + 15,        yLine * 30 + 15,        10,        0,        2 * Math.PI,        false      );      _this.ctx.fill();      _this.ctx.closePath();       _this.setResultArr(xLine, yLine);      _this.checkResult(xLine, yLine);    },    setResultArr(m, n) {      let _this = this;      _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; // 白棋为1;黑棋为2     },        checkResult(m ,n){ // 判断是否有5子相连      let _this = this;      let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack;      // 取出[m,n]横竖斜四条线的一维数组      let lineVertical = _this.resultArr[m].join('');      if(lineVertical.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let lineHorizontal = [];      for(let i = 0; i<15; i++){        lineHorizontal.push(_this.resultArr[i][n]);      }      lineHorizontal = lineHorizontal.join('');      if(lineHorizontal.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let line135 = [];      for(let j = 0; j < 15; j++){        if(m - j >= 0 && n - j >= 0){ // 左上角          line135.unshift(_this.resultArr[m - j][n -j]);        }        if(j > 0 && m + j < 15 && n + j < 15){ // 右下角          line135.push(_this.resultArr[m + j][n + j]);        }      }      line135 = line135.join('');      if(line135.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }      let line45 = [];      for(let j = 0; j < 15; j++){        if(m + j < 15 && n - j >= 0){ // 右上角          line45.unshift(_this.resultArr[m + j][n -j]);        }        if(j > 0 && m - j >=0 && n + j < 15){ // 左下角          line45.push(_this.resultArr[m - j][n + j]);        }      }      line45 = line45.join('');      if(line45.indexOf(checkStr) > -1){        _this.winGame = true;        return;      }    },    drawText(){      let _this = this;      _this.ctx.clearRect(435 + 60, 0, 100, 70);      _this.ctx.fillStyle = "#fff";      _this.ctx.font="20px Arial";      _this.ctx.fillText('本轮:' + _this.chessText, 435 + 70,  35);    },    drawResult(){      let _this = this;      _this.ctx.fillStyle = "#ff2424";      _this.ctx.font="20px Arial";      _this.ctx.fillText(_this.chessText+'胜!', 435 + 70,  70);    },    handleClick(event) {      let x = event.offsetX - 70;      let y = event.offsetY - 70;      if (x < 15 || x > 435 || y < 15 || y > 435) {        // 点出界的        return;      }      this.drawChess(x, y);      if(this.winGame){        this.drawResult();        return;      }      this.whiteTurn = !this.whiteTurn;      this.drawText();    }  }};</script> <!-- Add "scoped" attribute to limit CSS to this component only --><style scoped lang="scss">.gobang {  #gobang {    background: #2a4546;  }}</style>

看完上述内容,你们掌握怎么在VUE中使用Canvas实现一个五子棋游戏的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么在VUE中使用Canvas实现一个五子棋游戏

本文链接: https://lsjlt.com/news/276172.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在VUE中使用Canvas实现一个五子棋游戏
    怎么在VUE中使用Canvas实现一个五子棋游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与...
    99+
    2023-06-15
  • JavaScript+canvas实现五子棋游戏
    本文实例为大家分享了JavaScript+canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下 效果截图: 代码实现: <!DOCTYPE html> &l...
    99+
    2024-04-02
  • 怎么使用Vue开发一个五子棋小游戏
    这篇文章主要讲解了“怎么使用Vue开发一个五子棋小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Vue开发一个五子棋小游戏”吧!1.绘制游戏区域和游戏元素开始写代码之前,一定要记...
    99+
    2023-07-02
  • Vue实现五子棋小游戏
    本文实例为大家分享了Vue实现五子棋小游戏的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head>   ...
    99+
    2024-04-02
  • 使用QT如何实现一个五子棋游戏
    今天就跟大家聊聊有关使用QT如何实现一个五子棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。FIR.pro QT    &nbs...
    99+
    2023-06-15
  • VUE+Canvas实现简单五子棋游戏的全过程
    前言 在布局上,五子棋相比那些目标是随机运动的游戏,实现起来相对简单许多,思路也很清晰,总共分为: (1)画棋盘; (2)监听点击事件画黑白棋子; (3)每次落子之后判断是否有5子相...
    99+
    2024-04-02
  • 使用C语言实现五子棋游戏
    目录一、实现的目的和意义二、实现内容描述三、实现原理四、实现模块五子棋实现分为三大模块五、模块代码分析六、实现结果七、总结本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参...
    99+
    2022-11-13
    C语言 五子棋
  • 怎么用C语言实现五子棋游戏
    这篇文章主要介绍“怎么用C语言实现五子棋游戏”,在日常操作中,相信很多人在怎么用C语言实现五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现五子棋游戏”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • 怎么用python代码实现五子棋游戏
    这篇文章主要介绍“怎么用python代码实现五子棋游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用python代码实现五子棋游戏”文章能帮助大家解决问题。先上代码 #调用pygam...
    99+
    2023-06-30
  • 用C语言实现五子棋游戏
    C语言写五子棋,使用多文件形式,使用代码看起来更好看;在这里我实现的功能是双人博弈,如果要实现人机对战,那么代码就会很复杂; 一.main.c 在主调函数中首先要提供一个给用户选择的...
    99+
    2024-04-02
  • 怎么使用python+pygame实现简易五子棋小游戏
    本篇内容主要讲解“怎么使用python+pygame实现简易五子棋小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用python+pygame实现简易五子棋小游戏”吧!tkinter库...
    99+
    2023-07-05
  • 怎么用Js写一个简单的五子棋小游戏
    这篇文章主要讲解了“怎么用Js写一个简单的五子棋小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Js写一个简单的五子棋小游戏”吧!这里的五子棋只做一些基础的功能,对于相对专业的规则...
    99+
    2023-07-02
  • java怎么实现简单五子棋小游戏
    本篇文章为大家展示了java怎么实现简单五子棋小游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。讲解五子棋,实际上就是用一个数组来实现的。没有其他很复杂的结构。首先我们制作五子棋,先要有一个棋盘。...
    99+
    2023-06-26
  • Java怎么实现简单的五子棋游戏
    本文小编为大家详细介绍“Java怎么实现简单的五子棋游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么实现简单的五子棋游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。项目结构这个是在网上找的资源,...
    99+
    2023-06-30
  • Java怎么实现简易五子棋小游戏
    这篇文章主要介绍“Java怎么实现简易五子棋小游戏”,在日常操作中,相信很多人在Java怎么实现简易五子棋小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么实现简易五子棋小游戏”的疑惑有所帮助!...
    99+
    2023-06-30
  • 如何使用pygame实现简单五子棋游戏
    小编给大家分享一下如何使用pygame实现简单五子棋游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下看代码:①Gomuku2.py:import&n...
    99+
    2023-06-28
  • 用C语言实现五子棋小游戏
    简介 本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。 我们额外用到的头文件有: #include<getch.h>  Q...
    99+
    2024-04-02
  • 利用C语言实现五子棋游戏
    本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参考,具体内容如下 一、前言 本文将先介绍五子棋运行所需要的函数,最后串联成完整代码。 我们需要实现的功能有:1.菜单men...
    99+
    2024-04-02
  • C++应用实现简易五子棋游戏
    本文实例为大家分享了C++实现简易五子棋游戏位的具体代码,供大家参考,具体内容如下 在实现五子棋小游戏时,首先应该分为棋盘和玩家,我们先定义两个类:chessboard、player...
    99+
    2024-04-02
  • 怎么利用C语言实现AI五子棋游戏
    本篇内容介绍了“怎么利用C语言实现AI五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一.如何实现二.实现代码及分析(1)菜单的...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作