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

Windows11下PyCharm运行curses贪吃蛇游戏无显示问题求助

问题解决步骤

一、PyCharm终端配置调整

  • 确保PyCharm使用原生Windows终端而非内嵌终端:
    1. 打开PyCharm设置(File > Settings)
    2. 导航到Tools > Terminal
    3. 将Shell path设置为cmd.exe或者powershell.exe
    4. 打开运行配置(Run > Edit Configurations > 对应Python配置),勾选"Run in terminal"
  • 原因:curses库需要直接控制终端底层输出,内嵌终端无法支持完整的curses功能,会导致显示异常。

二、代码关键错误修正

你的代码存在几个导致程序崩溃或无法显示的bug,必须修复:

1. 移除print语句

curses初始化后终端进入特殊模式,print会破坏curses的输出缓冲区,直接导致显示异常。删掉这两行:

print("Window initialized")  # Before refresh
print("Window refreshed")    # After refresh

2. 修复碰撞检测边界值

screen.getmaxyx()返回的高度/宽度是终端最大索引+1(比如终端24行,索引范围0-23),原代码的边界判断会导致蛇头刚碰到边缘就退出:

# 原错误代码
if snake[0][0] in [0, screen_height] or snake[0][1] in [0, screen_width] or snake[0] in snake[1:]:
# 修正后
if snake[0][0] in [0, screen_height-1] or snake[0][1] in [0, screen_width-1] or snake[0] in snake[1:]:

3. 修正食物生成的缩进错误

原代码中food赋值语句没有缩进进while循环,导致食物生成逻辑失效,程序会卡在循环或直接崩溃:

# 原错误代码
while food is None:
    new_food = [
        random.randint(1, screen_height-1),
        random.randint(1, screen_width-1)
    ]

# 注释行
    food = new_food if new_food not in snake else None
# 修正后
while food is None:
    new_food = [
        random.randint(1, screen_height-1),
        random.randint(1, screen_width-1)
    ]
    # 确保食物不在蛇身上
    food = new_food if new_food not in snake else None

4. 初始化蛇身显示

原代码没有绘制初始蛇身,导致游戏启动后看不到蛇。在定义snake列表后添加:

# 初始化蛇身显示
for segment in snake:
    window.addch(segment[0], segment[1], curses.ACS_CKBOARD)

三、完整修正后的代码

import random
import curses

# 初始化curses
screen = curses.initscr()

# 隐藏光标
curses.curs_set(0)

# 获取屏幕最大高度和宽度
screen_height, screen_width = screen.getmaxyx()

# 创建新窗口
window = curses.newwin(screen_height, screen_width, 0, 0)
window.refresh()

# 允许窗口接收键盘输入
window.keypad(True)

# 设置屏幕刷新延迟
window.timeout(125)

# 设置蛇头初始坐标
snake_y = screen_height // 2
snake_x = screen_width // 4

# 定义蛇身初始位置
snake = [
    [snake_y, snake_x],
    [snake_y, snake_x-1],
    [snake_y, snake_x-2]
]

# 绘制初始蛇身
for segment in snake:
    window.addch(segment[0], segment[1], curses.ACS_CKBOARD)

# 创建初始食物(屏幕中间)
food = [screen_height // 2, screen_width // 2]

# 绘制食物(用PI字符)
window.addch(food[0], food[1], curses.ACS_PI)

# 设置初始移动方向为右
key = curses.KEY_RIGHT

# 游戏主循环
while True:
    # 获取用户按键输入
    next_key = window.getch()

    # 无输入则保持原方向,否则更新方向
    key = key if next_key == -1 else next_key

    # 检测碰撞(边界或自身)
    if snake[0][0] in [0, screen_height-1] or snake[0][1] in [0, screen_width-1] or snake[0] in snake[1:]:
        curses.endwin()
        quit()

    # 计算蛇头新位置
    new_head = [snake[0][0], snake[0][1]]

    if key == curses.KEY_DOWN:
        new_head[0] += 1
    if key == curses.KEY_UP:
        new_head[0] -= 1
    if key == curses.KEY_RIGHT:
        new_head[1] += 1
    if key == curses.KEY_LEFT:
        new_head[1] -= 1

    # 添加新蛇头
    snake.insert(0, new_head)

    # 检测是否吃到食物
    if snake[0] == food:
        food = None
        # 生成新食物(避免在蛇身上)
        while food is None:
            new_food = [
                random.randint(1, screen_height-1),
                random.randint(1, screen_width-1)
            ]
            food = new_food if new_food not in snake else None
        # 绘制新食物
        window.addch(food[0], food[1], curses.ACS_PI)
    else:
        # 移除蛇尾并清空原位置
        tail = snake.pop()
        window.addch(tail[0], tail[1], ' ')

    # 绘制新蛇头
    window.addch(snake[0][0], snake[0][1], curses.ACS_CKBOARD)

四、运行验证

  1. 确认已安装windows-curses:执行pip install windows-curses
  2. 按照第一步配置PyCharm终端
  3. 运行程序,此时应该能正常显示蛇和食物,用方向键可控制移动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:54:56