Windows11下PyCharm运行curses贪吃蛇游戏无显示问题求助
问题解决步骤
一、PyCharm终端配置调整
- 确保PyCharm使用原生Windows终端而非内嵌终端:
- 打开PyCharm设置(File > Settings)
- 导航到Tools > Terminal
- 将Shell path设置为
cmd.exe或者powershell.exe - 打开运行配置(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)
四、运行验证
- 确认已安装
windows-curses:执行pip install windows-curses - 按照第一步配置PyCharm终端
- 运行程序,此时应该能正常显示蛇和食物,用方向键可控制移动
内容的提问来源于stack exchange,提问作者Hijazi
相关产品推荐
相关产品推荐

