You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pharo扫雷项目:如何实现Smalltalk单元格点击显示文本?

解决Pharo扫雷单元格点击显示文本的问题

我之前在Pharo里改造类似的小游戏时也踩过这个坑!从你给出的初始化代码来看,问题出在没有在点击事件中动态更新label内容并触发UI刷新。下面是具体的解决步骤:

1. 完善鼠标点击事件处理

首先,给你的单元格类添加mouseUp:方法,这个方法会处理点击后的文本显示和颜色切换逻辑:

mouseUp: anEvent
    super mouseUp: anEvent.
    "根据单元格状态更新显示内容"
    mineState
        ifFalse: [
            self label: cellValue asString. "将数字值转为字符串显示"
            self color: onColor ]
        ifTrue: [
            self label: '💣'. "地雷显示特殊符号"
            self color: Color red darker ].
    self changed. "强制触发UI重绘,确保更新生效"

2. 修正初始化代码的细节

你的初始化代码有几处可以优化,确保初始状态正确且响应鼠标事件:

initialize
    super initialize.
    self label: ''."初始为空文本"
    self borderWidth: 4.
    mineState := false.
    cellValue := 0.
    offColor := Color paleYellow.
    onColor := Color paleBlue darker."补全颜色赋值"
    self color: offColor."初始设置为未激活颜色"
    self extent: 32@32."用extent设置尺寸比直接修改bounds更稳妥"
    self wantsMouseEvents: true."确保Morph响应鼠标事件"

这里的wantsMouseEvents: true很关键,它会告诉Pharo这个Morph需要接收鼠标事件,否则点击不会触发mouseUp:方法。

3. 确保cellValue已正确赋值

别忘了在扫雷的棋盘生成逻辑里,给每个非地雷单元格计算并设置cellValue(周围地雷的数量)。比如在初始化棋盘的时候,遍历每个单元格,统计它周边的地雷数并赋值给cellValue,不然点击后只会显示初始的0。

4. 测试验证

你可以手动在调试器里给某个单元格设置cellValue := 3,然后点击它,看看是否显示"3"并切换到onColor。如果还是不显示,检查是否调用了self changed——这个方法是通知UI系统重绘当前Morph的关键,没有它的话,即使修改了label,界面也不会更新。

内容的提问来源于stack exchange,提问作者user8232299

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:25:57