d=====( ̄▽ ̄*)b 叮~

Python —— 简易贪吃蛇实现

目录:

1.基本原理

2.需要学习的库

3.代码实现

1.基本原理

基本贪吃蛇所需要的东西其实很少,只需要有一块让蛇动的屏幕,

在屏幕上有蛇,食物,

最后打印分数即可。

例如这个样子:(这是作者写的代码最后实现的效果)(有点简陋,都简单实现了要啥自行车)

  • 在这边需要说明的是(重点):

其实贪吃蛇无异于在放映动画,

每一次贪吃蛇的移动,其实是蛇在下一幅画面相对于原来的画面移动了一个格子,

而我们要做的,就是解决每次移动格子的问题

而解决该问题的方法,其实就是自己设定初始方向,

然后在每一次收到我们键盘按下的方向,改变设定方向,然后根据设定方向,向该方向移动一格。

说到移动,需要说明的是,作者采用列表的存储方法,将蛇身存储进来(蛇头另外定义),每次移动的时候,

将蛇头存储进列表,删除最后一个元素(就是蛇尾),通过这种方式来移动蛇,也就是作者说的移动一格。

而当我们吃到食物的时候,就可以不用删除最后一个元素,这样蛇身就自然增长一格了。

在下面的代码实现中你就可以看到如何实现。

2.需要学习的库 —— pygame,random(自学)(由于random库较为简单,这里并不赘述.)

pygame 是python专门写来做游戏的库,在学习python的时候可能或多或少会见到这个库,

当你引入该库的时候,如果你使用pycharm编译器或者其他文本编译器时,使用pygame库的时候(记得要写init()函数初始化),

编译器会告诉你这样一句话:

这代表你成功的引入了这个库,接下里你可以使用该库进行游戏的编写。

要学习的函数(内置于pygame的函数)

1.diplay()

这个函数是用来掌管所有计算机(屏幕上显示)的画面。

例如pygame.display.set_mode(屏幕尺寸)就是设定贪吃蛇屏幕大小,

pygame.display.set_caption('贪吃蛇')就是设定标题的。

2.time()

这个函数用来掌管游戏的时钟,(用途多多,在贪吃蛇里面用屈才了),

在贪吃蛇游戏里面用处就是设置帧率。(也就是蛇的移动速度)

(运用tick(帧率)函数来设置帧率,也就是蛇的移动速度。)

3.event()

用来处理用户,对象(也就是玩家)操作的反馈,收集的函数。

比如在贪吃蛇中你所要操作的上下左右改变方向,以及关闭游戏。

(不要单纯认为你自己点了右上角的红色叉叉就关闭了,点了关不掉,会卡死)

(必须手写代码来设置关闭,[比如你点了红色叉叉,你要让event()收到,然后写代码让游戏关闭])

event()需要学习的函数

pygame.event.get() 无需添加参数,可直接收到用户操作信息

4.draw()

用来进行绘画,渲染方面的工作,也就是将贪吃蛇画出来,

在这边我们只用rect(屏幕,颜色,(坐标,尺寸))函数进行绘画。

穿插知识点:

在我们这边画的时候是可以使用RGB调色的。

所谓RGB调色,就是用一个元组(red,green,blue)来调出我们需要的颜色,

例如(0,0,0)为黑色,(255,255,255)为白色,

所有的颜色都是从0-255来调的。

像我们来为屏幕填充白色的时候我们就可以用

pygame.draw.rect(screen, (255, 255, 255), (0, 0, W, H))来画出整个屏幕的颜色。

当然,我们也可以用fill的方法,使用pygame自带的颜色来定义屏幕颜色。

例如:screen.fill(pygame.Color('White'))(这里的screen是屏幕的变量)

3.代码实现

  • 基本代码实现如下:
  1. # 导入框架
  2. import pygame
  3. import random
  4. # 设置大小长度
  5. W = 800
  6. H = 600
  7. size = (W, H)
  8. # 设定游戏行列数
  9. ROW = 30
  10. COL = 40
  11. # 定义要使用的类(用来记录点坐标)
  12. class Point:
  13. def __init__(self, row, col):
  14. self.row = row
  15. self.col = col
  16. def copy(self):
  17. return Point(row=self.row, col=self.col)
  18. # 定义绘画的函数
  19. def rect(point, color):
  20. cell_width = W / COL
  21. cell_height = H / ROW
  22. left = point.col * cell_width
  23. top = point.row * cell_height
  24. pygame.draw.rect(screen, color, (left, top, int(cell_width), int(cell_height)))
  25. # 随机生成食物
  26. def genfood():
  27. while True:
  28. food_x = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1))
  29. if food_x.row != head.row and food_x.col != head.col and food_x not in snakebody:
  30. return food_x
  31. # pygame初始化框架
  32. pygame.init()
  33. screen = pygame.display.set_mode(size)
  34. pygame.display.set_caption('贪吃蛇')
  35. clock = pygame.time.Clock()
  36. # 定义蛇身
  37. snakebody = []
  38. snakebody_color = (200, 200, 200)
  39. # 定义蛇头
  40. head = Point(row=0, col=0)
  41. head_color = (0, 128, 200)
  42. # 定义食物
  43. food = genfood()
  44. food_color = (255, 255, 0)
  45. # 计分
  46. score = 0
  47. # 方向
  48. direct = 'right'
  49. # 循环
  50. quit = True
  51. while quit:
  52. # 处理事件
  53. for event in pygame.event.get():
  54. if event.type == pygame.QUIT:
  55. quit = False
  56. elif event.type == pygame.KEYDOWN:
  57. if event.key == 1073741906 or event.key == 119:
  58. if direct == 'right' or direct == 'left':
  59. direct = 'up'
  60. elif event.key == 1073741905 or event.key == 115:
  61. if direct == 'right' or direct == 'left':
  62. direct = 'down'
  63. elif event.key == 1073741904 or event.key == 97:
  64. if direct == 'up' or direct == 'down':
  65. direct = 'left'
  66. elif event.key == 1073741903 or event.key == 100:
  67. if direct == 'up' or direct == 'down':
  68. direct = 'right'
  69. # 处理蛇身
  70. snakebody.insert(0, head.copy())
  71. # 处理吃到食物
  72. eat = (head.row == food.row and head.col == food.col)
  73. if eat:
  74. food = genfood()
  75. score += 1
  76. else:
  77. if len(snakebody) != 0:
  78. snakebody.pop()
  79. # 移动
  80. if direct == 'up':
  81. head.row -= 1
  82. elif direct == 'down':
  83. head.row += 1
  84. elif direct == 'left':
  85. head.col -= 1
  86. elif direct == 'right':
  87. head.col += 1
  88. # 设定死亡
  89. dead = False
  90. if head.row < 0 or head.col < 0 or head.row >= ROW or head.col >= COL:
  91. dead = True
  92. for snake in snakebody:
  93. if snake.row == head.row and snake.col == head.col:
  94. dead = True
  95. if dead:
  96. quit = False
  97. # 渲染画面
  98. # pygame.draw.rect(screen, (255, 255, 255), (0, 0, W, H))
  99. screen.fill(pygame.Color('White'))
  100. # 画蛇头,蛇身,食物
  101. rect(head, head_color)
  102. for snake in snakebody:
  103. rect(snake, snakebody_color)
  104. rect(food, food_color)
  105. # 计算机处理
  106. pygame.display.flip()
  107. # 设置帧率
  108. clock.tick(10)
  109. else:
  110. # 打印分数
  111. print(f"你的分数是:{score},你好像有点菜啊QAQ")
  • 最终实现效果:

总结:

  • 贪吃蛇的实现其实不难,只要多多练习,掌握原理即可。

  • 如果还是不明白,可以上B站学习(我也是在B站学的)

  • 我学习贪吃蛇的网站挂这:Python实例:贪吃蛇

Python实例:贪吃蛇(简单贪吃蛇编写)🐍的更多相关文章

  1. [C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义

    蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结, ...

  2. python模块之sys和subprocess以及编写简单的主机扫描脚本

    python模块之sys和subprocess以及编写简单的主机扫描脚本 1.sys模块 sys.exit(n)  作用:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.e ...

  3. python的unitest的简单使用

    python的unitest的简单使用 unittest提供一个TestLoader类用于自动创建一个测试集并把单个测试放入到测试集中. TestLoader自动运行测试用例以test开头的方法的测试 ...

  4. Python 库打包分发、setup.py 编写、混合 C 扩展打包的简易指南(转载)

    转载自:http://blog.konghy.cn/2018/04/29/setup-dot-py/ Python 有非常丰富的第三方库可以使用,很多开发者会向 pypi 上提交自己的 Python ...

  5. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  6. Python基础——爬虫以及简单的数据分析

    目标:使用Python编写爬虫,获取链家青岛站的房产信息,然后对爬取的房产信息进行分析. 环境:win10+python3.8+pycharm Python库: import requests imp ...

  7. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  8. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  9. 【NLP】Python实例:申报项目查重系统设计与实现

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

随机推荐

  1. 微软的Serialize和Newtonsoft的SerializeObject比较

    微软的序列化反序列化组件出来已有好几年了,刚出来的时候各种吐槽.最近在优化代码,比较了一下微软的Serialize和Newtonsoft的SerializeObject,感觉大部分场景下可以用微软的序 ...

  2. Java基础(十)——枚举与注解

    一.枚举 1.介绍 枚举类:类的对象只有有限个,确定的.当需要定义一组常量时,强烈建议使用枚举类.如果枚举类中只有一个对象,则可以作为单例模式的实现. 使用 enum 定义的枚举类默认继承了 java ...

  3. vue3代码setup中this为什么无效

    结论:setup并没有通过各种方式去绑定this 在vue2中,我们可以在optionsApi中调用this来指向当前组件的实例,但是在vue3的setup中并不能这样做,因为setup位于组件创建成 ...

  4. 【刷题-LeetCode】236. Lowest Common Ancestor of a Binary Tree

    Lowest Common Ancestor of a Binary Tree Given a binary tree, find the lowest common ancestor (LCA) o ...

  5. 使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL及示例项目介绍

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 前言 这篇文章是这个系列的第一篇,我们会简单地讨论一下GraphQL,然后介绍一下这个系列将会使用的示例项目. 关 ...

  6. grpc基础讲解和golang实现grpc通信小案例

    grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...

  7. 不难懂------适配移动端flexible

    基于 vue-cli 配置手淘的 lib-flexible + rem,实现移动端自适应 安装 flexible npm install lib-flexible --save 引入 flexible ...

  8. HMS Core 6.3.0 版本发布公告

    新增内容风控检测,若用户输入内容不符合国家法律法规要求,风控将会拦截,无法翻译手语动作. 查看详情>> 新增受众同步至HUAWEI Ads功能,实现精准投放高价值用户,提升广告效率: 新增 ...

  9. 洛谷P1002过河卒java100分题解

    题目描述如图: 这道题我以前以回溯的方法做,只能拿到60分 现在才发现是道动态规划题 解题思路: 创建一个(0,0)到终点打小的二维数组表示棋盘 每个坐标的值为此位置到终点的路数 最下方一排和最右方一 ...

  10. Redis内存满了怎么办(新年快乐)

    Redis内存满了怎么办(新年快乐) 入我相思门,知我相思苦. 长相思兮长相忆,短相思兮无穷极. 一.配置文件 Redis长期使用或者不设置过期时间,导致内存爆满或不足,可以到Redis的配置文件re ...