贪吃蛇
import curses
from random import randint
# 初始化窗口
curses.initscr()
win = curses.newwin(20, 60, 0, 0) # 创建新窗口:高20、宽60
win.keypad(1) # 支持键盘输入
curses.noecho() # 关闭输入回显
curses.curs_set(0) # 隐藏光标显示
win.border(0) # 设置窗口边界
win.nodelay(1) # 设置nodelay,使得getch()方法非阻塞
# 蛇和食物的初始状态
snake = [(4, 10), (4, 9), (4, 8)] # 蛇的初始位置
food = (10, 20) # 食物的初始位置
# 游戏初始分数和速度
score = 0 # 初始分数为0
speed = 150 # 初始速度为150毫秒
# 游戏主循环标志
ESC = 27 # ESC键的ASCII码为27
key = curses.KEY_RIGHT # 初始移动方向为向右
# 开始游戏主循环
while key != ESC: # 当用户未按下ESC键时,循环继续
win.addstr(0, 2, f'Score : {score} ') # 显示分数
win.timeout(speed) # 设置延迟
prev_key = key # 保存上次按键
event = win.getch() # 获取用户按键
key = event if event != -1 else prev_key # 如果用户按下了新键,则更新方向键
# 如果新的按键没有按下,则使用先前的按键
if key not in [curses.KEY_LEFT, curses.KEY_RIGHT, curses.KEY_UP, curses.KEY_DOWN, ESC]:
key = prev_key
# 计算蛇的新头部位置
y = snake[0][0]
x = snake[0][1]
if key == curses.KEY_DOWN:
y += 1
if key == curses.KEY_UP:
y -= 1
if key == curses.KEY_LEFT:
x -= 1
if key == curses.KEY_RIGHT:
x += 1
snake.insert(0, (y, x)) # 将新头部添加到蛇的头部
# 检查蛇是否撞墙或撞到自己
if y == 0: break
if y == 19: break
if x == 0: break
if x == 59: break
if snake[0] in snake[1:]: break
if snake[0] == food:
# 吃到食物
score += 1
food = ()
while food == ():
food = (randint(1,18), randint(1,58))
if food in snake:
food = ()
win.addch(food[0], food[1], '*')
else:
# 移动:删除蛇的尾巴
last = snake.pop()
win.addch(last[0], last[1], ' ')
win.addch(snake[0][0], snake[0][1], '#')
# 游戏结束
curses.endwin()
print(f"Final score = {score}")
极简版贪吃蛇,代码使用了curses库,
- 初始化窗口:使用curses.initscr()初始化窗口,创建一个高20、宽60的新窗口,支持键盘输入,关闭输入回显,隐藏光标显示,设置窗口边界,设置nodelay使得getch()方法非阻塞。
- 初始化蛇和食物:蛇的初始位置为(4,10)、(4,9)、(4,8),食物的初始位置为(10,20)。
- 游戏主循环:当用户未按下ESC键时,循环继续。在每次循环中,显示分数,设置延迟,获取用户按键,计算蛇的新头部位置,检查蛇是否撞墙或撞到自己,如果吃到食物则更新分数和食物位置,否则移动蛇的尾巴。
- 游戏结束:当用户按下ESC键或蛇撞墙/撞到自己时,游戏结束,显示最终分数。