前提条件:
需要安装pygame,pgzero,numpy(windows:1.19.3)
功能:
1.初始化界面显示小蛇和食物
2.键盘控制角色的上下左右(wasd或者上下左右)移动,当小蛇吃掉食物后蛇身长度加1同时重置食物位置
3.统计小蛇吃掉食物的个数,每吃掉一个食物分数加1,同时在界面显示分数
5.游戏失败,界面显示对应信息,同时停止游戏
附:
代码中涉及到的素材来自异步社区:《Python游戏趣味编程》一书中提供的素材:https://www.epubit.com/bookDetails?id=UB72096d97d6149
以下是代码:
import pgzrun, time, random
TILE_SIZE = 20
TITLE = '贪吃蛇'
WIDTH = 40 * TILE_SIZE
HEIGHT = 30 * TILE_SIZE
# 存储蛇头和蛇身
snake_list = []
snake_head = Actor('snake1') # 导入蛇头
snake_head.x = WIDTH / 2 # 蛇头的x坐标
snake_head.y = HEIGHT / 2 # 蛇头的y坐标
snake_list.append(snake_head)
# 添加蛇身
for i in range(4): # 再为蛇添加4段蛇身
snake_body = Actor('snake1') # 导入蛇身
snake_body.x = snake_list[i].x - TILE_SIZE # 蛇身的x坐标
snake_body.y = snake_list[i].y # 蛇身的y坐标
snake_list.append(snake_body) # 把蛇身加入到列表中
# 导入食物
cookie = Actor('cookie')
cookie.x = random.randint(10, 30) * TILE_SIZE # 食物的x坐标
cookie.y = random.randint(10, 30) * TILE_SIZE # 食物的y坐标
# 初始化蛇的移动方向,控制蛇的移动方向
direction = 'right'
# 游戏是否失败
isLoose = False
# 游戏得分
score = 0
def draw():
screen.clear() # 清除屏幕
for snake in snake_list: # 绘制蛇
snake.draw()
cookie.draw() # 绘制食物
screen.draw.text("得分:" + str(score), (350, 550), fontsize=30, fontname='s', color='green')
if isLoose: # 显示游戏失败信息
screen.draw.text("Game Over !", (250, 250), fontsize=80, color='red')
def update():
global direction
# 改变蛇身的颜色
# 游戏结束直接返回
if isLoose:
return
# 蛇的移动方向
if keyboard.left or keyboard.a:
direction = 'left'
if keyboard.right or keyboard.d:
direction = 'right'
if keyboard.up or keyboard.w:
direction = 'up'
if keyboard.down or keyboard.s:
direction = 'down'
def move_snake():
global direction, isLoose, score
# 游戏结束直接返回
if isLoose:
return
new_snake = Actor('snake1') # 创建新蛇头
# 根据蛇的移动方向确定蛇身的坐标
if direction == 'right': # 向右移动
new_snake.x = snake_list[0].x + TILE_SIZE
new_snake.y = snake_list[0].y
if direction == 'left': # 向左移动
new_snake.x = snake_list[0].x - TILE_SIZE
new_snake.y = snake_list[0].y
if direction == 'up': # 向上移动
new_snake.x = snake_list[0].x
new_snake.y = snake_list[0].y - TILE_SIZE
if direction == 'down': # 向下移动
new_snake.x = snake_list[0].x
new_snake.y = snake_list[0].y + TILE_SIZE
# 当蛇头超出边框时游戏失败
if new_snake.y < 0 or new_snake.y > HEIGHT or new_snake.x < 0 or new_snake.x > WIDTH:
isLoose = True
# 当蛇头碰到自身时,游戏失败
for snake in snake_list: # 对所有蛇身循环,判断是否和蛇头坐标一致
if new_snake.x == snake.x and new_snake.y == snake.y:
isLoose = True
break
# 当蛇头碰到食物时,蛇身加1,也就是不删除蛇尾,同时重置饼干位置
if new_snake.x == cookie.x and new_snake.y == cookie.y:
cookie.x = random.randint(5, 35) * TILE_SIZE
cookie.y = random.randint(5, 25) * TILE_SIZE
score = score + 1 # 得分加1
else: # 否则,删除掉旧蛇尾
del snake_list[len(snake_list) - 1]
snake_list.insert(0, new_snake) # 把新蛇头加到列表的最前面
# 下一次隔0.2秒调用
clock.schedule_unique(move_snake, 0.2)
move_snake()
pgzrun.go() # 开始执行游戏