本游戏制作基于Godot4.6稳定版,windows11。
一、新建一个项目
打开Godot版本管理器,点击新建:

填写好项目名称,设置好项目路径后,点击创建:

创建好后,将自动打开编辑界面,本项目是2D游戏项目,点击上方"2D"切换为2D开发视角:

二、规范项目文件夹:
这步应该在第三步之前,我这里的顺序有点问题,先不需要管上方的场景里的已有内容。
在左侧下方的文件系统,右键"res://",创建三个文件夹,命名为"场景"、"代码"、"美术音乐资源":


全部完成后,我们的项目资源应该长这个样子:

三、创建主场景
在左侧场景面板中,点击"其他节点":

弹出的界面,找到并选择"Control"节点,点击创建,此时该节点会出现在左侧场景栏,右键选中该节点,并将其重命名为"main":


选中"main"节点,点击左上角加号添加子节点:

在弹出窗口中,找到"GridContainer"节点,点击添加:

创建好后,可以看到该节点被挂载在"main"节点下,成为其子节点。右键重命名为"grid":

在右侧"检查器"面板,找到"Columns"(列)属性,将其设置为10:

ctrl+s,保存当前场景至"场景"文件夹:

四、创建格子子场景
右键"场景"文件夹,新建一个场景:

弹出界面中,点击选取根节点类型:

找到"Control"节点,点击选取:

场景名称输入"tile",点击确定:

在新场景中,点击右上角加号创建子节点:

找到"ColorRect",点击创建:

在右侧检查器中,设置一个喜欢的颜色:


ctrl+s,保存场景。
五、在主场景中添加脚本:
双击文件系统中的"main.tscn",打开主场景。选中"main"节点,点击上方按钮为其添加一个脚本:

保持默认设置,在路径处,选择我们创建好的"代码"文件夹:


选择好后,点击创建:

此时,编辑器会自动打开代码编辑界面:

接下来,我们来完成代码:
python
extends Control
# 常量定义
const GRID_SIZE = 10 # 网格大小为10x10
const TILE_SCENE = preload("res://场景/tile.tscn") # 预加载格子场景
# 变量定义
var tiles: Array = [] # 存储所有格子节点
# 节点绑定
@onready var grid: GridContainer = $grid
func _ready():
_init_grid() # 初始化网格
# 初始化网格函数
func _init_grid():
for i in range(GRID_SIZE * GRID_SIZE):
# 实例化格子场景
var tile = TILE_SCENE.instantiate()
# 设置格子大小为50x50像素
tile.custom_minimum_size = Vector2(50, 50)
# 将格子添加到GridContainer中
grid.add_child(tile)
# 将格子存入数组,方便后续管理
tiles.append(tile)
ctrl+s保存脚本。
六、代码详细解释
6.1 基础继承
python
extends Control
声明这个脚本属于Control节点(主场景的根节点是 Control),脚本可以使用 Control 节点的所有属性和方法(比如添加子节点、设置布局等)。
6.2 常量定义
python
const GRID_SIZE = 10 # 网格大小为10x10
- const:关键字,表示这是 "常量",一旦定义就不能修改(比如后续代码里不能写GRID_SIZE = 15),适合存储固定的配置参数。
- GRID_SIZE:变量名(大写是行业惯例,区分常量和普通变量),代表网格的行数 / 列数(10×10)。
- 为什么用常量:如果后续想改成 9×9 或 16×16,只需要改这一行,不用改所有用到 "10" 的地方,方便维护。
python
const TILE_SCENE = preload("res://场景/tile.tscn") # 预加载格子场景
- preload():Godot 的预加载函数,作用是 "提前加载场景文件到内存",避免运行时临时加载导致卡顿。
- "res://场景/tile.tscn":场景文件的路径(res://是 Godot 的项目根目录),指向我们创建的 "单个格子" 场景。
- 作用:把 tile.tscn 这个场景文件 "存" 到TILE_SCENE常量里,后续可以直接用它创建格子实例,不用每次都写路径。
6.3 普通变量
python
var tiles: Array = [] # 存储所有格子节点
- var:声明普通变量(可以修改)。
- :Array:类型注解,明确这个变量是 "数组" 类型(Godot 4.x 推荐写类型注解,方便编辑器提示和排错)。
- = []:初始化数组为空数组。
- 核心作用:后续生成的 100 个格子节点都会存入这个数组,方便后续操作(比如给每个格子加点击事件、计算周围地雷数)------ 如果不存数组,后续想找到某个格子会非常麻烦。
6.4 节点绑定
python
@onready var grid: GridContainer = $grid
- @onready:关键注解!表示 "当节点准备好(_ready 函数执行前),再执行这个赋值"。如果没有@onready,直接写var grid = $grid,会因为节点还没加载完成导致grid为null(空),后续调用grid.add_child()会报错。
- :GridContainer:类型注解,明确grid变量是GridContainer类型的节点。
- $grid:节点路径简写,等价于get_node("grid"),作用是"找到当前节点下名为grid的子节点"(也就是我们创建的 GridContainer 节点)。
- 作用:把场景里的 GridContainer 节点 "绑定" 到grid变量上,后续可以通过grid直接操作这个节点(比如添加子节点、设置列数)。
6.5 生命周期函数
python
func _ready():
_init_grid() # 初始化网格
- func:声明函数(方法)。
- _ready():Godot 的内置生命周期函数,作用是 "当节点及其所有子节点都加载完成后,自动执行这个函数"------ 游戏启动后,这个函数是第一个执行的核心函数。
- _init_grid():调用我们自定义的 "初始化网格" 函数,把核心逻辑拆到单独函数里,代码更清晰(避免所有逻辑都堆在_ready 里)。
6.6 核心函数
python
func _init_grid():
for i in range(GRID_SIZE * GRID_SIZE):
# 实例化格子场景
var tile = TILE_SCENE.instantiate()
# 设置格子大小为50x50像素
tile.custom_minimum_size = Vector2(50, 50)
# 将格子添加到GridContainer中
grid.add_child(tile)
# 将格子存入数组,方便后续管理
tiles.append(tile)
(1)循环生成100个格子 for i in range(GRID_SIZE * GRID_SIZE):
- for i in range():循环语句,range(GRID_SIZE * GRID_SIZE)等价于range(100),会循环 100 次(i 从 0 到 99)。
- GRID_SIZE * GRID_SIZE:10×10=100,代表需要生成 100 个格子,这样写比直接写range(100)更灵活(改 GRID_SIZE 后循环次数自动变)。
(2)创建格子实例 var tile = TILE_SCENE.instantiate():
- instantiate():实例化函数,作用是 "把预加载的 Tile.tscn 场景变成可使用的节点实例"。相当于 "用 tile.tscn 这个'模板',打印出一个具体的格子节点",每次调用 instantiate () 都会生成一个新的格子。
- var tile:临时变量,存储当前循环生成的这个格子实例。
(3)设置格子大小 tile.custom_minimum_size = Vector2(50, 50):
- custom_minimum_size:Control 节点的属性,代表 "节点的最小尺寸",GridContainer 会根据这个尺寸自动排列格子。
- Vector2(50, 50):Godot 的二维向量类型,这里代表 "宽度 50 像素,高度 50 像素"。
- 作用:确保每个格子都是 50×50 的正方形,不会因为内容为空而缩成一条线。
(4)添加到网格容器 grid.add_child(tile):
- add_child(tile):Node 节点的核心方法,作用是 "把 tile 这个节点添加为 grid 的子节点"。
- 关键逻辑:GridContainer 会自动把所有子节点排成网格(因为我们之前设置了 Grid 的列数为 10),所以添加 100 个格子后,会自动排成 10 列、10 行的矩阵。
(5)存入数组 tiles.append(tile):
- append(tile):数组的添加方法,把当前生成的格子实例存入tiles数组。
- 核心意义:这一步是后续所有功能的基础!比如要给每个格子加点击事件、 要随机埋雷,都需要通过这个数组找到对应的格子。如果不存数组,后续想操作某个格子会非常困难。
六、运行测试
点击编辑器右上方开始按钮:

若我们没有提前选择一个主场景,系统会提示让我们选择一个主场景,我们点击选择当前即可:

可以看到一个窗口,里面是10×10的红色块矩阵,第一阶段开发已完成:

下一节,我们将完成鼠标的简单交互。