Python实例:贪吃蛇(简单贪吃蛇编写)🐍

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实例:贪吃蛇

posted @ 2021-08-07 15:29  对讲鸡  阅读(5020)  评论(0编辑  收藏  举报