古老的五子棋

午休忽然想起我奶奶喜欢下的一种古老的五子棋游戏,于是花了半小时开发出来了~

源代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>棋盘图案</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #faf1c0;
        }
        canvas {
            background-color: #DAA520; /* 黄棕色 */
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <canvas id="chessboard" width="600" height="600"></canvas>

    <script>
        const canvas = document.getElementById('chessboard');
        const ctx = canvas.getContext('2d');

        // 棋子信息存储
        let pieces = [];

        // 棋盘信息存储
        let board = { size: canvas.width, margin: canvas.width * 0.05, step: (canvas.width - canvas.width * 0.1) / 4 };
        board.drawableSize = board.size - 2 * board.margin;

        // 当前拖拽的棋子
        let currentPiece = null;

        function drawPiece(x, y, color, isDragging = false) {
            const radius = board.size / 28;  // 棋子的半径,可以根据需要调整
            ctx.beginPath();
            ctx.arc(x, y, radius, 0, Math.PI * 2);
            ctx.fillStyle = color;
            ctx.fill();
            if (isDragging) {
                ctx.strokeStyle = 'red';
                ctx.stroke();
            }
            ctx.closePath();
            return { x, y, radius, color };
        }

        function drawChessboard() {
            ctx.clearRect(0, 0, board.size, board.size);
            for (let i = 0; i <= 4; i++) {
                ctx.moveTo(board.margin, board.margin + i * board.step);
                ctx.lineTo(board.margin + board.drawableSize, board.margin + i * board.step);
                ctx.moveTo(board.margin + i * board.step, board.margin);
                ctx.lineTo(board.margin + i * board.step, board.margin + board.drawableSize);
            }
            let size = board.size
            let step = board.step
            let margin =  board.margin

            // 画对角线
            ctx.moveTo(margin, margin);
            ctx.lineTo(size-margin, size-margin);

            ctx.moveTo(margin, size-margin);
            ctx.lineTo(size-margin, margin);

            ctx.moveTo(margin, 2*step+margin);
            ctx.lineTo(2 * step+margin, size-margin);

            ctx.moveTo(2*step+margin, margin);
            ctx.lineTo(size-margin, 2 * step+margin);

            ctx.moveTo(margin, 2 * step+margin);
            ctx.lineTo(2 * step+margin, margin);

            ctx.moveTo(2*step+margin, size-margin);
            ctx.lineTo(size-margin, 2*step+margin);
            ctx.stroke();
        
            ctx.stroke();
        }

        // 初始化棋子
        function initPieces() {
            pieces = [];
            // 画白色棋子
            for (let i = 0; i <= 4; i++) {
                pieces.push(drawPiece(i * board.step + board.margin, board.margin, 'white'));
            }

            // 画黑色棋子
            for (let i = 0; i <= 4; i++) {
                pieces.push(drawPiece(i * board.step + board.margin, board.size - board.margin, 'black'));
            }
        }

        // 检测坐标是否在棋子上
        function isPieceUnderCoordinate(x, y, piece) {
            const distance = Math.sqrt((x - piece.x) ** 2 + (y - piece.y) ** 2);
            return distance < piece.radius;
        }

        // 开始拖拽
        canvas.onmousedown = function(event) {
            const rect = canvas.getBoundingClientRect();
            const x = event.clientX - rect.left;
            const y = event.clientY - rect.top;
            for (const piece of pieces) {
                if (isPieceUnderCoordinate(x, y, piece)) {
                    currentPiece = piece;
                    break;
                }
            }
        };

        // 拖拽移动
        canvas.onmousemove = function(event) {
            if (currentPiece) {
                const rect = canvas.getBoundingClientRect();
                const x = event.clientX - rect.left;
                const y = event.clientY - rect.top;
                drawChessboard();
                for (const piece of pieces) {
                    if (piece === currentPiece) {
                        drawPiece(x, y, piece.color, true);
                    } else {
                        drawPiece(piece.x, piece.y, piece.color);
                    }
                }
            }
        };

        // 放下棋子
        canvas.onmouseup = function(event) {
            if (currentPiece) {
                const rect = canvas.getBoundingClientRect();
                const x = event.clientX - rect.left;
                const y = event.clientY - rect.top;

                // 计算最接近的交点
                const closestX = Math.round((x - board.margin) / board.step) * board.step + board.margin;
                const closestY = Math.round((y - board.margin) / board.step) * board.step + board.margin;

                // 更新棋子位置
                currentPiece.x = closestX;
                currentPiece.y = closestY;

                drawChessboard();
                for (const piece of pieces) {
                    drawPiece(piece.x, piece.y, piece.color);
                }
            }
            currentPiece = null;
        };
        // 双击切换棋子颜色
        canvas.ondblclick = function(event) {
            const rect = canvas.getBoundingClientRect();
            const x = event.clientX - rect.left;
            const y = event.clientY - rect.top;
            for (const piece of pieces) {
                if (isPieceUnderCoordinate(x, y, piece)) {
                    // 切换颜色
                    piece.color = piece.color === 'white' ? 'black' : 'white';

                    // 重新绘制棋盘和棋子
                    drawChessboard();
                    for (const piece of pieces) {
                        drawPiece(piece.x, piece.y, piece.color);
                    }
                    break;
                }
            }
        };

        drawChessboard();
        initPieces();
    </script>
</body>
</html>

效果图:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
晓庄学院 《JAVA程序设计》课程设计报告 "题 目: " 五子棋游戏的设计与实现 " "姓 名: "野 " "学 号: "12130818 " "班 级: "12软件工程转本2班 " "指导教师: "王峥 " "完成时间 "7月1日 " "成 绩: " " 信息工程学院 2015年6月 目录 1引言1 1.1系统开发背景2 1.1系统开发的目的和意义3 1.2完成的主要工作4 2需求分析和总体设计4 2.1需求分析与设计思路5 2.1.1关键技术说明5 2.1.2需求分析5 2.1.3系统设计方案与思路5 2.1.4系统目录结构说明5 2.2系统功能结构6 3详细设计7 3.1系统模块实现9 4系统运行结果10 5课程设计总结12 五子棋游戏的设计与实现 引言 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在"尧 造围棋"之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之 处,因为古代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有"女娲造人 ,伏羲做棋"一说,《增山海经》中记载:"休舆之山有石焉,名曰帝台之棋,五色而文 状鹑卵。"善注引三国淳《艺经》中曰:"棋局,纵横各十七道,合二百八十九道,白黑 棋子,各一百五十枚"。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头 为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五 子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子后代中遍及开来。 1 系统开发背景 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为了人们日常生活中 的一部分,越来越多的人使用计算机办公、娱乐等等。在这其中,系统自带的小游戏 也占据了相当重要的地位,与那些网络游戏和3D游戏相比,它有编写简单容易上手等 特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和 娱乐为目的,不仅给紧工作的人们以放松,还可以让人们的大脑得到开发。 2 完成的主要工作 设计一个15 15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能: 1.选择黑子先下 2.设置双方下棋总共时长 3.刷新重新开始 4.悔棋 5.认输 6.退出提示 实现一个简单的多用户五子棋的游戏程序,包括如下两个界面 (1)选择对弈桌(执黑、执白)。 (2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负); 1.3需求分析与设计思路 1. 用户需求调查分析 2. 构思代码模块 3. 总体设计 4. 详细设计 5. 代码编写 2需求分析和总体设计 1. 2. 4 需求分析与设计思路 此系统为智力游戏,采用JAVA的MVC模式,根据不同功能划分不同模块,该五子棋 游戏功能虽然简单,然是实现了人机对战,所以从这个角度来说,此款游戏能准确的 计算棋局。虽然系统不大,但是可以实现基本的五子棋功能,以及悔棋。 2.1.2需求分析 五子棋,是一种两人对弈的纯策略型棋类游戏,亦称"串珠"、"连五子";是中国 民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历 史还要悠久。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在 炎黄子后代中遍及开来。 五子棋发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜; 不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。 2.1.3设计方案与思路 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15X15,棋子放置于棋 盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以 上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所 以也可以用纸和笔来进行游戏。 2.1.4系统目录结构说明 对系统包结构、文件结构列表说明,如表2-1、2-2所示。 表2-1主页面表 "包名 "作用 " "src "容纳所有文件 " 表2-2文件表 "文件名 "作用 " "Game.java "运行文件 " "GameFrame.java " " "Cheerup.java " " "PaintPanel.java " " 5 系统功能结构 3.1详细设计 1. 系统模块实现 "按钮 "事件 " "悔棋事件 "class Back implements ActionListener " "认输事件 "class Fail extends JFrame implementsActionListener" "关于事件 "class About extends JFrame implements " " "ActionListener " "设置事件 "class Set implements ActionListener " "退出事件 "classExite

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值