希赛考试网
首页 > 软考 > 软件设计师

简单代码编程 贪吃蛇

希赛网 2024-06-02 14:22:31

贪吃蛇是一款经典的小游戏。在这个游戏中,玩家所控制的蛇需要不断地吃食物增长自己的长度,但也要避免撞到自己的身体或游戏界面的边缘而 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 类型来去除重复元素,如果去重后长度不相等,就说明有重叠。接着,我们检查蛇头是否已经碰到窗口边缘,如果是,也退出游戏。这就实现了最基本的贪吃蛇游戏。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件