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

Python单词搜索谜题生成器Bug排查与功能优化求助

解决单词搜索谜题生成器的索引越界与单词重叠问题

一、索引越界(IndexError)排查与修复

索引越界的核心原因是放置单词时,起始位置加上单词长度超出了网格的行列范围,且Python列表索引从0开始,需要严格计算边界。

关键检查点

  • 水平放置单词:确保起始列 + 单词长度 ≤ 总列数。比如15列的网格,单词长度为5时,起始列最大只能是 15 - 5 = 10(索引0-14),否则会触发行列越界。
  • 垂直放置单词:确保起始行 + 单词长度 ≤ 总行数。比如18行的网格,单词长度为7时,起始行最大只能是 18 - 7 = 11(索引0-17)。

修正代码示例

import random

# 初始化网格(rows=18, cols=15)
rows = 18
cols = 15
grid = [['_' for _ in range(cols)] for _ in range(rows)]

def place_word_horizontally(word):
    max_start_col = cols - len(word)
    if max_start_col < 0:
        print(f"单词 {word} 长度超过列数,无法水平放置")
        return False
    start_row = random.randint(0, rows - 1)
    start_col = random.randint(0, max_start_col)
    # 放置单词
    for i in range(len(word)):
        grid[start_row][start_col + i] = word[i]
    return True

def place_word_vertically(word):
    max_start_row = rows - len(word)
    if max_start_row < 0:
        print(f"单词 {word} 长度超过行数,无法垂直放置")
        return False
    start_row = random.randint(0, max_start_row)
    start_col = random.randint(0, cols - 1)
    # 放置单词
    for i in range(len(word)):
        grid[start_row + i][start_col] = word[i]
    return True

二、单词重叠问题解决

要避免不同单词的字符冲突,需在放置前检查目标位置的网格状态:允许相同字符重叠,不同字符则重新选择位置。

检查与放置逻辑示例

def can_place(word, start_row, start_col, direction):
    if direction == "horizontal":
        if start_col + len(word) > cols:
            return False
        for i in range(len(word)):
            current_char = grid[start_row][start_col + i]
            if current_char != '_' and current_char != word[i]:
                return False
        return True
    elif direction == "vertical":
        if start_row + len(word) > rows:
            return False
        for i in range(len(word)):
            current_char = grid[start_row + i][start_col]
            if current_char != '_' and current_char != word[i]:
                return False
        return True

# 安全放置单词的主逻辑
def safe_place_word(word):
    placed = False
    while not placed:
        direction = random.choice(["horizontal", "vertical"])
        if direction == "horizontal":
            max_col = cols - len(word)
            if max_col < 0:
                direction = "vertical"
            start_r = random.randint(0, rows - 1)
            start_c = random.randint(0, max_col)
        else:
            max_row = rows - len(word)
            if max_row < 0:
                direction = "horizontal"
                max_col = cols - len(word)
                if max_col < 0:
                    print(f"单词 {word} 无法放入当前网格")
                    return
                start_r = random.randint(0, rows - 1)
                start_c = random.randint(0, max_col)
            else:
                start_r = random.randint(0, max_row)
                start_c = random.randint(0, cols - 1)
        if can_place(word, start_r, start_c, direction):
            # 执行放置
            if direction == "horizontal":
                for i in range(len(word)):
                    grid[start_r][start_c + i] = word[i]
            else:
                for i in range(len(word)):
                    grid[start_r + i][start_c] = word[i]
            placed = True

额外注意事项

  1. 网格初始化:务必用二维列表正确初始化,比如 grid = [['_' for _ in range(cols)] for _ in range(rows)],避免因网格结构错误导致的索引问题。
  2. 输入合法性检查:接收用户输入的行列数时,需限制在1-25之间,过滤无效输入。
  3. 超长单词处理:对长度超过行列数的单词,直接提示无法放置,避免进入死循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:20:27