以下是一个使用Python curses库实现的简单贪吃蛇游戏代码,包含详细注释:
```python
import curses
from curses import KEY_RIGHT, KEY_LEFT, KEY_UP, KEY_DOWN
from random import randint
# 初始化curses
curses.initscr()
win = curses.newwin(20, 60, 0, 0) # 创建新窗口(高度20,宽度60)
win.keypad(1) # 启用键盘输入
curses.noecho() # 关闭输入回显
curses.curs_set(0) # 隐藏光标
win.nodelay(1) # 非阻塞输入模式
# 初始化颜色
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
# 游戏初始化
snake = [[4, 10], [4, 9], [4, 8]] # 初始蛇身位置
food = [10, 20] # 初始食物位置
score = 0 # 初始得分
win.addch(food[0], food[1], 'O', curses.color_pair(1)) # 绘制食物
key = KEY_RIGHT # 初始方向向右
# 游戏主循环
while True:
win.border(0) # 绘制边框
win.addstr(0, 2, 'Score: ' + str(score) + ' ') # 显示分数
# 获取输入(非阻塞)
event = win.getch()
key = key if event == -1 else event
# 计算新蛇头位置
head = [snake[0][0], snake[0][1]]
if key == KEY_DOWN:
head[0] += 1
elif key == KEY_UP:
head[0] -= 1
elif key == KEY_LEFT:
head[1] -= 1
elif key == KEY_RIGHT:
head[1] += 1
# 插入新蛇头
snake.insert(0, head)
# 碰撞检测
if (
head[0] == 0 or head[0] == 19 or # 撞墙检测
head[1] == 0 or head[1] == 59 or
head in snake[1:] # 自撞检测
):
break
# 吃食物检测
if head == food:
score += 1
# 生成新食物(不在蛇身上)
while food in snake:
food = [randint(1, 18), randint(1, 58)]
win.addch(food[0], food[1], 'O', curses.color_pair(1))
else:
# 移动蛇尾(没吃到食物时)
tail = snake.pop()
win.addch(tail[0], tail[1], ' ')
# 绘制蛇身
win.addch(snake[0][0], snake[0][1], '@', curses.color_pair(2))
for segment in snake[1:]:
win.addch(segment[0], segment[1], '#', curses.color_pair(2))
win.refresh()
curses.napms(150) # 控制游戏速度(毫秒)
# 游戏结束
curses.endwin()
print(f"游戏结束!最终得分:{score}")
```
运行说明:
1. 需要安装Python的curses库(Windows用户需先安装`windows-curses`包)
2. 使用方向键控制蛇的移动
3. 吃食物(O)可以增长身体并得分
4. 避免撞墙和自撞
安装依赖(Windows):
```bash
pip install windows-curses
```
游戏规则:
- 每次吃到食物得1分
- 蛇身会随着吃食物变长
- 撞墙或碰到自己身体游戏结束
- 游戏速度固定(150ms/帧)
这个实现包含了:
- 彩色界面显示
- 分数统计
- 碰撞检测
- 食物生成逻辑
- 基本的游戏循环结构
你可以通过调整以下参数自定义游戏:
- 修改`curses.newwin(20, 60, 0, 0)`改变窗口大小
- 调整`curses.napms(150)`改变游戏速度
- 修改初始蛇身位置`snake`和食物位置`food`
- 修改符号颜色(修改color_pair参数)