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.代码实现

  • 基本代码实现如下:
# 导入框架
import pygame
import random # 设置大小长度
W = 800
H = 600
size = (W, H)
# 设定游戏行列数
ROW = 30
COL = 40 # 定义要使用的类(用来记录点坐标)
class Point:
def __init__(self, row, col):
self.row = row
self.col = col def copy(self):
return Point(row=self.row, col=self.col) # 定义绘画的函数
def rect(point, color):
cell_width = W / COL
cell_height = H / ROW
left = point.col * cell_width
top = point.row * cell_height
pygame.draw.rect(screen, color, (left, top, int(cell_width), int(cell_height))) # 随机生成食物
def genfood():
while True:
food_x = Point(row=random.randint(0, ROW - 1), col=random.randint(0, COL - 1))
if food_x.row != head.row and food_x.col != head.col and food_x not in snakebody:
return food_x # pygame初始化框架
pygame.init() screen = pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇')
clock = pygame.time.Clock()
# 定义蛇身
snakebody = []
snakebody_color = (200, 200, 200)
# 定义蛇头
head = Point(row=0, col=0)
head_color = (0, 128, 200)
# 定义食物
food = genfood()
food_color = (255, 255, 0)
# 计分
score = 0
# 方向
direct = 'right'
# 循环
quit = True
while quit:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit = False
elif event.type == pygame.KEYDOWN:
if event.key == 1073741906 or event.key == 119:
if direct == 'right' or direct == 'left':
direct = 'up'
elif event.key == 1073741905 or event.key == 115:
if direct == 'right' or direct == 'left':
direct = 'down'
elif event.key == 1073741904 or event.key == 97:
if direct == 'up' or direct == 'down':
direct = 'left'
elif event.key == 1073741903 or event.key == 100:
if direct == 'up' or direct == 'down':
direct = 'right'
# 处理蛇身
snakebody.insert(0, head.copy())
# 处理吃到食物
eat = (head.row == food.row and head.col == food.col)
if eat:
food = genfood()
score += 1
else:
if len(snakebody) != 0:
snakebody.pop()
# 移动
if direct == 'up':
head.row -= 1
elif direct == 'down':
head.row += 1
elif direct == 'left':
head.col -= 1
elif direct == 'right':
head.col += 1
# 设定死亡
dead = False
if head.row < 0 or head.col < 0 or head.row >= ROW or head.col >= COL:
dead = True
for snake in snakebody:
if snake.row == head.row and snake.col == head.col:
dead = True
if dead:
quit = False
# 渲染画面
# pygame.draw.rect(screen, (255, 255, 255), (0, 0, W, H))
screen.fill(pygame.Color('White'))
# 画蛇头,蛇身,食物
rect(head, head_color)
for snake in snakebody:
rect(snake, snakebody_color)
rect(food, food_color) # 计算机处理
pygame.display.flip()
# 设置帧率
clock.tick(10)
else:
# 打印分数
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. kafka学习笔记(七)kafka的状态机模块

    概述 这一篇随笔介绍kafka的状态机模块,Kafka 源码中有很多状态机和管理器,比如之前我们学过的 Controller 通道管理器 ControllerChannelManager.处理 Con ...

  2. kafka时间轮的原理(一)

    概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...

  3. 论文解读DEC《Unsupervised Deep Embedding for Clustering Analysis》

    Junyuan Xie, Ross B. Girshick, Ali Farhadi2015, ICML1243 Citations, 45 ReferencesCode:DownloadPaper: ...

  4. 《剑指offer》面试题43. 1~n整数中1出现的次数

    问题描述 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 示例 1: 输入:n = 12 ...

  5. 进程池与线程池基本使用、协程理论与实操、IO模型、前端、BS架构、HTTP协议与HTML前戏

    昨日内容回顾 GIL全局解释器锁 1.在python解释器中 才有GIL的存在(只与解释器有关) 2.GIL本质上其实也是一把互斥锁(并发变串行 牺牲效率保证安全) 3.GIL的存在 是由于Cpyth ...

  6. Solon Web 开发

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. golang中函数的参数

    1. 函数当做函数的参数 package main import "fmt" type HandleFunc func(int) (int, bool) func add10(nu ...

  8. Go 面向对象之结构体

    #### Go 面向对象之结构体最近有四天没更新公众号,有一些事情耽误了,生活就是这样,总会一些事情让人措不及防; ***山浓水浅,坐看流年***1. Go 也支持面向对象编程(OOP) 但是它和传统 ...

  9. CPU Cache与缓存行

    编译环境:windows10+Idea+x86 CPU. 1.CPU Cache CPU 访问内存时,首先查询 cache 是否已缓存该数据.如果有,则返回数据,无需访问内存:如果不存在,则需把数据从 ...

  10. 2022.02.04 Day1

    前言 为日后的算法面试做准备,自己也很喜欢算法这个东西,每天3~5道题. 刷题 1.leetcode 209 长度最下的子数组 题目 长度最下的子数组 大致的意思是从数组中找到长度最小的数组,并且数组 ...