美文网首页
Pygame - 用80行Python代码实现简单的一个贪吃蛇程

Pygame - 用80行Python代码实现简单的一个贪吃蛇程

作者: Dozing | 来源:发表于2019-05-20 23:46 被阅读0次

    Python有各式各样的第三方库。我们可以调用Python的海量第三方库来实现一些有趣的功能。Pygame是Python用来设计2D游戏的第三方库。通过调用这个第三方库,我们可以用最少的Python代码实现一个基本的贪吃蛇小游戏!

    首先,这个贪吃蛇小游戏应该包含如下的功能:

    • 树莓可以随机生成,但不能超过游戏窗口,也不能生成在'贪吃蛇'的体内。
    • 通过吞吃一个树莓,'贪吃蛇'的身体会增加一个单位长度。
    • '贪吃蛇'的头部碰撞到游戏窗口四周以及身体的某一部分,游戏结束。
    • 显示得分记录

    第一部分:游戏的基本参数设定

    import sys
    import pygame as pg 
    from pygame.locals import * 
    import random
    import time 
    
    # 初始化
    pg.init()
    screen_size = (800,600)                                 # 游戏窗口的大小为800*600
    screen = pg.display.set_mode(screen_size)               
    screen_color = (225,218,185)                            # 游戏窗口背景颜色       
    snake_body = [[370,300],[380,300],[390,300],[400,300]]  # 贪吃蛇的初始位置
    snake_body_color = (85,26,139)                          # 贪吃蛇的颜色
    pg.display.set_caption('Snake')                         # 游戏窗口的名字
    raspberry = [250,200]                                   # 树莓的位置
    raspberry_color = [250,0,0]                             # 树莓的颜色
    snake_direction = 'RIGHT'                               # 贪吃蛇的初始运行方向为'右'
    snake_step = 10                                         # 贪吃蛇的步长为10
    score = 0                                               # 游戏分数初始值为0
    font = pg.font.SysFont('comicsansms', 15)
    

    第二部分:贪吃蛇的运动方向

    for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    if snake_direction == 'DOWN':
                        snake_direction = 'DOWN'
                    else:
                        snake_direction = 'UP'
                if event.key == pg.K_DOWN:
                    if snake_direction == 'UP':
                        snake_direction = 'UP'
                    else:
                        snake_direction = 'DOWN'
                if event.key == pg.K_LEFT:
                    if snake_direction == 'RIGHT':
                        snake_direction = 'RIGHT'
                    else:
                        snake_direction = 'LEFT'
                if event.key == pg.K_RIGHT:
                    if snake_direction == 'LEFT':
                        snake_direction = 'LEFT'
                    else:
                        snake_direction = 'RIGHT'
    

    运用pg.event.get()来捕捉游戏事件。当按下方向键的时候,要考虑有没有进行'反方向'的运行。

    第三部分:判断贪吃蛇有没有吞吃树莓以及触及游戏结束

    
        if snake_direction == 'UP':
            snake_add = [snake_body[-1][0],snake_body[-1][1] - snake_step]  
        if snake_direction == 'DOWN':
            snake_add = [snake_body[-1][0],snake_body[-1][1] + snake_step]
        if snake_direction == 'LEFT':
            snake_add = [snake_body[-1][0] - snake_step,snake_body[-1][1]]
        if snake_direction == 'RIGHT':
            snake_add = [snake_body[-1][0] + snake_step,snake_body[-1][1]]
        # '贪吃蛇'的头部碰撞到游戏窗口四周以及身体的某一部分,游戏结束
        if snake_add in snake_body[:-2]:
            break
        elif snake_add[0] < 0 or (snake_add[0] + 10) > 800 or snake_add[1] < 0 or (snake_add[1] + 10) > 600:
            break
        # 判断蛇有没有吞吃树莓
        if snake_add[0] == raspberry[0] and snake_add[1] == raspberry[1]:
            snake_body.append(raspberry)
            score += 1
            raspberry_swap = [random.randint(0,80) * 10,random.randint(0,60) * 10]
            if raspberry_swap not in snake_body:
                raspberry = raspberry_swap
        else:
            snake_body.append(snake_add)
            snake_body.pop(0)
    

    贪吃是这是一个二维的游戏,我们将贪吃蛇的身体看作成一个列表。这个列表由4个元素组成。而每一个元素是由一对屏幕对应的x,y值组成的列表。在游戏窗口中显示就是每个为10*10的矩形。如下图所示。

    snake_body = [[370,300],[380,300],[390,300],[400,300]]

    用列表数组等方法代替蛇的身体

    因为贪吃蛇的初始运行方向为右,所以列表的最后一个元素[400,300]为贪吃蛇的‘头部’。当按'下上下左右'键时,在snake_body这个列表后加相对应方向的元素,来实现蛇在该方向的移动。

    当头部碰撞到游戏窗口四周以及身体的某一部分,游戏结束。

     if snake_add in snake_body[:-2]:
            break
     elif snake_add[0] < 0 or (snake_add[0] + 10) > 800 or snake_add[1] < 0 or (snake_add[1] + 10) > 600:
            break
    

    当列表新增加的元素与树莓的元素坐标一致时,表示贪吃蛇吞吃了树莓。蛇的身体增加一个单位步长,分数+1。然后重新生成树莓。否则,在snake_body列表后插入新增的元素,并删除列表的第一个元素。用random.randint来随机生成树莓,因为蛇的单位长度为10,所以要以10为倍数。不然,若用randint(0,800)会出现256这样子蛇无法吞吃树莓的情况出现。

    # 判断蛇有没有吞吃树莓
        if snake_add[0] == raspberry[0] and snake_add[1] == raspberry[1]:
            snake_body.append(raspberry)
            score += 1
            raspberry_swap = [random.randint(0,80) * 10,random.randint(0,60) * 10]
            if raspberry_swap not in snake_body:
                raspberry = raspberry_swap
        else:
            snake_body.append(snake_add)
            snake_body.pop(0)
    

    第四部分:绘制游戏窗口并加入While循环

    scoreSurf = font.render('Score: %s' % score, True, (0,225,0))
    scoreRect = scoreSurf.get_rect()
    screen.blit(scoreSurf, scoreRect)
    pg.draw.rect(screen,raspberry_color,Rect(raspberry[0],raspberry[1],10,10))
    
    for item in snake_body:
        pg.draw.rect(screen,snake_body_color,Rect(item[0],item[1],10,10))
    pg.display.update()
    

    最终游戏结果:

    最终结果

    相关文章

      网友评论

          本文标题:Pygame - 用80行Python代码实现简单的一个贪吃蛇程

          本文链接:https://www.haomeiwen.com/subject/mosrzqtx.html