大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏。如何用python编写贪吃蛇。

今天,突发奇想的想用python写一款小游戏--贪吃蛇。相信大家都玩过,那么玩一款自己写的是一种什么样的体验呢。

我们首先导入相关模块

## 导入相关模块

import random

import pygame

import sys

那么这三个模块有什么意思呢。我们一一介绍。

1.random

Python中的random模块用于生成随机数,它提供了很多函数。常用函数总结如下:
1. random.random()
用于生成一个0到1的随机浮点数: 0 <= n < 1.0
2. random.seed(n)
用于设定种子值,其中的n可以是任意数字。random.random() 生成随机数时,每一次生成的数都是随机的。但是,使用 random.seed(n) 设定好种子之后,在先调用seed(n)时,使用 random() 生成的随机数将会是同一个。
3. random.uniform(a,b)
返回a,b之间的随机浮点数,若a<=b则范围[a,b],若a>=b则范围[b,a] ,a和b可以是实数。
4. random.randint(a,b)
返回a,b之间的整数,范围[a,b],注意:传入参数必须是整数,a一定要比b小。
5. random.randrange([start=0], stop[, step=1])
返回前闭后开区间[start,stop)内的整数,可以设置step。只能传入整数。
6. random.choice(sequence)
从sequence(序列,列表、元组和字符串)中随机获取一个元素。
7. random.choice(sequence, k)
从sequence(序列,列表、元组和字符串)中随机获取k个元素,可能重复,k用参数名传值,k省略则默认取1个,返回list。
8. random. shuffle(x)
用于将列表中的元素打乱顺序,俗称为洗牌。
9. random. sample(sequence,k)
从指定序列中随机获取k个不重复元素作为一个列表返回, sample函数不会修改原有序列。

知识点扩展:
python random模块导入及用法
random是程序随机数,很多地方用到,验证码,图片上传的图片名称等,下面说说python random模块导入及用法
1,模块导入
import random
2,random用法
random.randomrange(1,10) 返回1-10随机数,不包括10
random.randomint(1,10) 返回1-10随机数,包括10
random.randomrange(1,100,2)  随机选取0-100的偶数
random.random() 返回浮点数
random.choice()
random.sample() 从多个字符选取特定字符

2.pygame

pygame简介
pygame可以实现python游戏的一个基础包。
pygame实现窗口
初始化pygame,init()类似于java类的初始化方法,用于pygame初始化。
pygame.init()
设置屏幕,(500,400)设置屏幕初始大小为500 * 400的大小,0和32 是比较高级的用法。这样我们便设置了一个500*400的屏幕。
surface = pygame.display.set_mode((500, 400), 0, 32)
如果不设置pygame事件的话,窗口会一闪而逝。这里去捕捉pygame的事件,如果没有按退出,那么窗口就会一直保持着,这样方便我们去设置不同的内容展示。

3.sys

sys模块 与 os包一样,也是对系统资源进行调用。功能同样也是非常丰富,接下来我们会对 sys模块的一些简单且常用的函数进行介绍,主要针对一些非功能性的函数与属性来认识一些不太常见的 Python 背后的事件。

sys 中的常用方法

示例如下:

//author:爱吃饼干的小白鼠
import sysmodules = sys.modules       # 将 sys 模块的 modules 属性 赋值给 modules 并打印输出 Python启动时加载的模块集合
print(modules)# sys.exit(0)               # 取消注释该行代码,下方所有的代码将不再执行path = sys.path
print(path)                 # 将 sys 模块的 path 属性 赋值给 path 并打印输出 python 环境可以导入内置、第三方包与函数的所在路径code = sys.getdefaultencoding()     # 将 sys 模块 的 getdefaultencoding()函数 赋值给 code 并打印输出当前系统的编码[utf-8]
print(code)# >>> 执行结果如下:
# >>> utf-8print(sys.platform)         # 获取当前系统平台(如windows、Mac、linux)# >>> 执行结果如下:
# >>> darwinprint(sys.version)          # 获取当前 Python 的版本# >>> 执行结果如下:
# >>> 3.8.7 (v3.8.7:6503f05dd5, Dec 21 2020, 12:45:15)
# >>> [Clang 6.0 (clang-600.0.57)]

言归正传,我们继续说说下一步我们要怎么做。

初始化

snake_speed = 10 #贪吃蛇的速度
windows_width = 800
windows_height = 600 #游戏窗口的大小
cell_size = 20       #贪吃蛇身体方块大小,注意身体大小必须能被窗口长宽整除

颜色定义 

# 颜色定义
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时钟对象screen = pygame.display.set_mode((windows_width, windows_height)) #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  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 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)

到这里,我们贪吃蛇的主体程序已经写出来,我们稍加完善就能运行。


哈哈,我已经开始玩自己做的贪吃蛇了,如果想要完整程序,可以关注我下一篇博文。

谢谢大家,今天的分享就到这里了。喜欢的话点个关注吧。

【python小游戏】用python写一款小游戏--贪吃蛇相关推荐

  1. c++编写手机小游戏代码_玩过自己开发的贪吃蛇吗?点这里,教你用Python写一个贪吃蛇小游戏!(附源代码)...

    后台回复'0816',加入Python交流群~ 往日回顾:Python必读好书,这9本份量十足~ 本文代码的实现效果,获取源代码,请直接滑到文末~都说Python除了生孩子,什么都能干.咱们今天,就用 ...

  2. python画圆形螺旋线_Python写的弹球小游戏

    Python 的功能强大应用广泛,从爬虫到 Web 开发,从科学计算到人工智能,都能见到它的身影.当然,Python 还可以编写游戏代码,虽然不是主流,但却十分有趣,既能提升代码能力,又能自娱自乐.敲 ...

  3. 用pygame写一款RPG游戏

    要用 Pygame 写一款 RPG 游戏,首先你需要了解 Pygame 的基本用法.Pygame 是一个 Python 的游戏开发库,可以帮助你快速开发游戏. 在开始写游戏之前,你需要准备好以下几个步 ...

  4. 记事本贪吃蛇游戏代码_如何用Python10分钟绘制贪吃蛇小游戏?

    贪吃蛇是一款经典的益智游戏,有PC和手机等多种版本,既简单又耐玩.玩家通过上下左右键控制蛇的方向,寻找食物,每吃到一次食物,就能得到一定的积分,而且蛇的身体会越来越长.随着蛇的身体变长,游戏的难度就会 ...

  5. 3D游戏编程:介绍一款功能游戏

    3D游戏编程:介绍一款功能游戏 功能游戏简介 介绍游戏:Single N-back 游戏简介 设计元素分析 社会贡献与价值 功能游戏简介 功能游戏(Serious Game)可被理解为严肃性游戏或应用 ...

  6. python弹球小游戏程序设计_Python写的弹球小游戏

    原标题:Python写的弹球小游戏 Python 的功能强大应用广泛,从爬虫到 Web 开发,从科学计算到人工智能,都能见到它的身影.当然,Python 还可以编写游戏代码,虽然不是主流,但却十分有趣 ...

  7. Python代码,能玩30多款童年游戏!这些有几个是你玩过的

    大游戏小游戏有千千万万,这些小游戏应该只有90后才玩过和懂吧 儿童节即将到来,虽然秃头程序员没有头发,但是童心还是一直都在的,今天就分享一些私藏的童年游戏,十几行代码就能进入使用Python开发的小游 ...

  8. 用Java写一款小游戏

    关于本次程序用到的的技能有:数组.监听器.适配器.定时器.本次用到的Java的swing不需要记住这已经被淘汰 效果展示 窗口 import javax.swing.*; import java.aw ...

  9. 表弟打把王者的时间,我就用python写了个自动玩贪吃蛇的程序

    文章目录 实现效果 代码 表弟最近放假了天天打王者,作业也不做,气得我差点想给他买三年高考五年模拟了- 算了,血压有点上升,不管他了,先写代码. 实现效果 先看看效果 这比我手动的快多了,而且是单机的 ...

最新文章

  1. JavaScript sync and async(同步和异步)
  2. KVM日常管理-克隆-快照-磁盘扩容-虚拟磁盘挂载
  3. 在SD/MMC卡上实现hive (Implement WinCE HIVEROM system on NAND or SD system )
  4. SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)
  5. Non-resolvable parent POM
  6. np读取csv文件_pandas.read_csv函数参数详解
  7. Mongo数据库搭建
  8. C语言代码规范(九)运算符优先级使用括号提高阅读性
  9. Jquery实现验证码功能 完美效果 jsp php 页面均可调用
  10. verilog实现多周期处理器之——(零)GUN工具链的安装
  11. Linux:为什么性能工具需要 BPF 技术
  12. ACDsee的安装过程
  13. 工业镜头的主要参数与选型
  14. 微信公众号接口调用php示例,php微信公众号js-sdk开发应用_php实例
  15. 看到了一段话,感触良多
  16. PS2021安装方法(附个人详细安装教程)
  17. 目前上海最便宜的企业宽带-199元的旺铺通B1套餐
  18. 苹果手机用计算机打不开怎么回事啊,苹果手机商店打不开怎么办
  19. c# InvokeRequired和Invoke
  20. Let's Encrypt申请证书及使用

热门文章

  1. jQuery 淡入淡出、滑动和动画
  2. 老照片修复软件哪个好?这些软件值得收藏
  3. MySQL 笔记 —— 时间函数、时间比较
  4. Swift4 'substring(to:)' is deprecated: Please use String slicing subscript with a 'partial range upt
  5. 跟着团子学SAP PS:通过LTMC导入项目结构
  6. 基于SSM高校网上查分系统
  7. 【幸福相守Windows7桌面热门主题】
  8. 职称计算机作用,2010年职称计算机:Photoshop滤镜作用
  9. java 中FreeMaker的使用(excel、word),涉及解压缩
  10. eclipse环境下报错:log cannot be resolved