## 代码 |
import random |
import pygame |
# 定义窗口的大小 |
# PyGame定义坐标系原点在左上角 |
WINDOW_WIDTH = 500 |
WINDOW_HEIGHT = 500 |
# 定义几个颜色 |
RED = ( 255 , 0 , 0 ) |
BLUE = ( 0 , 0 , 255 ) |
GREEN = ( 0 , 255 , 0 ) |
BLACK = ( 0 , 0 , 0 ) |
# 定义贪吃蛇的移动速度 |
SPEED = 1.0 |
# 定义一个记录游戏是否结束的变量 |
game_over = False |
# 定义贪吃蛇的起始位置和方向 |
snake_left = 10 |
snake_top = 10 |
snake_direction = 'right' |
# 定义贪吃蛇的身体的列表 |
snake_list = [] |
# 定义食物的位置 |
food_left = random.randint( 5 , WINDOW_WIDTH - 5 ) |
food_top = random.randint( 5 , WINDOW_HEIGHT - 5 ) |
# 初始化PyGame模块 |
pygame.init() |
# 设置窗口的大小 |
screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) |
# 设置游戏窗口的标题 |
pygame.display.set_caption( '贪吃蛇游戏' ) |
# 设置游戏的速度 |
clock = pygame.time.Clock() |
# 定义贪吃蛇的长度 |
snake_len = 50 |
# 开始游戏的主循环 |
while True : |
# 当游戏结束的时候,退出循环 |
if game_over: |
break |
# 每次循环时都会重新绘制窗口 |
screen.fill(BLACK) |
for event in pygame.event.get(): |
if event. type = = pygame.QUIT: |
game_over = True |
# 如果检测到用户按下键盘上的按键 |
if event. type = = pygame.KEYDOWN: |
# 根据按键改变移动方向 |
if event.key = = pygame.K_LEFT: |
snake_direction = 'left' |
elif event.key = = pygame.K_RIGHT: |
snake_direction = 'right' |
elif event.key = = pygame.K_UP: |
snake_direction = 'up' |
elif event.key = = pygame.K_DOWN: |
snake_direction = 'down' |
# 根据方向移动贪吃蛇的坐标 |
if snake_direction = = 'left' : |
snake_left - = SPEED |
elif snake_direction = = 'right' : |
snake_left + = SPEED |
elif snake_direction = = 'up' : |
snake_top - = SPEED |
elif snake_direction = = 'down' : |
snake_top + = SPEED |
# 贪吃蛇的坐标添加到列表中 |
snake_list.append((snake_left, snake_top)) |
# 如果贪吃蛇的长度大于最大长度 |
if len (snake_list) > snake_len: |
# 则删除最开始的坐标 |
del snake_list[ 0 ] |
# 绘制贪吃蛇的身体 |
for c_pos in snake_list: |
pygame.draw.rect(screen, GREEN, (c_pos[ 0 ], c_pos[ 1 ], 10 , 10 )) |
# 如果贪吃蛇的坐标和食物的坐标重合,考虑误差±10像素 |
if abs (snake_left - food_left) < 10 and abs (snake_top - food_top) < 10 : |
# 重新随机一个食物的坐标 |
food_left = random.randint( 5 , WINDOW_WIDTH - 5 ) |
food_top = random.randint( 5 , WINDOW_HEIGHT - 5 ) |
snake_len + = SPEED |
# 绘制食物 |
pygame.draw.rect(screen, RED, (food_left, food_top, 10 , 10 )) |
# 如果贪吃蛇碰到边界 |
if snake_left < 0 or snake_left > WINDOW_WIDTH or snake_top < 0 or snake_top > WINDOW_HEIGHT: |
game_over = True |
# 如果贪吃蛇碰到自身的身体 |
for n_pos in snake_list[: - 1 ]: |
if n_pos[ 0 ] = = snake_left and n_pos[ 1 ] = = snake_top: |
game_over = True |
# 绘制文字让用户知晓游戏进度 |
score = len (snake_list) |
font = pygame.font.SysFont( None , 30 ) |
label = font.render( 'Score: {}' . format (score), 1 , RED) |
screen.blit(label, (WINDOW_WIDTH / 2 - 25 , 20 )) |
# 刷新屏幕 |
pygame.display.flip() |
# 控制游戏的速度 |
clock.tick( 200 ) |
# 退出游戏 |
pygame.quit() |