贪吃蛇是一款经典的小游戏。在这个游戏中,玩家所控制的蛇需要不断地吃食物增长自己的长度,但也要避免撞到自己的身体或游戏界面的边缘而 game over。现在,随着程序语言的普及,我们也可以用简单的代码编程来制作自己的贪吃蛇游戏。
1. 基本代码
我们先来看看贪吃蛇游戏的基本代码:
```
import pygame, sys
from pygame.locals import *
pygame.init()
fpsClock = pygame.time.Clock()
WINDOW = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Greedy Snake')
RED = pygame.Color(255, 0, 0)
BLACK = pygame.Color(0, 0, 0)
WHITE = pygame.Color(255, 255, 255)
snake_pos = [(200, 200), (210, 200), (220, 200)]
snake_body = pygame.Surface((10, 10))
snake_body.fill(RED)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
WINDOW.fill(BLACK)
for pos in snake_pos:
WINDOW.blit(snake_body, pos)
pygame.display.update()
fpsClock.tick(10)
```
这段代码实现了一个简单的贪吃蛇游戏窗口,窗口大小为 640x480,标题为“Greedy Snake”。蛇的初始长度为 3,每个方块大小为 10x10 像素,颜色为红色。游戏循环中,我们首先检测窗口是否被关闭,然后在黑色背景上绘制蛇的身体,并使用 `pygame.display.update()` 刷新窗口。游戏每秒刷新 10 次(即每帧耗时 100 毫秒),通过 `fpsClock` 控制帧率。
2. 增加键盘控制
现在,我们需要通过键盘控制贪吃蛇的移动,使其能够在窗口中移动。
```
import pygame, sys
from pygame.locals import *
pygame.init()
fpsClock = pygame.time.Clock()
WINDOW = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Greedy Snake')
RED = pygame.Color(255, 0, 0)
BLACK = pygame.Color(0, 0, 0)
WHITE = pygame.Color(255, 255, 255)
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
snake_pos = [(200, 200), (210, 200), (220, 200)]
snake_body = pygame.Surface((10, 10))
snake_body.fill(RED)
snake_dir = LEFT
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
snake_dir = UP
elif event.key == K_RIGHT:
snake_dir = RIGHT
elif event.key == K_DOWN:
snake_dir = DOWN
elif event.key == K_LEFT:
snake_dir = LEFT
if snake_dir == UP:
new_pos = (snake_pos[0][0], snake_pos[0][1] - 10)
elif snake_dir == RIGHT:
new_pos = (snake_pos[0][0] + 10, snake_pos[0][1])
elif snake_dir == DOWN:
new_pos = (snake_pos[0][0], snake_pos[0][1] + 10)
elif snake_dir == LEFT:
new_pos = (snake_pos[0][0] - 10, snake_pos[0][1])
snake_pos.insert(0, new_pos)
snake_pos.pop()
WINDOW.fill(BLACK)
for pos in snake_pos:
WINDOW.blit(snake_body, pos)
pygame.display.update()
fpsClock.tick(10)
```
我们增加了键盘事件的处理,使得玩家通过方向键进行操作。当按下相应的方向键时,我们改变蛇的移动方向。在每个游戏循环中,我们计算出蛇头的新位置,然后把新位置插入到蛇头的前面,并移除蛇尾的位置,使蛇整体向前移动。这里的移动方式是每个方块移动一个单位(即 10 像素)的距离。
3. 增加碰撞检测
接下来,我们需要增加碰撞检测的功能,当蛇头碰到自己的身体或游戏窗口边缘时,游戏结束。
```
import pygame, sys
from pygame.locals import *
pygame.init()
fpsClock = pygame.time.Clock()
WINDOW = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Greedy Snake')
RED = pygame.Color(255, 0, 0)
BLACK = pygame.Color(0, 0, 0)
WHITE = pygame.Color(255, 255, 255)
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
snake_pos = [(200, 200), (210, 200), (220, 200)]
snake_body = pygame.Surface((10, 10))
snake_body.fill(RED)
snake_dir = LEFT
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
snake_dir = UP
elif event.key == K_RIGHT:
snake_dir = RIGHT
elif event.key == K_DOWN:
snake_dir = DOWN
elif event.key == K_LEFT:
snake_dir = LEFT
if snake_dir == UP:
new_pos = (snake_pos[0][0], snake_pos[0][1] - 10)
elif snake_dir == RIGHT:
new_pos = (snake_pos[0][0] + 10, snake_pos[0][1])
elif snake_dir == DOWN:
new_pos = (snake_pos[0][0], snake_pos[0][1] + 10)
elif snake_dir == LEFT:
new_pos = (snake_pos[0][0] - 10, snake_pos[0][1])
snake_pos.insert(0, new_pos)
snake_pos.pop()
WINDOW.fill(BLACK)
for pos in snake_pos:
WINDOW.blit(snake_body, pos)
# check if the snake has collided with itself
if len(snake_pos) != len(set(snake_pos)):
pygame.quit()
sys.exit()
# check if the snake has collided with the window boundaries
if snake_pos[0][0] < 0 or snake_pos[0][0] >= 640 or snake_pos[0][1] < 0 or snake_pos[0][1] >= 480:
pygame.quit()
sys.exit()
pygame.display.update()
fpsClock.tick(10)
```
在游戏循环中,我们首先检测蛇头是否与自己的身体重叠,如果是,就退出游戏。我们使用 Python 的 set 类型来去除重复元素,如果去重后长度不相等,就说明有重叠。接着,我们检查蛇头是否已经碰到窗口边缘,如果是,也退出游戏。这就实现了最基本的贪吃蛇游戏。
扫码咨询 领取资料