贪吃蛇小游戏(基于Python)

废话少说直接上代码,这一波直接稳定大家的心绪。

import pygame, sys, random, time
from pygame.locals import *  # 从pygame模块导入常用的函数和常量
#定义颜色变量
black_colour = pygame.Color(0, 0, 0)
white_colour = pygame.Color(255, 255, 255)
red_colour = pygame.Color(255,0 , 0)
grey_colour = pygame.Color(150, 150, 150)
light_colour = pygame.Color(220,220,220)
#定义游戏结束函数
def GameOver(gamesurface):
    # 设置提示字体的格式
    GameOver_font = pygame.font.SysFont("MicrosoftYaHei", 45)
    # 设置提示字体的颜色
    GameOver_colour = GameOver_font.render('GameOver', True, grey_colour)#只能英文
    # 设置提示位置
    GameOver_location = GameOver_colour.get_rect()
    GameOver_location.midtop = (310, 200)
    # 绑定以上设置到句柄
    gamesurface.blit(GameOver_colour, GameOver_location)
    # 提示运行信息
    pygame.display.flip()
    # 休眠5秒
    time.sleep(3)
    # 退出游戏
    pygame.quit()
    # 退出程序
    sys.exit()
#定义主函数
def main():
    # 初始化pygame,为使用硬件做准备
    pygame.init()
    pygame.time.Clock()
    ftpsClock = pygame.time.Clock()
    # 创建一个窗口
    gamesurface = pygame.display.set_mode((640, 480))
    # 设置窗口的标题
    pygame.display.set_caption('贪吃蛇 snake')
    # 初始化变量
    # 初始化贪吃蛇的起始位置
    snakeposition = [100, 100]
    # 初始化贪吃蛇的长度
    snakelength = [[100, 100], [80, 100], [60, 100]]
    # 初始化目标方块的位置
    square_purpose = [300, 300]
    # 初始化一个数来判断目标方块是否存在
    square_position = 1
    # 初始化方向,用来使贪吃蛇移动
    derection = "right"
    change_derection = derection
    pygame.mixer.music.load("a.mp3")
    # 进行游戏主循环
    while True:
        if pygame.mixer.music.get_busy() == False :
            pygame.mixer.music.play()
        # 检测按键等pygame事件
        for event in pygame.event.get():
            if event.type == QUIT:
                # 接收到退出事件后,退出程序
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                # 判断键盘事件,用w,s,a,d来表示上下左右
                if event.key == K_RIGHT or event.key == ord('d'):
                    change_derection = "right"
                if event.key == K_LEFT or event.key == ord('a'):
                    change_derection = "left"
                if event.key == K_UP or event.key == ord('w'):
                    change_derection = "up"
                if event.key == K_DOWN or event.key == ord('s'):
                    change_derection = "down"
                if event.key == K_ESCAPE:
                    pygame.event.post(pygame.event.Event(QUIT))
        # 判断移动的方向是否相反
        if change_derection == 'left' and not derection == 'right':
            derection = change_derection
        if change_derection == 'right' and not derection == 'left':
            derection = change_derection
        if change_derection == 'up' and not derection == 'down':
            derection = change_derection
        if change_derection == 'down' and not derection == 'up':
            derection = change_derection
        # 根据方向,改变坐标
        if derection == 'left':
            snakeposition[0] -= 20
        if derection == 'right':
            snakeposition[0] += 20
        if derection == 'up':
            snakeposition[1] -= 20
        if derection == 'down':
            snakeposition[1] += 20
        # 增加蛇的长度
        snakelength.insert(0, list(snakeposition))
        # 判断是否吃掉目标方块
        if snakeposition[0] == square_purpose[0] and snakeposition[1] == square_purpose[1]:
            square_position = 0
        else:
            snakelength.pop()
        # 重新生成目标方块
        if square_position == 0:
            # 随机生成x,y,扩大二十倍,在窗口范围内
            x = random.randrange(1, 32)
            y = random.randrange(1, 24)
            square_purpose = [int(x * 20), int(y * 20)]
            square_position = 1
        # 绘制pygame显示层
        gamesurface.fill(white_colour)
        for position in snakelength:
            pygame.draw.rect(gamesurface, light_colour, Rect(position[0], position[1], 20, 20))
            pygame.draw.rect(gamesurface, red_colour, Rect(square_purpose[0], square_purpose[1], 20, 20))
            pygame.draw.rect(gamesurface, black_colour, Rect(snakeposition[0], snakeposition[1], 20, 20))
        # 刷新pygame显示层
        pygame.display.flip()
        # 判断是否死亡
        if snakeposition[0] < 0 or snakeposition[0] > 620:
            GameOver(gamesurface)
        if snakeposition[1] < 0 or snakeposition[1] > 460:
            GameOver(gamesurface)
        for snakebody in snakelength[1:]:
            if snakeposition[0] == snakebody[0] and snakeposition[1] == snakebody[1]:
                GameOver(gamesurface)
        # 显示分数
        # 显示速度
        score = 0
        speed = 5
        if len(snakelength)>3:
            score = len(snakelength) - 3
            speed = speed + score/4
        score_font = pygame.font.Font(None, 36)
        score_text1 = score_font.render('Score: '+ str(score), True, (0, 0, 0))
        score_text2 = score_font.render('Speed: '+ str(speed), True, (0, 0, 0))
        text_rect1 = score_text1.get_rect()
        text_rect2 = score_text2.get_rect()
        text_rect1.topleft = [10, 10]
        text_rect2.topright = [630, 10]
        gamesurface.blit(score_text1, text_rect1)
        gamesurface.blit(score_text2, text_rect2)
       # 更新屏幕(因为分数或者速度及时变化得以屏幕所显改变)
        pygame.display.update()
        ticks = pygame.time.get_ticks()
        ftpsClock.tick(speed)
        
if __name__ == "__main__":
    main()

对于类似的基础小游戏,可以使用不同的编程语言进行编写,首先确保代码完整性,基于完整性的基础山创造一些属于自己的个性化内容。

首先我们要知道我们要干什么怎么干,明确这些概念之后就理一下思路,着手考虑一下前后写什么,中间写什么。

分享一下我的心路历程以文本形式展示:

1.前期思考、准备部分
对于这类小游戏当我们第一次接触手机,也就是老版的诺基亚,当时这款游戏逐步成为日常娱乐必选,但是随着智能手机的普及以及互联网时代的到来,贪吃蛇也逐步进化,但是我们应该了解贪吃蛇的本质。
我们可以试着回忆一下贪吃蛇进入游戏之后的页面,比如先是条小蛇,它是类似于一个Python的列表,这个列表里边顺序可以没有规则,是显示长度len,然后随着随机生成一个点(有键值),通过控制方向键对蛇进行控制,使小蛇靠近该点最终对于该点的进行"收取"也就是整合,使得小蛇长度增长,随着小蛇身体的增长就是列表len长度边长,如果操作不慎会使得小蛇接触自己的身体或者四边窗口,这时记做小蛇"死亡"可以显示"game over"
第一步,小蛇出现
建立一个新框,确定窗口标识,给定一个窗口内的一个固定位置(x,y,z)假设小蛇出现在该点,确定小蛇形状:方块,小蛇头可以是列表,可随意添加元素,
第二步,出现点
该点可随机
第三步,移动小蛇
通过“w,a,s,d”或者“up,down,right,left”对小蛇进行移动,书写代码的时候可以试着按下某一个键直接执行不需要再enter确定,限制:小蛇不可反向移动
第四步,小蛇融合点
小蛇头部添加一个列表,对列表进行增加元素,随着小蛇步入该点该点的键值会进入列表内,使得len(列表)增加,从而让小蛇看着变长了
第五步,小蛇死亡
通过游戏过程我们知道,小蛇死亡会有四种情况,1、接触墙壁此时也是窗口四边缘,2、接触‘自己身体’,3、填满所创建的整个窗口,此时提示“game over”,4、当我们先按下‘up’键或者‘w’时下一步紧接着按了‘down’或‘s’键那就可以理解为小蛇接触自己的身体,死亡

细节:窗口黑底,小蛇白身,随机点(可多个)红色,蛇吃食物即列表融合元素记录,最后通过初始长度len和最终死亡长度len得出此局游戏获取的分数。小蛇头可以是列表,可随意添加元素。

以上所述均在同一个窗口执行

2.代码展示部分(上面的代码)

其中的背景音乐部分可以随便选一首,这里博主无法上传。

3.解释部分
① 我的作品是:贪吃蛇(以下简称蛇)
② 我实现的功能是:窗口内通过给定坐标先生成一个固定长度的蛇神、蛇头,然后随机生成一个树莓或者说一个坐标点,然后通过控制上下左右方向键或者w、a、s、d键对蛇进行方向的改变,每次改变方向之后就按照所改方向进行直线移动,在蛇头坐标点与随机生成树莓点进行重合时,判断此时蛇吃到食物,之后再随机生成食物,随着蛇吃到食物的的同时蛇身逐渐增长速度逐渐增加分数也随之增加,通过运行代码生成窗口这些东西都能直接看到。作品用到的核心是第三方库-pygame库、创建窗口、绘制及刷新pygame显示层、窗口内部显示分数和速度和屏幕的更新。(提示一下当我们用到第三方库时尽量去IDLE窗口键入"import 库名"进行检查,键入之后按下enter键出现库的版本号就是已安装此库否则就需要在连网状态下手动去命令窗口键入"pip install 库名"进行安装)
③ 作品特色之处:(部分去还原原始出现在"老年机"上面的贪吃蛇)对于贪吃蛇这款小游戏,我小时候是接触的比较多的,未普及智能手机之前可能就类似贪吃蛇这类的小游戏伴随我们童年,我印象中那时候的游戏并不像现在这么复杂多变,但是那就是那个时候的主流娱乐项目,包括推箱子、俄罗斯方块、连连看等。这款游戏的代码很开放,所以对于方向键的实现就很普遍相同了,这个作品的特色之处可能就只是速度随着蛇吃到食物开始加快(速度可调)和在窗口界面显示分数和速度,既视感带来的紧张和刺激随着可视的速度而增加,同时屏幕刷新使得分数显示让我们随时知道自己游戏的进行程度。最后就是背景音乐的出现(可改变),玩游戏吗就是放松娱乐消磨时间,我们可以调慢游戏速度的同时去听一首舒缓的歌或者调快的速度同时背景音乐改成节奏感快的歌曲让我们眼睛、耳朵、大脑三方面同时感受,更有助于体会游戏的乐趣。
④ 遇到的问题:很多但是好在都被解决了,比如为了使游戏速度加快改变原先套路加一个if判断语句,比如分数和速度在窗口显示和最后的更新屏幕的代码,也是在同学的帮助下得以完成。解决问题的方法一个就是不断地试错、查资料、同学讨论,其中同学讨论最为直接,因为写程序的过程中都有自己的见解以及遇到问题的解决方法,所以你遇到的不能解决的问题他可能就不是问题。还有就是我们查阅资料或者粘贴代码的时候一定要明白其中意思,不能只是"粘食",那样课程设计就违背了初衷。

已经接近此次分享结尾,希望大家有所收益,最后想说:多上手多思考,计算机行业天赋无从谈起,只有努力努力再努力,加油,共勉。

猜你喜欢

转载自blog.csdn.net/m0_58366299/article/details/127385358