用Python做贪吃蛇小游戏

  • 简介
    • 引言
    • 游戏预览
    • 结构图
    • 代码框架图
  • 代码讲解
    • main主函数-开始工作
    • show_start_info()欢迎进入游戏
    • running_game-让我们开始游戏吧
    • draw_snake-画出我们的贪吃蛇
    • draw_food-画出我们的食物

简介

贪吃蛇游戏是一款经典的益智游戏,既简单又耐玩。该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长。

引言

贪吃蛇小游的设计过程,以及这个系列专题的整体架构

游戏预览

游戏开始界面

游戏进行界面

游戏结束界面

结构图

代码框架图

代码讲解

整个程序由于是调用了大量的pygame里面的库函数

main主函数-开始工作

主要承担一些游戏窗口的初始化工作,以及调用相关函数运行游戏。代码如下:

#主函数
def main():pygame.init() # 模块初始化snake_speed_clock = pygame.time.Clock() # 利用pygame的time模块创建Pygame时钟对象screen = pygame.display.set_mode((windows_width, windows_height)) #利用pygame显示模块设置模式窗口宽度窗口高度screen.fill(white)pygame.display.set_caption("Python 贪吃蛇小游戏") #设置标题show_start_info(screen)               #欢迎信息while True:running_game(screen, snake_speed_clock)show_gameover_info(screen)

基于以上代码,咱们来做几点讲解:

  • pygame.time.Clock()
    利用pygame的time模块创建Pygame时钟对象,控制帧速率。pygame.time.Clock()会控制每个循环多长时间运行一次。

  • pygame.display.set_mode((windows_width, windows_height))
    生成windows窗口,pygame.display.set_mode(resolution=(0,0),flags=0,depth=0)。返回的是一个surface对象(surface对象是用于表示图像的图像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是扩展选项,

  • pygame.surface.fill(color)。对surface对象填充某一种颜色,在这里表现为窗口背景颜色的填充。

然后就运行我们游戏三个函数了

  • show_start_info(screen)
    显示欢迎信息,最终效果表现为:

接着死循环。因为我们的游戏设置是,当GameOver以后,我们可以按任意键重新开始游戏,或者退出。因此最后不断循环判断用户是否想重新开始游戏。

  • 游戏主体running_game(screen, snake_speed_clock)
    贪吃蛇运行的主体函数。整个程序的精髓所在。

  • show_gameover_info(screen)
    贪吃蛇死了,显示GameOver,表现为:

show_start_info()欢迎进入游戏

代码如下:

#开始信息显示
def show_start_info(screen):font = pygame.font.Font('myfont.ttf', 40)tip = font.render('按任意键开始游戏~~~', True, (65, 105, 225))gamestart = pygame.image.load('gamestart.png')screen.blit(gamestart, (140, 30))screen.blit(tip, (240, 550))pygame.display.update()while True:  #键盘监听事件for event in pygame.event.get():  # event handling loopif event.type == QUIT:terminate()     #终止程序elif event.type == KEYDOWN:if (event.key == K_ESCAPE):  #终止程序terminate() #终止程序else:return #结束此函数, 开始游戏
  • 字体显示
    先创建一个Font对象,用自己的字体。有了Font对象以后, 就可以用render方法来写字了,然后通过blit方法blit到屏幕上。

  • 图像加载
    用 pygame.image.load()加载图像获得对象,在用blit方法刷到屏幕上。做完以上事件以后,要update一下刷新一下屏幕。

  • 监听键盘
    按任意键继续或者ESC退出……

running_game-让我们开始游戏吧

running_game(screen, snake_speed_clock)是游戏主要功能,也是最精髓的一部分
代码如下:

#游戏运行主体
def running_game(screen,snake_speed_clock):startx = random.randint(3, map_width - 8)   #蛇开始游戏的位置starty = random.randint(3, map_height - 8)snake_coords = [{'x': startx, 'y': starty},  #初始贪吃蛇{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]direction = RIGHT                     #  开始时向右移动food = get_random_location()          #食物随机位置while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:direction = RIGHTelif (event.key == K_UP or event.key == K_w) and direction != DOWN:direction = UPelif (event.key == K_DOWN or event.key == K_s) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()move_snake(direction, snake_coords)      #移动蛇ret = snake_is_alive(snake_coords)if not ret:break                                 #蛇死了. 游戏结束snake_is_eat_food(snake_coords, food)    #判断蛇是否吃到食物screen.fill(BG_COLOR)#draw_grid(screen)draw_snake(screen, snake_coords)draw_food(screen, food)draw_score(screen, len(snake_coords) - 3)pygame.display.update()snake_speed_clock.tick(snake_speed)      #控制fps,使蛇获得速度
  • 关于贪吃蛇
    这里我们采用一个元组存储贪吃蛇身体各个部分的坐标(一条贪吃蛇不是由很多节组成的嘛)。最后再写个方法根据元组坐标把贪吃蛇画出来就行。
    关于食物
    同样做法。存坐标,最后画出来。

关于移动
监听键盘,根据用户按键,用direction变量记录移动方向。然后更新贪吃蛇元组里面的坐标(其实每次移动只用更新头尾就行)。最后统一画出来。移动做法具体是,我们把每次头部移动的新坐标插入贪吃蛇元组,然后删掉尾部一节(注意,删除尾部我们放在了另外一个函数里做)。

#移动贪吃蛇
def move_snake(direction, snake_coords):if direction == UP:newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']}elif direction == RIGHT:newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']}snake_coords.insert(0, newHead)
  • 开始阶段
    先把贪吃蛇和食物的坐标随机生成,贪吃蛇一开始3节长,先设置向右移动。

  • 移动我们的贪吃蛇
    监听键盘,用户按下键盘只是改变direction的值,再用move_snake(direction, snake_coords)函数更新贪吃蛇坐标。如果不按,那direction值一直不变,贪吃蛇就一直向前走。

  • 相关判断
    要判断贪吃蛇是否挂了,表现为:

    头坐标超出地图范围
    头坐标等于身体某节坐标


#判断蛇死了没
def snake_is_alive(snake_coords):tag = Trueif snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \snake_coords[HEAD]['y'] == map_height:tag = False # 蛇碰壁啦for snake_body in snake_coords[1:]:if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:tag = False # 蛇碰到自己身体啦return tag
  • 判断贪吃蛇是否吃到食物,表现为:

    头坐标等于食物坐标,那么吃到食物。这时候就不用删尾部一节了,因为吃到食物变长了。
    如果没有吃到食物,那么是正常移动,删掉尾部一节坐标。


#判断贪吃蛇是否吃到食物
def snake_is_eat_food(snake_coords, food):  #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:food['x'] = random.randint(0, map_width - 1)food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置else:del snake_coords[-1]  # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉

draw_snake-画出我们的贪吃蛇

  • 画出我们的游戏
    最后调用相关函数,讲我们的地图,贪吃蛇,食物等等统统画出来。

代码如下:


#将贪吃蛇画出来
def draw_snake(screen, snake_coords):for coord in snake_coords:x = coord['x'] * cell_sizey = coord['y'] * cell_sizewormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, dark_blue, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(                #蛇身体里面的第二层亮蓝色x + 4, y + 4, cell_size - 8, cell_size - 8)pygame.draw.rect(screen, blue, wormInnerSegmentRect)

首先先获取相关坐标,最后调用pygame.draw.rect将身体各个部分画出来

draw_food-画出我们的食物


#将食物画出来
def draw_food(screen, food):x = food['x'] * cell_sizey = food['y'] * cell_sizeappleRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, Red, appleRect)

先获取食物的位置,然后就把矩形画出来。


#将食物画出来
def draw_food(screen, food):x = food['x'] * cell_sizey = food['y'] * cell_sizeappleRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, Red, appleRect)

获得Font对象以后,render写字,最后设置位置,在屏幕上blit出来。

所有代码在下面:


## 导入相关模块
import random   #返回随机0~1的数
import pygame   #Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。
import sys  #当执行import sys后, python在 sys.path 变量中所列目录中寻找 sys 模块文件。然后运行这个模块的主块中的语句进行初始化,然后就可以使用模块了 。from pygame.locals import *snake_speed = 15 #贪吃蛇的速度
windows_width = 800
windows_height = 600 #游戏窗口的大小
cell_size = 20       #贪吃蛇身体方块大小,注意身体大小必须能被窗口长宽整除''' #初始化区
由于我们的贪吃蛇是有大小尺寸的, 因此地图的实际尺寸是相对于贪吃蛇的大小尺寸而言的
'''
map_width = int(windows_width / cell_size)
map_height = int(windows_height / cell_size)# RGB颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
gray = (230, 230, 230)
dark_gray = (40, 40, 40)
DARKGreen = (0, 155, 0)
Green = (0, 255, 0)
Red = (255, 0, 0)
blue = (0, 0, 255)
dark_blue =(0,0, 139)BG_COLOR = black #游戏背景颜色# 定义方向
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4HEAD = 0 #贪吃蛇头部下标#主函数
def main():pygame.init() # 模块初始化snake_speed_clock = pygame.time.Clock() # 利用pygame的time模块创建Pygame时钟对象screen = pygame.display.set_mode((windows_width, windows_height)) #利用pygame显示模块设置模式窗口宽度窗口高度screen.fill(white)pygame.display.set_caption("Python 贪吃蛇") #设置标题show_start_info(screen)               #欢迎信息while True:running_game(screen, snake_speed_clock)show_gameover_info(screen)#游戏运行主体
def running_game(screen,snake_speed_clock):startx = random.randint(3, map_width - 8) #蛇开始游戏的位置starty = random.randint(3, map_height - 8)snake_coords = [{'x': startx, 'y': starty},  #初始贪吃蛇{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]direction = RIGHT       #  开始时向右移动food = get_random_location()     #实物随机位置while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:direction = RIGHTelif (event.key == K_UP or event.key == K_w) and direction != DOWN:direction = UPelif (event.key == K_DOWN or event.key == K_s) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()move_snake(direction, snake_coords) #移动蛇ret = snake_is_alive(snake_coords)if not ret:break #蛇死了. 游戏结束snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物screen.fill(BG_COLOR)#draw_grid(screen)draw_snake(screen, snake_coords)draw_food(screen, food)draw_score(screen, len(snake_coords) - 3)pygame.display.update()snake_speed_clock.tick(snake_speed) #控制fps,使蛇获得速度
#将食物画出来
def draw_food(screen, food):x = food['x'] * cell_sizey = food['y'] * cell_sizeappleRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, Red, appleRect)
#将贪吃蛇画出来
def draw_snake(screen, snake_coords):for coord in snake_coords:x = coord['x'] * cell_sizey = coord['y'] * cell_sizewormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, dark_blue, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(                #蛇身体里面的第二层亮蓝色x + 4, y + 4, cell_size - 8, cell_size - 8)pygame.draw.rect(screen, blue, wormInnerSegmentRect)
#画网格
def draw_grid(screen):for x in range(0, windows_width, cell_size):  # draw 水平 linespygame.draw.line(screen, dark_gray, (x, 0), (x, windows_height))for y in range(0, windows_height, cell_size):  # draw 垂直 linespygame.draw.line(screen, dark_gray, (0, y), (windows_width, y))
#移动贪吃蛇
def move_snake(direction, snake_coords):if direction == UP:newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']}elif direction == RIGHT:newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']}snake_coords.insert(0, newHead)
#判断蛇死了没
def snake_is_alive(snake_coords):tag = Trueif snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \snake_coords[HEAD]['y'] == map_height:tag = False # 蛇碰壁啦for snake_body in snake_coords[1:]:if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:tag = False # 蛇碰到自己身体啦return tag
#判断贪吃蛇是否吃到食物
def snake_is_eat_food(snake_coords, food):  #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:food['x'] = random.randint(0, map_width - 1)food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置else:del snake_coords[-1]  # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉
#食物随机生成
def get_random_location():return {'x': random.randint(0, map_width - 1), 'y': random.randint(0, map_height - 1)}
#开始信息显示
def show_start_info(screen):font = pygame.font.Font('myfont.ttf', 40)tip = font.render('按任意键开始游戏~~~', True, (65, 105, 225))gamestart = pygame.image.load('gamestart.png')screen.blit(gamestart, (140, 30))screen.blit(tip, (240, 550))pygame.display.update()while True:  #键盘监听事件for event in pygame.event.get():  # event handling loopif event.type == QUIT:terminate()     #终止程序elif event.type == KEYDOWN:if (event.key == K_ESCAPE):  #终止程序terminate() #终止程序else:return #结束此函数, 开始游戏
#游戏结束信息显示
def show_gameover_info(screen):font = pygame.font.Font('myfont.ttf', 40)tip = font.render('按Q或者ESC退出游戏, 按任意键重新开始游戏~', True, (65, 105, 225))gamestart = pygame.image.load('gameover.png')screen.blit(gamestart, (60, 0))screen.blit(tip, (80, 300))pygame.display.update()while True:  #键盘监听事件for event in pygame.event.get():  # event handling loopif event.type == QUIT:terminate()     #终止程序elif event.type == KEYDOWN:if event.key == K_ESCAPE or event.key == K_q:  #终止程序terminate() #终止程序else:return #结束此函数, 重新开始游戏
#画成绩
def draw_score(screen,score):font = pygame.font.Font('myfont.ttf', 30)scoreSurf = font.render('得分: %s' % score, True, Green)scoreRect = scoreSurf.get_rect()scoreRect.topleft = (windows_width - 120, 10)screen.blit(scoreSurf, scoreRect)
#程序终止
def terminate():pygame.quit()sys.exit()main()

用Python做贪吃蛇小游戏相关推荐

  1. python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏

    Python编写贪吃蛇 前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前.看来大家对这类简单易上手小游戏还是很喜爱的. 恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉, ...

  2. 用python实现贪吃蛇小游戏

    好的,以下是用Python实现贪吃蛇小游戏的基本步骤: 1.导入必要的模块:需要使用Pygame模块来创建游戏窗口.处理用户输入.绘制游戏元素等. 2.初始化游戏:创建游戏窗口.初始化游戏元素(如蛇的 ...

  3. Python实现贪吃蛇小游戏(双人模式)

    这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...

  4. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  5. 10分钟用python编写贪吃蛇小游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏...

    贪吃蛇,大家应该都玩过.当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最主要 ...

  6. python制作贪吃蛇小游戏,畅玩无限制

    前言 大家早好.午好.晚好吖 ❤ ~ 现在这年头,无论玩个什么游戏都有健康机制, 这让我们愉悦玩游戏得步伐变得承重起来, 于是无聊之下我写了个贪吃蛇小游戏,来玩个快乐 代码展示 导入模块 import ...

  7. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 贪吃蛇 ...

  8. Python:贪吃蛇小游戏

    #pygame游戏库,sys操控python运行的环境 import pygame,sys,random #这个模块包含所有pygame所使用的常亮 from pygame.locals import ...

  9. python实现贪吃蛇小游戏

    资源共享学习交流群号:769674658(快满)qq交流二群(296389054) 本文将带你一步步用python语言实现一个snake小游戏. 转载地址:https://www.zhihu.com/ ...

最新文章

  1. 向 Web 开发人员推荐35款 JavaScript 图形图表库
  2. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...
  3. hadoop win环境依赖winutils.exe等的gitee下载地址
  4. c++ 准确计时_C++精确计时
  5. Spark RDD的默认分区数:(spark 2.1.0)
  6. 【招聘(北京)】东方国信 工业互联网
  7. 1-4flink概述
  8. chrome和safari_私人浏览器-如何在Chrome和Safari中使用隐身模式
  9. 为什么是List list = new ArrayList,而不直接用ArrayList
  10. python线性链表
  11. 2019CBA全明星周末大幕落下 南方明星队大比分获胜
  12. VB 提示框MsgBox用法
  13. 使用php的curl爬去青果教务系统 课表(转)
  14. 菜鸟网络今日发布超级机器人旗舰仓
  15. 商业数据分析-战略分析读后感
  16. Ceph-ansible 安装 ceph (rbd + rgw)
  17. 微信清理网页缓存的办法
  18. iOS 后台运行 Background Task与Background Mode
  19. 信息管理与信息系统与ERP
  20. 【计算机原理与接口技术(UNIX)⑬】——总线概述【总线与总线标准、总线结构、ISA、PCI、IDE】

热门文章

  1. 1ppt.com.html,第一PPT模板网-WW.1PPT.COM.ppt
  2. 2018年语音识别行业测评
  3. js压缩图片(ajax上传)
  4. 1.pytorch lightning之验证与测试
  5. 十分钟理解Transformer
  6. 基于人脸识别的门禁管理系统
  7. 【行业解决方案】基于RTMP推流协议视频智能分析/人脸识别平台EasyDSS,构建智能多媒体展厅解决方案
  8. 双十二年终盛典,几何画板放价为您!
  9. 简单的裸眼3D技术原理
  10. 设备调试伺服一周脉冲数设置参考