用Deepseek写一个五子棋微信小程序
在当今快节奏的生活中,休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏,不仅规则简单,还能锻炼思维。最近,我借助 DeepSeek 的帮助,开发了一款五子棋微信小程序。在这篇文章中,我将分享整个开发过程,包括与 DeepSeek 的对话、代码实现思路以及最终的成果。
1. 初识 DeepSeek:从需求到实现
一开始,我对如何实现一个五子棋小程序并没有太多头绪。于是,我向 DeepSeek 提出了需求:
我:用微信小程序帮我写一个五子棋,要求功能和思路清晰。
DeepSeek 很快给出了一个清晰的实现思路和代码示例。它建议使用一个二维数组来表示棋盘,并通过点击事件实现落子功能。此外,它还提供了胜负判断的逻辑,确保游戏能够正常运行。
2. 代码实现:从零到一
2.1 棋盘与落子
DeepSeek 提供的代码中,棋盘用一个 15x15 的二维数组表示,每个元素代表棋盘上的一个交叉点。0 表示空位,1 表示黑子,2 表示白子。玩家点击棋盘时,程序会根据点击的位置更新数组,并在界面上显示对应的棋子。
// 初始化棋盘
initBoard() {const board = new Array(15);for (let i = 0; i < 15; i++) {board[i] = new Array(15).fill(0);}this.setData({ board });
}
2.2 胜负判断
每次落子后,程序会检查当前落子的位置是否形成五子连珠。DeepSeek 提供了一个高效的检查函数,通过遍历四个方向(水平、垂直、对角线、反对角线)来判断是否有五子连珠。
// 检查是否胜利
checkWin(row, col, player) {const { board } = this.data;const directions = [[1, 0], // 水平[0, 1], // 垂直[1, 1], // 对角线[1, -1] // 反对角线];for (let [dx, dy] of directions) {let count = 1;for (let i = 1; i < 5; i++) {if (board[row + i * dx] && board[row + i * dx][col + i * dy] === player) {count++;} else {break;}}for (let i = 1; i < 5; i++) {if (board[row - i * dx] && board[row - i * dx][col - i * dy] === player) {count++;} else {break;}}if (count >= 5) return true;}return false;
}
2.3 添加 AI 对手
为了让游戏更具挑战性,我向 DeepSeek 提出了新的需求:
我:帮我增加AI对手功能。
DeepSeek 很快给出了一个基于规则的 AI 实现。AI 会优先阻止玩家获胜,并尝试自己获胜。它的逻辑如下:
-
如果 AI 可以形成五子连珠,直接获胜。
-
如果玩家可以形成五子连珠,AI 会阻止。
-
如果 AI 可以形成四子连珠,优先落子。
-
如果玩家可以形成四子连珠,AI 会阻止。
-
随机选择一个空位落子。
// AI 落子逻辑
findBestMove(board) {// 优先级1:AI 可以形成五子连珠for (let i = 0; i < 15; i++) {for (let j = 0; j < 15; j++) {if (board[i][j] === 0 && this.checkPotentialWin(i, j, 2)) {return { row: i, col: j };}}}// 优先级2:阻止玩家形成五子连珠for (let i = 0; i < 15; i++) {for (let j = 0; j < 15; j++) {if (board[i][j] === 0 && this.checkPotentialWin(i, j, 1)) {return { row: i, col: j };}}}// 其他优先级...
}
3. 与 DeepSeek 的对话:从问题到解决方案
在整个开发过程中,DeepSeek 不仅提供了代码,还解释了每一步的逻辑。例如,当我询问如何实现 AI 时,它详细说明了 AI 的优先级规则,并提供了相应的代码片段。这种交互式的学习方式让我对五子棋的实现有了更深的理解。
4. 最终成果:一款优雅的五子棋小程序
经过与 DeepSeek 的合作,我成功开发了一款五子棋微信小程序。它的主要功能包括:
-
双人对战:玩家可以和朋友一起对战。
-
人机对战:玩家可以与 AI 对战,AI 具备一定的智能。
-
胜负判断:实时判断游戏结果,并显示胜利信息。
-
重新开始:游戏结束后,可以一键重置棋盘
附:完整代码
首先,创建一个微信小程序项目,项目结构如下:
five-in-a-row/
├── pages/
│ ├── index/
│ │ ├── index.js
│ │ ├── index.wxml
│ │ ├── index.wxss
│ │ └── index.json
├── app.js
├── app.json
├── app.wxss
└── project.config.json
index.wxml
- 棋盘界面
<view class="container"><view class="board"><block wx:for="{{board}}" wx:for-item="row" wx:for-index="i"><view class="row"><block wx:for="{{row}}" wx:for-item="cell" wx:for-index="j"><view class="cell" bindtap="onTap" data-row="{{i}}" data-col="{{j}}"><view class="stone {{cell === 1 ? 'black' : (cell === 2 ? 'white' : '')}}"></view></view></block></view></block></view><view class="status">{{status}}</view>
</view>
index.wxss
- 样式
.container {display: flex;flex-direction: column;align-items: center;padding: 20px;
}.board {display: flex;flex-direction: column;border: 1px solid #000;
}.row {display: flex;
}.cell {width: 40px;height: 40px;border: 1px solid #000;display: flex;justify-content: center;align-items: center;
}.stone {width: 30px;height: 30px;border-radius: 50%;
}.black {background-color: black;
}.white {background-color: white;border: 1px solid #000;
}.status {margin-top: 20px;font-size: 20px;
}
index.js
- 逻辑代码
Page({data: {board: [], // 棋盘currentPlayer: 1, // 当前玩家,1表示黑子,2表示白子status: '黑子先下', // 游戏状态gameOver: false // 游戏是否结束},onLoad() {this.initBoard();},// 初始化棋盘initBoard() {const board = new Array(15);for (let i = 0; i < 15; i++) {board[i] = new Array(15).fill(0);}this.setData({board,currentPlayer: 1,status: '黑子先下',gameOver: false});},// 点击棋盘事件onTap(e) {if (this.data.gameOver) return;const { row, col } = e.currentTarget.dataset;const { board, currentPlayer } = this.data;if (board[row][col] !== 0) return; // 该位置已经有棋子board[row][col] = currentPlayer;this.setData({ board });if (this.checkWin(row, col, currentPlayer)) {this.setData({status: currentPlayer === 1 ? '黑子胜利!' : '白子胜利!',gameOver: true});return;}const nextPlayer = currentPlayer === 1 ? 2 : 1;this.setData({currentPlayer: nextPlayer,status: nextPlayer === 1 ? '黑子下' : '白子下'});},// 检查是否胜利checkWin(row, col, player) {const { board } = this.data;const directions = [[1, 0], // 水平[0, 1], // 垂直[1, 1], // 对角线[1, -1] // 反对角线];for (let [dx, dy] of directions) {let count = 1;for (let i = 1; i < 5; i++) {if (board[row + i * dx] && board[row + i * dx][col + i * dy] === player) {count++;} else {break;}}for (let i = 1; i < 5; i++) {if (board[row - i * dx] && board[row - i * dx][col - i * dy] === player) {count++;} else {break;}}if (count >= 5) return true;}return false;},// 重新开始游戏restartGame() {this.initBoard();}
});
运行效果
-
打开微信开发者工具,导入项目。
-
运行后,你会看到一个15x15的棋盘,玩家可以点击棋盘上的交叉点落子。
-
游戏会实时判断是否有五子连珠,如果有则显示胜利信息。
-
游戏结束后,可以通过调用
restartGame
方法重新开始游戏。
相关文章:

用Deepseek写一个五子棋微信小程序
在当今快节奏的生活中,休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏,不仅规则简单,还能锻炼思维。最近,我借助 DeepSeek 的帮助,开发了一款五子棋微信小程序。在这篇文章中,我将…...
AF3 squeeze_features函数解读
AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度(singleton dimensions)和重复维度,以使其适配 AlphaFold3 预期的输入格式。 源代码: def squeeze_features(protein):&qu…...

Python 远程抓取服务器日志最后 1000行
哈喽,大家好,我是木头左! 一、神奇的 Python 工具箱 1. SSH 连接的密钥——paramiko paramiko 库提供了丰富的方法来处理 SSH 连接的各种细节。从创建连接对象,到执行远程命令,再到获取命令输出,它都能有…...

vue3+screenfull实现部分页面全屏(遇到的问题会持续更新)
需求:除了左侧菜单,右侧主体部分全部全屏 首先下载screenfull全屏插件 npm install screenfull --save页面引入 import screenfull from screenfull;我这里是右上角全屏图标 <el-iconref"elIconRef"color"#ffffff"size"2…...
Ubuntu 下 nginx-1.24.0 源码分析 (1)
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init(); 进入 main 函数 最…...

2025数据存储技术风向标:解析数据湖与数据仓库的实战效能差距
一、技术演进的十字路口 当前全球数据量正以每年65%的复合增长率激增,IDC预测到2027年企业将面临日均处理500TB数据的挑战。在这样的背景下,传统数据仓库与新兴数据湖的博弈进入白热化阶段。Gartner最新报告显示,采用混合架构的企业数据运营效…...

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评
随着边缘计算和人工智能技术的迅速发展,性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件,凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力,引起了广泛关注。本文将从配置性…...

数据结构 常见的排序算法
🌻个人主页:路飞雪吖~ 🌠专栏:数据结构 目录 🌻个人主页:路飞雪吖~ 一、插入排序 🌟直接插入排序 🌟希尔排序 二、选择排序 🌟选择排序 🌟堆排序…...
ES索引知识
索引是数据的载体,存储了文档和映射的信息 索引是具有相同结构的文档的合集体。 设置索引,不仅仅是设置索引名字,还有索引的一些配置,比如:分片和副本,刷新频率,搜索结果的最大参数,…...
FreeRTOS第17篇:FreeRTOS链表实现细节05_MiniListItem_t:FreeRTOS内存优化
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 为什么需要迷你列表项? 在嵌入式系统中,内存资源极其宝贵。FreeRTOS为满足不同场景需求,设计了标准列表项(ListItem_…...
Golang | Gin(简洁版)
文章目录 安装使用RESTful API响应页面获取请求参数路由讲解中间件 安装使用 Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖…...

RAG外挂知识库
目录 RAG的工作流程 python实现RAG 1.引入相关库及相关准备工作 函数 1. 加载并读取文档 2. 文档分割 3. embedding 4. 向集合中添加文档 5. 用户输入内容 6. 查询集合中的文档 7. 构建Prompt并生成答案 主流程 附录 函数解释 1. open() 函数语法 2.client.embe…...

Rust语言:开启高效编程之旅
目录 一、Rust 语言初相识 二、Rust 语言的独特魅力 2.1 内存安全:消除隐患的护盾 2.2 高性能:与 C/C++ 并肩的实力 2.3 强大的并发性:多线程编程的利器 2.4 跨平台性:适配多环境的优势 三、快速上手 Rust 3.1 环境搭建:为开发做准备 3.2 第一个 R…...

蓝桥杯备考:图论初解
1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…...
Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp
题目链接 题目大意 平面上给定两个点集,判定两个点集分别形成的凸多边形能否通过旋转、平移重合。 点集大小 ≤ \leq ≤ 1 0 5 10^{5} 105,坐标范围 [0, 1 0 8 10^{8} 108 ]. 思路 题意很明显,先求出凸包再判断两凸包是否同构。这里用…...
机器人匹诺曹机制,真话假话平衡机制
摘要: 本文聚焦于机器人所采用的一种“匹诺曹机制”,该机制旨在以大概率保持“虚拟鼻子”(一种象征虚假程度的概念)不会过长,通过在对话中夹杂真话与假话来实现。文章深入探讨了这一机制的原理,分析其背后的…...

用Python分割并高效处理PDF大文件
在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...

【RAG】混合检索(Hybrid Search) 提高检索精度
1.问题:向量检索也易混淆,而关键字会更精准 在实际生产中,传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有利弊。 举个具体例子,比如文档中包含很长的专有名词, 关…...

CTFHub-FastCGI协议/Redis协议
将木马进行base64编码 <?php eval($_GET[cmd]);?> 打开kali虚拟机,使用虚拟机中Gopherus-master工具 Gopherus-master工具安装 git clone https://github.com/tarunkant/Gopherus.git 进入工具目录 cd Gopherus 使用工具 python2 "位置" --expl…...

【算法day4】最长回文子串——动态规划方法
最长回文子串 给你一个字符串 s,找到 s 中最长的 回文 子串。 https://leetcode.cn/problems/longest-palindromic-substring/submissions/607962358/ 动态规划: 回文串即是从前面开始读和从后面开始读,读出来的字符串均相同的字符串&#…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...