IT技术之家

首页 > Python

Python

python——一步步教你用pyganme完成贪吃蛇小游戏(简易初版)_轮回摆渡者

发布时间:2022-10-24 17:53:15 Python 0次 标签:python pygame
引言??大部分人学会python的基础语法之后,都想着写爬虫,画画,当这两个都完成之后呢?那当然是写一个自己开发的小游戏了,而在所有的小游戏当中,又以贪吃蛇最经典,元素也最少,那么今天,我就给大家讲一下一个初级的贪吃蛇程序该怎么写。步骤第一步:确定画布??首先,我们需要生成我们的游戏画布,确定大小颜色和标题等,因为今天介绍的是简版,所以只要设定画布大小和标题就行,背景颜色看个人喜好添加与否。# 生成游戏窗口screen = pg.display.set_mode((500, 500))# 生成...

引言

??大部分人学会python的基础语法之后,都想着写爬虫,画画,当这两个都完成之后呢?那当然是写一个自己开发的小游戏了,而在所有的小游戏当中,又以贪吃蛇最经典,元素也最少,那么今天,我就给大家讲一下一个初级的贪吃蛇程序该怎么写。

步骤

第一步:确定画布

??首先,我们需要生成我们的游戏画布,确定大小颜色和标题等,因为今天介绍的是简版,所以只要设定画布大小和标题就行,背景颜色看个人喜好添加与否。

# 生成游戏窗口
screen = pg.display.set_mode((500, 500))
# 生成游戏名称
pg.display.set_caption('贪吃蛇大作战')
# 生成fps对象,用来后面调节速度
fps = pg.time.Clock()

??在这里,我将要生成的是一个500的正方形画布,标题就叫贪吃蛇大作战

第二步:梳理方法

??在编写程序之前,我们需要先理清楚贪吃蛇需要哪些方法(即过程),以及各自的目的:

方法目的
def foods建立生成新食物位置方法,需要食物不在蛇头处
def draw建立绘制蛇与食物的方法
def snake_die判断蛇是否死了(蛇头出界或者触碰到身体)
def move_snake移动蛇,使蛇在画布上做出视觉上的移动
def is_eat判断是否吃到食物
def keyboard响应玩家操作
things在画布上生成蛇与食物
def game_run游戏运行程序

??在过程梳理完之后,我们需要了解pygame库要用到什么函数,以及各自的作用:

函数作用
display.set_mode创建显示窗口,可以设置窗口大小
display.set_caption设置标题
time.Clock()设置屏幕刷新率,也就是fps,配合.tick(n)设置速度为n,n越大刷新越快,蛇的速度也就越快
draw.rect在画布上绘制图案,传参为创建的窗口,颜色,位置,大小
event.get()获得事件,例如QUIT退出,KEYDOWN键盘等
display.set_mode.fill设置背景,可以是颜色也可以是图像
display.flip()刷新屏幕,整体全部刷新
display.update()刷新屏幕,可以传参,传参即刷新传入的内容,不传参与 flip一致
第三步:编写方法

??方法梳理完毕,函数也了解清楚后,就开始编写我们的几个过程内容吧:

# 建立生成食物位置方法,需要食物不在蛇头处
def foods(head):
    while True:
        x = random.randint(1, 49) * 10
        y = random.randint(1, 49) * 10
        new_food = [x, y]
        if head[0] == x and head[1] == y:
            continue
        else:
            break
    return new_food

当旧食物被吃掉后,我们需要生成新的食物,新食物的位置利用random随机生成,就需要判断新食物不与蛇头重合,如果重合,则重新生成。

# 建立绘制蛇与食物的方法
def draw(color, pos):
    pg.draw.rect(screen, color, pg.Rect(pos[0], pos[1], 10, 10))

这个方法是对draw.rect的加工,方便后面绘制蛇与食物的时候代码简便

# 判断蛇是否死了
def snake_die(head, body):
    # 定义蛇死亡标志
    die_flag = False
    # 如果蛇头与身体某部分重合,则判断为死亡
    for bd in body:
        if head[0] == bd[0] and head[1] == bd[1]:
            die_flag = True
    # 如果蛇头在窗口外则死亡
    if head[0] > 500 or head[0] < 0 or head[1] > 500 or head[1] < 0 or die_flag:
        sys.exit()

玩过贪吃蛇的都知道,蛇头不能超过屏幕,超过的话就gameover,蛇头触碰到身体也是如此,所以这里就判断蛇头位置,给一个默认False的flag,如果蛇头超限或者与身体重合,flag变为True,游戏结束,退出游戏

# 响应玩家操作
def keyboard(run_snake):
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        elif i.type == pg.KEYDOWN:
            if i.key == pg.K_UP and run_snake != '↓':
                run_snake = '↑'
            if i.key == pg.K_DOWN and run_snake != '↑':
                run_snake = '↓'
            if i.key == pg.K_LEFT and run_snake != '→':
                run_snake = '←'
            if i.key == pg.K_RIGHT and run_snake != '←':
                run_snake = '→'
    return run_snake

玩家按键之后,系统做出响应,读取按键并给出移动方向。

# 移动蛇
def move_snake(run_snake, head, body):
    body.insert(0, [head[0], head[1]])
    # 根据玩家键入方向进行蛇头xy的更新
    if run_snake == '↑':
        head[1] -= 10
    elif run_snake == '↓':
        head[1] += 10
    elif run_snake == '←':
        head[0] -= 10
    elif run_snake == '→':
        head[0] += 10

贪吃蛇,最重要的就是蛇的移动,不能动或者乱动,那游戏就不成立,
这里每次移动前将旧蛇头位置插入身体数据里,然后判断按键,根据不同方向键蛇头做出不同反应。

# 判断是否吃到食物
def is_eat(head, food, body):
    # 如果吃到了,则生成新食物
    if head[0] == food[0] and head[1] == food[1]:
        new_food = foods(head)
    # 如果没吃到则删除一节旧身体
    else:
        body.pop()
        new_food = food
    return new_food

蛇移动结束,判断是否吃到食物,吃到则获取新食物坐标,没吃到则将身体最后一节的数据删除

# 在画布上生成蛇与食物
def things(food, head, body):
    # 生成食物
    draw(red, food)
    # 生成蛇头
    draw(green, head)
    # 生成蛇身体
    for pos in body:
        draw(white, pos)

前置数据准备完毕,在画布上生成游戏元素

# 建立游戏运行程序
def game_run():
    # 初始蛇运动方向
    run_snake = '→'
    # 初始蛇位置
    head = [250, 250]
    body = [[head[0] - 10, head[1]], [head[0] - 20, head[1]], [head[0] - 30, head[1]]]
    # 初始化食物位置
    food = [300, 300]

    # 游戏循环
    while True:
        run_snake = keyboard(run_snake)
        move_snake(run_snake, head, body)
        snake_die(head, body)
        food = is_eat(head, food, body)
        # 创建背景颜色
        screen.fill(black)
        # 绘制食物与蛇
        things(food, head, body)
        # 刷新屏幕
        pg.display.update()
        # 通过帧率设置贪吃蛇速度
        fps.tick(6)

设定初始蛇头,蛇身,食物位置以及初始运动方向,调用前面的方法运行,因为游戏不是一次性渲染静图,而是一直在改变的,所以需要死循环维持游戏运行。

第四步:整合运行

??过程方法编写完成,最后,我们就需要将代码组合,形成我们最终的程序,然后运行,我们的贪吃蛇简易小游戏就完成了。

import sys

import pygame as pg
import random

# 初始化pygame
pg.init()

# 生成颜色
white = 255, 255, 255
red = 255, 0, 0
green = 0, 255, 0
black = 0, 0, 0

# 生成游戏窗口
screen = pg.display.set_mode((500, 500))
# 生成游戏名称
pg.display.set_caption('贪吃蛇大作战')
# 生成fps对象,用来后面调节速度
fps = pg.time.Clock()


# 建立生成食物位置方法,需要食物不在蛇头处
def foods(head):
    while True:
        x = random.randint(1, 49) * 10
        y = random.randint(1, 49) * 10
        new_food = [x, y]
        if head[0] == x and head[1] == y:
            continue
        else:
            break
    return new_food


# 建立绘制蛇与食物的方法
def draw(color, pos):
    pg.draw.rect(screen, color, pg.Rect(pos[0], pos[1], 10, 10))


# 判断蛇是否死了
def snake_die(head, body):
    # 定义蛇死亡标志
    die_flag = False
    # 如果蛇头与身体某部分重合,则判断为死亡
    for bd in body:
        if head[0] == bd[0] and head[1] == bd[1]:
            die_flag = True
    # 如果蛇头在窗口外则死亡
    if head[0] > 500 or head[0] < 0 or head[1] > 500 or head[1] < 0 or die_flag:
        sys.exit()


# 响应玩家操作
def keyboard(run_snake):
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        elif i.type == pg.KEYDOWN:
            if i.key == pg.K_UP and run_snake != '↓':
                run_snake = '↑'
            if i.key == pg.K_DOWN and run_snake != '↑':
                run_snake = '↓'
            if i.key == pg.K_LEFT and run_snake != '→':
                run_snake = '←'
            if i.key == pg.K_RIGHT and run_snake != '←':
                run_snake = '→'
    return run_snake


# 移动蛇
def move_snake(run_snake, head, body):
    body.insert(0, [head[0], head[1]])
    # 根据玩家键入方向进行蛇头xy的更新
    if run_snake == '↑':
        head[1] -= 10
    elif run_snake == '↓':
        head[1] += 10
    elif run_snake == '←':
        head[0] -= 10
    elif run_snake == '→':
        head[0] += 10


# 判断是否吃到食物
def is_eat(head, food, body):
    # 如果吃到了,则生成新食物
    if head[0] == food[0] and head[1] == food[1]:
        new_food = foods(head)
    # 如果没吃到则删除一节旧身体
    else:
        body.pop()
        new_food = food
    return new_food


# 在画布上生成蛇与食物
def things(food, head, body):
    # 生成食物
    draw(red, food)
    # 生成蛇头
    draw(green, head)
    # 生成蛇身体
    for pos in body:
        draw(white, pos)


# 建立游戏运行程序
def game_run():
    # 初始蛇运动方向
    run_snake = '→'
    # 初始蛇位置
    head = [250, 250]
    body = [[head[0] - 10, head[1]], [head[0] - 20, head[1]], [head[0] - 30, head[1]]]
    # 初始化食物位置
    food = [300, 300]

    # 游戏循环
    while True:
        run_snake = keyboard(run_snake)
        move_snake(run_snake, head, body)
        snake_die(head, body)
        food = is_eat(head, food, body)
        # 创建背景颜色
        screen.fill(black)
        # 绘制食物与蛇
        things(food, head, body)
        # 刷新屏幕
        pg.display.update()
        # 通过帧率设置贪吃蛇速度
        fps.tick(6)


game_run()

第五步:总结

好了,本次贪吃蛇教程到这就结束了,因为是简易版,就没管分数,动态速度,背景,游戏素材方面了,后面我会慢慢在这个基础上完善,喜欢的话记得点赞收藏关注哦,后续完成后我还会分享到博客上的,拜拜。


小伙伴如果在阅读或实现过程中遇到问题的,可以评论区问我,我上线看到后会给你解答的。