首页/新闻资讯/正文详情

Godot 从零做围棋05——board前期准备

发布时间:2026/11/3 19:28:23 来源:云帆数科 栏目:资讯中心
Godot 从零做围棋05——board前期准备
在之前的教程中我们已经完成了布局设计、棋盘绘制、棋子类的创建。下面我们就要开始创建board类。这个类是处理游戏规则、逻辑的。不参与其他内容。创建类的过程前几期讲过这里不再赘述。常量、状态的准备在处理逻辑之前我们要先将处理的对象以及其参数都一并声明class_name Board #全局类名 extends RefCounted #引用计数对象不挂在场景树上。用完没人引用就自动释放 const SIZE : 19 #四方形邻居 const DIRECTIONS: Array[Vector2i] [ Vector2i(1,0),#右 Vector2i(-1,0),#左 Vector2i(0,1),#下 Vector2i(0,-1),#上 ]#为后续判断棋子的气做准备 #棋盘状态 var stones : {} #棋盘现状坐标 → 棋子对象。用字典查询 O(1)空点就是不在字典里。 var history: Array[] #对局历史每一步一个 Move 对象用于悔棋。 var current_player :Stone.StoneColor.BLACK #当前该谁下黑先。 var last_move : Vector2i(-1,-1) #最后一手的坐标画标记用。(-1,-1) 表示还没下。 #打劫 var _ko_point : Vector2i(-1,-1) #打劫禁入点下一手不能下这里。下划线前缀表示内部使用。 #一步棋的记录 class Move: var color: Stone.StoneColor var position: Vector2i var captured: Array[Vector2i] func _init(p_color:Stone.StoneColor,p_position: Vector2i,p_captured: Array[Vector2i]): colorp_color positionp_position capturedp_captured #懂英文的都能看出来这里记录的分别是颜色哪个玩家下的位置、所提的子状态查询这里的查询函数为了方便后续对棋局状态进行判断然后依据规则做出相应的变化func in_bounds(pos: Vector2i) - bool: return pos.x 0 and pos.x SIZE and pos.y 0 and pos.y SIZE #检查这个点是否在棋盘落点范围内如果成立则返回true,否则返回false func is_empty(pos: Vector2i) - bool: return not stones.has(pos) #判断这个地方有没有棋子有的话返回false,有的话返回true func get_stone(pos: Vector2i) - Stone: return stones.get(pos, null) #这个位置(pos)有子返回stone,没子返回null func get_color_at(pos: Vector2i) - int: var s : get_stone(pos) return -1 if s null else s.color #返回棋子颜色空子返回-1。 func _neighbors(pos: Vector2i) - Array[Vector2i]: var result: Array[Vector2i] [] for d in DIRECTIONS: var n : pos d if in_bounds(n): result.append(n) return result #返回上下左右四个方向的落点位置的状态如果越界了则直接过滤

相关推荐

零售与数仓(一):促销后销售增长了,活动就值得继续吗?
零售与数仓(一):促销后销售增长了,活动就值得继续吗?

一场促销结束,销售额增长了,运营希望继续,采购准备增加备货。经营者却还需要回答:增长是否划算,能否持续,以及下一轮究竟应该改变什么? 本文用一家销售咖啡豆和杯子的零售店串起经营分析。案例… · 2026/11/3 19:28:23

[ adb ] adb常用调试命令
[ adb ] adb常用调试命令

!!此文章会不定时更新adb的命令!!adb root (获取超级管理员权限)重启设备(手机、车机)里的 ADB 守护进程(adbd),并让它以 root 权限运行重点&… · 2026/11/3 19:28:23

java 线程池用法
java 线程池用法

推荐创建线程池的方式示例代码:ThreadPoolExecutor executor new ThreadPoolExecutor(2, // 核心线程数5, // 最大线程数60L, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new ArrayBlo… · 2026/11/3 19:28:23

前端图片上传0KB问题解析与解决方案
前端图片上传0KB问题解析与解决方案

1. 前端图片上传0KB问题深度解析最近在VueElementUI项目中处理图片上传时,遇到了一个典型问题:部分用户上传的图片在服务器端显示为0KB的破损文件。这个问题看似简单,实则涉及前端文件处理机制、浏览器API使用规范、前后端交互协议等多个技术… · 2026/11/3 20:02:38

用ping二分法快速定位MTU故障:原理、参数与上线自检清单
用ping二分法快速定位MTU故障:原理、参数与上线自检清单

1. MTU配错到底会怎样:从三个真实症状说起MTU 这个词听起来很基础,但真正在现网里遇到它的时候,往往已经是半夜被告警叫醒的状态了。我先说三个我自己碰到过的场景,你对号入座一下,看看是不是眼熟。第一个场景&#xf… · 2026/11/3 20:02:38

Ansible Playbook进阶实战:生产级自动化技巧
Ansible Playbook进阶实战:生产级自动化技巧

1. Ansible Playbook进阶实战:从基础到生产级自动化(开头部分) 第一次接触Ansible Playbook时,我被它简洁的YAML语法和声明式编程模式深深吸引。但真正在生产环境大规模使用时,才发现那些基础教程里没讲的细节才是决定… · 2026/11/3 20:02:38

SURPAC地质建模规范:数据表、ID编号与文件命名避坑指南
SURPAC地质建模规范:数据表、ID编号与文件命名避坑指南

简介:这份文档面向地质勘探、矿产资源评价及环境监测领域的建模初学者与技术人员,系统梳理了 SURPAC 软件建模的核心知识点,帮助读者建立从数据组织到解译建模的完整认知框架。压缩包内为 1 个 docx 文件,约 17KB,内容… · 2026/11/3 20:02:38

RTDE 实时数据交换:125Hz 上限、两阶段设计与避坑指南
RTDE 实时数据交换:125Hz 上限、两阶段设计与避坑指南

简介:面向UR(优遨)机器人开发者与自动化集成工程师的RTDE接口技术手册,聚焦如何通过标准TCP/IP连接将外部程序与UR控制器同步,同时不破坏控制器实时属性,适用于现场总线驱动交互、机器人I/O操作与轨迹状态绘… · 2026/11/3 20:02:38

Firefox中文语言包安装与失效排查:版本匹配与多平台配置
Firefox中文语言包安装与失效排查:版本匹配与多平台配置

帮别人装浏览器这种事我干过不少回,最常被追问的一句话就是——为什么装完之后界面还是英文的?Firefox 中文语言包的安装方法看着简单,真动手的时候却总在几个地方卡住:语言包版本差一位装不上、xpi 文件拖进去没反应、装完重启还… · 2026/11/3 20:01:37

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码