当前位置: 首页 > article >正文

javascript五子棋小游戏,基于div+canvas的五子棋小游戏

javascript五子棋小游戏
基于div+canvas的五子棋小游戏

示例地址:链接

开始

    • 开始游戏:
    • 1.绘制棋盘
    • 2.绘制棋子
    • 3.获取棋盘所有点
    • 4.开始游戏
    • 5.判断输赢
    • 6.重新开始
    • 7.完整代码

开始游戏:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主要逻辑:

1.绘制棋盘

/**
         * 
         * 绘制棋盘
         * @param {*} point
         *  */
        function DrawBoard() {
   
            points = []
            ctx.beginPath();
            // 绘制棋盘,14*14,每格50px*50px
            for (let s = 0; s < counts + 1; s++) {
   
                //先绘制横
                ctx.moveTo(50, 50 * (s + 1));
                ctx.font = "14px Arial";
                ctx.lineTo(widths, 50 * (s + 1));
                // 绘制横的文字,从15开始
                ctx.fillText((counts + 1 - s), widths + 10, 50 * (s + 1)+4);
                points.push([50, 50 * (s + 1), widths, 50 * (s + 1)]);
                // 再绘制竖
                ctx.moveTo(50 * s + 50, 50);
                ctx.lineTo(50 * s + 50, heights);
                // 绘制底部文字
                ctx.fillText(bottomArray[s], 50 * s + 50-4, heights + 20);

            }
            ctx.closePath();
            ctx.stroke();

            if(!isStart)
             OpenDialog("开始游戏");
        }

2.绘制棋子

/** 
         * 绘制棋子
         * **/
        function DrawCircle(point2, isBlack = true) {
   

            ctx.beginPath();
            ctx.save();
            // 绘制圆形
            ctx.arc(point2.x, point2.y, gridWidth * 0.2, 0, 2 * Math.PI);
            ctx.closePath();
            // 绘制具体的颜色
            ctx.shadowColor = SHADOW_COLOR;
            ctx.shadowOffsetX = ctx.shadowOffsetY = gridWidth * 0.06; // 位置偏移来实现阴影效果
            ctx.shadowBlur = gridWidth * 0.04;
            const gradient = ctx.createRadialGradient(point2.x, point2.y, 0, point2.x, point2.y, gridWidth * 0.4); //利用镜像画面实现立体感
            gradient.addColorStop(0, isBlack ? BLACK_CHESS_TOP_COLOR : WHITE_CHESS_TOP_COLOR);
            gradient.addColorStop(1, isBlack ? BLACK_CHESS_COLOR : WHITE_CHESS_COLOR);
            ctx.fillStyle = gradient;
            ctx.fill();

            ctx.restore();//保存最开始的状态,避免被影响---canvas相当于一个画笔,颜色之类的可能会改变
        }

3.获取棋盘所有点

/**
         * 获取棋盘所有交点的坐标 
         * 
         * **/
        function getAllIntersectPoints() {
   
            pointsAll = []
            // 获取所有交点的坐标
            for (let i = 0; i < points.length; i++) {
   
                // 第一个为x轴,每个需要+50,第二个不变,3和4暂时不需要
                // 一行15个点
                for (let s = 0; s < 15; s++) {
   
                    pointsAll.push({
    x: points[i][0] + (50 * s), y: points[i][1], radius: gridWidth * 0.5, tr: i, td: s, status: -1 })
                }
            }
        }

4.开始游戏

// 棋子属性
        BLACK_CHESS_COLOR = '#000000', // 黑棋底黑
        BLACK_CHESS_TOP_COLOR = '#707070', // 黑棋顶灰,顶灰过渡到底黑+阴影=立体
        WHITE_CHESS_COLOR = '#D5D8DC',  // 白棋底灰
        WHITE_CHESS_TOP_COLOR = '#FFFFFF', // 白棋顶白,顶白过渡到底灰+阴影=立体
        SHADOW_COLOR = 'rgba(0, 0, 0, 0.5)', // 阴影颜色

        canvas.onclick = function (e) {
   
            x = e.offsetX;
            y = e.offsetY;
            if(!isStart){
   
               if (x >= 370 && x <= 390 && y >= 361 && y <= 391) {
   
                // 游戏开始
                RestartDrawPiece();
               }
 
            } 
            if(!isStart){
   
                return;
            }

            // 根据位置判断下是否在点位范围内
            for (let m = 0; m < pointsAll.length; m++) {
   
                var point2 = pointsAll[m]
                // 判断是不是在点位范围,在就获取点位
                if (Math.sqrt(Math.pow(x - point2.x, 2) + Math.pow(y - point2.y, 2)) <= point2.radius) {
   
                    if (pointsAll[m].status == -1) {
   
                        isBlack = !isBlack;
                        pointsAll[m].status = isBlack ? 1 : 0;
                        DrawCircle(pointsAll[m], isBlack);
                        if(canPlacePiece(isBlack, pointsAll[m].x, pointsAll[m].y)){
   
                            if(isBlack){
   

                                OpenD

http://www.kler.cn/a/387322.html

相关文章:

  • c/c++--struct对比
  • 手动搭建 Ghost 博客
  • 24/11/11 算法笔记 泊松融合
  • C++初阶——vector
  • 使用 wxPython 开发 Python 桌面应用程序的完整教程
  • 简单叙述 Spring 是如何解决循环依赖问题的呢?
  • 智慧水库数字孪生系统解决方案
  • HTB:Sightless[WriteUP]
  • Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!
  • 蓝桥杯-网络安全比赛(6)基础学习-JavaScript 原型链污染
  • Golang进阶
  • 【数据结构】插入排序——直接插入排序 和 希尔排序
  • Java项目实战II基于Spring Boot的疗养院管理系统设计与实现(开发文档+数据库+源码)
  • 【详细 工程向】基于Smart3D的五镜头相机三维重建
  • phpstudy 使用php8.2.9版本报错问题
  • 基于物联网的公共街道照明系统设计与构建
  • [含文档+PPT+源码等]精品基于Python实现的django房屋出租系统的设计与实现
  • 【汇编语言】[BX]和loop指令(三)—— Debug与masm的指令处理差异与loop,[bx]的联合应用
  • 单元测试、集成测试、系统测试有什么区别
  • css多列布局用法
  • 什么是Java,有什么特点
  • 【C知道】CSS3重要特性。
  • Hadoop集群的高可用(HA)- (1、搭建namenode的高可用)
  • 算法 -选择排序
  • YOLOv8实战人脸口罩识别
  • pyspark入门基础详细讲解