python贪吃蛇手机_Python:游戏:贪吃蛇

作者: 丹枫无迹

公众号: 大龄码农的Python之路

一、游戏介绍

贪吃蛇是个非常简单的游戏,适合练手。先来看一下我的游戏截图:

玩法介绍:

回车键:开始游戏

空格键:暂停 / 继续

↑↓←→方向键 或 WSAD 键:控制移动方向。

食物分红、绿、蓝三种,分别对应 10 分、20 分、30 分,每吃一个食物增加对应分值,每增加 100 分速度加快一级,没有设置关卡,我玩到 1100 分,速度太快了,然后就 GAME OVER 了。

二、游戏分析

贪吃蛇这个游戏很简单,屏幕上随机出现一个点,表示“食物”,上下左右控制“蛇”的移动,吃到“食物”以后“蛇”的身体加长,“蛇”碰到边框或自己的身体,则游戏结束。

我们先来分析一下,要写出这个游戏来需要注意哪些点。

1、蛇怎么表示

我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,我们可以用不同的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”。

我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不同的颜色表示即可。

2、蛇怎么移动?

第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。

想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。

3、如何判定游戏结束?

“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?

如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?

理清了这些问题,我们就可以开始编码了。

三、代码展示

由于程序中要频繁的对“蛇”进行头尾的添加和删除操作,为了性能更好那么一点,我们用 deque 代替列表。

首先需要初始化“蛇”,“蛇”的初始长度为 3,位置位于左上角。# 游戏区域的坐标范围SCOPE_X = (0, SCREEN_WIDTH // SIZE - 1)SCOPE_Y = (2, SCREEN_HEIGHT // SIZE - 1)snake = deque()def _init_snake():    snake.clear()    snake.append((2, scope_y[0]))    snake.append((1, scope_y[0]))    snake.append((0, scope_y[0]))

创建“食物”,在屏幕内随机选取一个点作为“食物”,但是要保证“食物”不在“蛇”身上。def create_food(snake):    food_x = random.randint(SCOPE_X[0], SCOPE_X[1])    food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])    while (food_x, food_y) in snake:        # 如果食物出现在蛇身上,则重来        food_x = random.randint(SCOPE_X[0], SCOPE_X[1])        food_y = random.randint(SCOPE_Y[0], SCOPE_Y[1])    return food_x, food_y

“蛇”的移动可以有 4 个方向,用一个元组来表示移动的方向,每次按下方向键,给赋对应的值# 方向pos = (1, 0)for event in pygame.event.get():    if event.type == QUIT:        sys.exit()    elif event.type == KEYDOWN:        if event.key in (K_w, K_UP):            # 这个判断是为了防止蛇向上移时按了向下键,导致直接 GAME OVER            if pos[1]:                pos = (0, -1)        elif event.key in (K_s, K_DOWN):            if pos[1]:                pos = (0, 1)        elif event.key in (K_a, K_LEFT):            if pos[0]:                pos = (-1, 0)        elif event.key in (K_d, K_RIGHT):            if pos[0]:                pos = (1, 0)

而“蛇”的移动就可以表示为:next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])if next_s == food:    # 吃到了食物    snake.appendleft(next_s)    food = create_food(snake)else:    if SCOPE_X[0] <= next_s[0] <= SCOPE_X[1] and SCOPE_Y[0] <= next_s[1] <= SCOPE_Y[1] and next_s not in snake:        snake.appendleft(next_s)        snake.pop()    else:        game_over = True

后台回复【贪吃蛇】,获取源码。

Python的爱好者社区历史文章大合集:

福利:文末扫码关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“ 课程 ”即可获取:

小编的转行入职数据科学(数据分析挖掘/机器学习方向)【最新免费】

小编的Python的入门免费视频课程!

小编的Python的快速上手matplotlib可视化库!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告扩展制作免费学习视频。

玩转大数据分析!Spark2.X + Python精华实战课程免费学习视频。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用Python编写的简单贪吃蛇游戏代码: ```python import pygame import random # 游戏窗口大小 window_width = 800 window_height = 600 # 蛇身颜色 snake_color = (0, 255, 0) # 食物颜色 food_color = (255, 0, 0) # 初始化pygame pygame.init() # 创建游戏窗口 window = pygame.display.set_mode((window_width, window_height)) pygame.display.set_caption("贪吃蛇游戏") # 定义蛇的初始位置和长度 snake_x = window_width // 2 snake_y = window_height // 2 snake_size = 20 snake_speed = 20 snake_body = [[snake_x, snake_y]] # 定义初始移动方向和速度 direction = "RIGHT" change_to = direction # 定义食物的初始位置 food_x = round(random.randrange(0, window_width - snake_size) / 20.0) * 20.0 food_y = round(random.randrange(0, window_height - snake_size) / 20.0) * 20.0 # 游戏循环标志 running = True # 游戏主循环 while running: # 填充窗口背景色 window.fill((0, 0, 0)) # 控制游戏退出事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: change_to = "UP" elif event.key == pygame.K_DOWN: change_to = "DOWN" elif event.key == pygame.K_LEFT: change_to = "LEFT" elif event.key == pygame.K_RIGHT: change_to = "RIGHT" # 根据移动方向更新蛇的位置 if change_to == "UP": snake_y -= snake_speed elif change_to == "DOWN": snake_y += snake_speed elif change_to == "LEFT": snake_x -= snake_speed elif change_to == "RIGHT": snake_x += snake_speed # 更新蛇的身体 snake_body.insert(0, [snake_x, snake_y]) # 判断是否吃到了食物 if snake_x == food_x and snake_y == food_y: food_x = round(random.randrange(0, window_width - snake_size) / 20.0) * 20.0 food_y = round(random.randrange(0, window_height - snake_size) / 20.0) * 20.0 else: snake_body.pop() # 绘制蛇和食物 for body_part in snake_body: pygame.draw.rect(window, snake_color, pygame.Rect(body_part[0], body_part[1], snake_size, snake_size)) pygame.draw.rect(window, food_color, pygame.Rect(food_x, food_y, snake_size, snake_size)) # 判断游戏结束条件 if snake_x < 0 or snake_x >= window_width or snake_y < 0 or snake_y >= window_height: running = False print("游戏结束!") pygame.display.flip() # 退出pygame pygame.quit() ``` 这段代码使用Pygame库来创建一个简单的贪吃蛇游戏游戏窗口的大小为800x600像素,蛇身的颜色为绿色,食物的颜色为红色。 游戏循环中,根据用户按键来改变蛇的移动方向,根据移动方向更新蛇的位置。当蛇吃到食物时,更新食物的位置。如果蛇撞到边界或自己的身体,游戏结束。 注意:上述代码只是一个简单实现,可能还需要进一步完善和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值