蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析

备考季又到关键节点------第十八届蓝桥杯 STEMA 11 月省考报名将于 11 月 9 日 16:00 截止 (Scratch 组 11 月 22 日 10:00--11:30 开考,90 分钟),中国电子学会 2026 年 12 月图形化考级报名 9 月 23 日---12 月 2 日、统考 12 月 13 日 ,全国青少年信息素养大赛 2026---2027 赛季也已进入报名 / 基础能力评估窗口(复赛 2027 年 5---7 月、总决赛 2027 年 7---8 月)。这三大标志性赛事的图形化考点高度重合:列表、循环、条件、变量、自制积木、广播"六件套"几乎必考。今天用一个原创项目「校园黑白棋人机对战」,把这六件套一次性串起来,一篇顶三篇备考。

一、项目目标(原创题)

在 8×8 的棋盘上实现黑白棋(Reversi / 奥赛罗)人机对战:

  • 黑棋先手,玩家执黑、电脑执白;
  • 点击空格落子,若能在 8 个方向中的任意一条上"夹住"对方棋子,则把被夹住的棋子全部翻转成己方颜色;
  • 若无任何合法落子点则自动跳过回合(连续双方无步可走则终局);
  • 棋盘填满或双方均无步可走时,按子数多者获胜;
  • 电脑采用"贪心 + 位置权重"策略,能避开角旁、抢占角点。

这个项目把"数据用列表存、规则用循环判、状态用变量管、复用逻辑用自制积木、模块解耦用广播"讲得明明白白,正是三大赛事图形化组的高频考点。

二、核心考点(六件套对照)

考点 在本项目中的落点
列表 棋盘 一维列表存 64 格状态:0 空 / 1 黑 / 2 白
变量 当前回合(1 黑 / 2 白)、黑子数、白子数、胜者、游戏状态、连续跳过
循环 遍历 8 个方向向量、遍历 64 格重绘棋盘、遍历所有候选点找合法落子
条件 落子是否合法(至少一个方向能夹子)、翻转边界、终局判定、胜负比对
自制积木 画棋盘、判合法落子(行,列,颜色)、翻转(行,列,方向)、电脑落子、重置一局、判定胜负
广播 开始游戏 / 玩家落子 / 电脑思考 / 游戏结束 / 重置,逻辑与表现分离

提示:图形化考级(尤其是电子学会三级、四级)很喜欢考查"列表当二维数组用"和"自制积木带参数",黑白棋两者都覆盖。

三、解法拆解(文字流程 + 积木思路)

3.1 初始化棋盘

用一维列表 棋盘 长度 64,下标 = 行×8 + 列。开局只在中心四格放子:

  • 棋盘[27] = 2(白)、棋盘[28] = 1(黑)
  • 棋盘[35] = 1(黑)、棋盘[36] = 2(白)

然后调用 画棋盘 克隆体画出 64 格与棋子,并广播 开始游戏。

3.2 判合法落子(核心积木)

自制积木 判合法落子(行 r, 列 c, 颜色 my):

  1. 若 棋盘[r*8+c] 非空,直接返回"不合法";

  2. 定义 8 个方向向量 (dr,dc) ∈ {(-1,-1),(-1,0),...,(1,1)};

  3. 对每个方向,沿该方向一格格走:遇到"对方颜色"就继续,遇到"己方颜色"且中途至少夹了 1 颗对方子 → 该方向合法;遇到空格或越界则否决该方向;

  4. 任一方向合法即整体合法。

    伪代码(文字流程):
    合法 = 假
    若 棋盘[r8+c] ≠ 0: 返回 假
    对 每个方向(dr,dc):
    x=r+dr, y=c+dc, 夹住=0
    当 在界内 且 棋盘[x
    8+y]=对方色:
    x+=dr, y+=dc, 夹住+=1
    若 在界内 且 棋盘[x*8+y]=my 且 夹住>0:
    合法 = 真
    返回 合法

3.3 翻转棋子

翻转(行 r, 列 c, 颜色 my):对每个"刚才判定合法"的方向,把该方向夹住的对方子依次改成 my,并同步更新 黑子数 / 白子数。

3.4 电脑落子(基础版)

电脑落子 遍历全部 64 格,用 判合法落子 筛出所有合法点,选"翻转数最多"的那个落子(平局时可加随机或位置权重)。落子后翻子、切换 当前回合,再广播 玩家落子 把控制权交还玩家。

3.5 终局与胜负

每次落子后检查:若玩家和电脑都"无合法落子",广播 游戏结束。判定胜负 比较 黑子数 / 白子数:多者胜,相等则平局,并把结果写进 胜者 变量;播报角色只听广播说话,实现逻辑与表现分离。

四、运行效果

  • 玩家点击空格 → 合法则"啪"地翻转一片白子,分数实时变化;
  • 电脑思考 0.5 秒后落子,会优先抢角、避开危险格;
  • 一方无步可走时自动 pass,HUD 提示"对方跳过";
  • 终局弹窗显示"黑棋 X : Y 白棋,你赢了 / 惜败 / 平局",并可一键 重置一局 再来。

五、进阶(提分点)

  1. 位置权重表:给 8×8 每格打分(角 +100、邻角 -25、边 +10、普通 +1),电脑改用"权重最高"而非单纯"翻最多",棋力明显上升。
  2. Minimax 搜索:向前看 2--4 层,对手模拟"最优应对",自己选"最坏情况下最好"的落子。图形化里可用"递归自制积木 + 列表存棋盘快照"实现。
  3. 合法步高亮:轮到玩家时,用浅色框标出所有可落子点,体验更好,也顺带考查"条件 + 克隆体"配合。
  4. 悔棋 / 复盘:用第二个列表把每步前的棋盘备份,点击"悔棋"还原上一快照。

下面给出一段 Python 同构对照,帮助理解"列表存盘 + 八方向翻转 + 贪心 AI"的核心算法(图形化积木和这段代码逻辑一一对应):

python 复制代码
# 校园黑白棋核心算法(Python 同构对照)
EMPTY, BLACK, WHITE = 0, 1, 2
DIRS = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]

def opponent(c):
    return WHITE if c == BLACK else BLACK

def in_board(r, c):
    return 0 <= r < 8 and 0 <= c < 8

def legal_moves(board, me):
    """返回所有合法落子下标列表"""
    opp = opponent(me)
    moves = []
    for i in range(64):
        if board[i] != EMPTY:
            continue
        r, c = divmod(i, 8)
        ok = False
        for dr, dc in DIRS:
            x, y, cnt = r + dr, c + dc, 0
            while in_board(x, y) and board[x*8+y] == opp:
                x += dr; y += dc; cnt += 1
            if in_board(x, y) and board[x*8+y] == me and cnt > 0:
                ok = True; break
        if ok:
            moves.append(i)
    return moves

def flip(board, i, me):
    """在 i 落 me 色,翻转所有被夹住的对方子,返回翻转数"""
    opp = opponent(me)
    r, c = divmod(i, 8)
    board[i] = me
    total = 0
    for dr, dc in DIRS:
        x, y = r + dr, c + dc
        path = []
        while in_board(x, y) and board[x*8+y] == opp:
            path.append(x*8+y); x += dr; y += dc
        if in_board(x, y) and board[x*8+y] == me:
            for p in path:
                board[p] = me; total += 1
    return total

def greedy_ai(board, me):
    """贪心:选翻转数最多的合法点;平局取位置权重最高"""
    WEIGHT = [120,-20,20,5,5,20,-20,120,
              -20,-40,-5,-5,-5,-5,-40,-20,
              20,-5,15,3,3,15,-5,20,
              5,-5,3,3,3,3,-5,5,
              5,-5,3,3,3,3,-5,5,
              20,-5,15,3,3,15,-5,20,
              -20,-40,-5,-5,-5,-5,-40,-20,
              120,-20,20,5,5,20,-20,120]
    best, best_key = None, (-1, 0)
    for i in legal_moves(board, me):
        b2 = board[:]
        n = flip(b2, i, me)
        key = (n, WEIGHT[i])
        if key > best_key:
            best, best_key = i, key
    return best

# 演示一局:黑先手,白用贪心 AI
board = [EMPTY] * 64
board[27], board[28], board[35], board[36] = WHITE, BLACK, BLACK, WHITE
turn = BLACK
while True:
    mv = legal_moves(board, turn) if turn == BLACK else [greedy_ai(board, turn)]
    if not mv:
        if not legal_moves(board, opponent(turn)):
            break
        turn = opponent(turn); continue
    flip(board, mv[0], turn)
    turn = opponent(turn)
black = board.count(BLACK); white = board.count(WHITE)
print(f"终局 黑 {black} : {white} 白 -> {'黑胜' if black>white else '白胜' if white>black else '平局'}")

把这段逻辑平移到图形化里,就是把 board 换成 棋盘 列表、flip 换成 翻转 自制积木、greedy_ai 换成 电脑落子 积木,其余循环与条件完全一致。

六、小结与互动

黑白棋把"列表当棋盘、循环扫八方向、条件判夹子、自制积木封装翻转、广播解耦对局流程"串成了一个完整可玩的工程项目,既是蓝桥杯青少组图形化省考的练兵好题,也高度贴合电子学会图形化考级与全国青少年信息素养大赛的考点。建议先把"基础贪心 AI"版跑通,再挑战"位置权重 / Minimax"进阶,逐步逼近赛场满分标准。

互动时间:你希望下一篇拆解哪个图形化项目?欢迎在评论区留言------点赞最高的方向,我们下一期就写。也欢迎分享你用黑白棋练手时踩过的坑,一起避坑提分!


📚 免费少儿编程资料(夸克网盘领取)

以下资料来自夸克网盘分享,点击链接可直接保存;若需在 App 内打开,也可复制下方明文链接:

  1. 全国青少年信息素养大赛复赛集训题目Python&C++.docx
    https://pan.quark.cn/s/93995d3cb150
  2. 2024信息素养-智能算法应用挑战赛-复赛初中组题目7月7日.pdf
    https://pan.quark.cn/s/da97b5dbf75d
  3. Python背记手册.pdf
    https://pan.quark.cn/s/7568ae9ca92b
  4. Python课程
    https://pan.quark.cn/s/a94bf02d00c6
  5. 2024信息素养大赛图形化复赛集训题答案3-9
    https://pan.quark.cn/s/6ccab7ec3cbc
  6. 2025年03月份电子学会考级真题
    https://pan.quark.cn/s/4403c4228912
  7. 2025全国青少年信息素养大赛赛项说明
    https://pan.quark.cn/s/d9d0df4a9f29
  8. 青少儿信息素养大赛编程资料
    https://pan.quark.cn/s/4ab6bd83be8a

资料持续更新,关注获取最新分享。

相关推荐
YSL07012413 分钟前
C++基础
开发语言·c++
tellmewhoisi29 分钟前
nlp:知识库检索和dify知识库创建
python·自然语言处理
2601_968793141 小时前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
eggwyw1 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
jktantan1 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
段一凡-华北理工大学10 小时前
工业智能体:从Codex/Claude到项目实战~系列文章05:从“AI助手“到“工业智能体“:能力跃迁与落地范式
人工智能·python·claude·codex·工业智能体·高炉炼铁智能化
深蓝AI10 小时前
ContextVar 到线程池就丢了?asyncio.to_thread 和 run_in_executor 实测
python
曦樂~11 小时前
Cpp面筋
c语言·c++
道尔柯南11 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++