Python编写简单贪吃蛇

1 引言

这几天刚开始学习python,想要写一个有趣的程序。再加上以前学习C语言的时候就想写一个贪吃蛇的程序,但是C语言写好像泰国繁琐。就一直没有实施。python来写这个好像就没那么复杂了。当然对于我这样的小白直接自己写肯定写不出来这个代码。还是在我参考网上大佬的代码,加上自己多次学习以后才搞出来的。先看看效果图:
在这里插入图片描述

2 开发前准备

首先我们要借助一个python的第三方库pygame来实现。

Pygame是一个利用SDL库的游戏库, 是一组用来开发游戏软件的 Python 程序模块。
SDL(Simple DirectMedia Layer)是一个跨平台库,支持访问计算机多媒体硬件(声音、视频、输入等),SDL非常强大,但美中不足的是它是基于 C 语言的。
PyGame是 SDL 库的 Python 包装器(wrapper),Pygame 在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序。

既然要用到首先我们就要安装pygame库
方法很简单,直接在命令提示符(cmd)中输入以下代码就可以了

pip install pygame

3 代码

首先将pygame库和其它要使用的库导入

import random
import pygame
import sys
from pygame.locals import *

接着对一些全局变量进行初始化:

Snakespend = 10     #游戏速度
Window_Width = 800  #游戏范围宽度
Window_High = 500   #游戏窗口高度
Cell_Size = 20      #每一个的尺寸大小


Cell_W = Window_Width / Cell_Size  #宽的格子数
Cell_H = Window_High / Cell_Size   #高的格子数

#各种有可能用的的颜色
White = (255, 255, 255)
Black = (0, 0, 0)
Red = (255, 0, 0)  
Green = (0, 255, 0)
DARKGreen = (0, 155, 0)
DARKGRAY = (40, 40, 40)
YELLOW = (255, 255, 0)
Red_DARK = (150, 0, 0)
BLUE = (0, 0, 255)
BLUE_DARK = (0, 0, 150)
BackGround = Black
#四个方向
UP = 'up'
DOWN = 'down'
RIGHT = 'right'
LEFT = 'left'
#蛇头
HEAD = 0

main函数的编写

def main():
    global SnakespeedCLOCK, DISPLAYSURF, BASICFONT
    pygame.init()
    SnakespeedCLOCK = pygame.time.Clock()  #定义一个变量来控制速度
    DISPLAYSURF = pygame.display.set_mode((Window_Width,Window_High)) #设置窗口大小
    BASICFONT = pygame.font.Font('freesansbold.ttf', 18) #设置游戏内字体
    pygame.display.set_caption('Snake') #设置游戏窗口标题

    while True :
        RunGame() #调用参数
  

游戏运行RunGame函数

def RunGame() :
    startX = random.randint(5,Cell_W-6)  #初始化蛇的位置,且蛇的长度为3
    startY = random.randint(5,Cell_H-6)
    SnakeBody = [{'x': startX,'y' : startY},
                 {'x': startX-1,'y' : startY},
                 {'x': startX-2,'y' : startY}]
    direCtion = RIGHT     #蛇初始方向为向右
    apple = {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)}               #初始化食物的位置
    while True :
    	#检测按键事件
        for event in pygame.event.get(): 
            if event.type == QUIT :  #接收到退出时间时推出
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN : #判断按键事件,用WSAD和方向键判断方向
                if (event.key == K_UP or event.key == K_w) and direCtion != DOWN :
                    direCtion = UP
                elif (event.key == K_DOWN or event.key == K_s) and direCtion != UP :
                    direCtion = DOWN
                elif (event.key == K_RIGHT or event.key == K_d) and direCtion != LEFT :
                    direCtion = RIGHT
                elif (event.key == K_LEFT or event.key == K_a) and direCtion != RIGHT :
                    direCtion = LEFT
                elif event.key == K_ESCAPE :  #按下Esc时退出
                    pygame.quit()
                    sys.exit()
          
        if SnakeBody[HEAD]['x'] == -1 or SnakeBody[HEAD]['x'] == Cell_W  or SnakeBody[HEAD]['y'] == -1 or SnakeBody[HEAD]['y'] == Cell_H :                         
            return               #当前头的位置超出了窗口边界,退出      
        for Body in SnakeBody[1:] :
            if Body['x'] == SnakeBody[HEAD]['x'] and Body['y'] == SnakeBody[HEAD]['y'] :
                return           #当前头的位置余身体碰到了,退出

        if SnakeBody[HEAD]['x'] == apple['x'] and SnakeBody[HEAD]['y'] == apple['y'] :  #如果头的位置和食物位置相同就再随机生成一个食物
            apple = {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)}
        else:  #否则把蛇的尾巴删掉
            del SnakeBody[-1]

         #根据蛇的方向产生新的蛇头
        if direCtion == UP :
            newHeard = {'x':SnakeBody[HEAD]['x'],
                        'y':SnakeBody[HEAD]['y']-1}
        elif direCtion == DOWN :
            newHeard = {'x': SnakeBody[HEAD]['x'],
                        'y': SnakeBody[HEAD]['y'] + 1}
        elif direCtion == RIGHT :
            newHeard = {'x': SnakeBody[HEAD]['x'] + 1,
                        'y': SnakeBody[HEAD]['y']}
        elif direCtion == LEFT :
            newHeard = {'x': SnakeBody[HEAD]['x'] - 1,
                        'y': SnakeBody[HEAD]['y']}
        SnakeBody.insert(0,newHeard) #将新的头插入到蛇的最前面
        DISPLAYSURF.fill(BackGround) #将窗口填充为背景颜色
        DrawSnakeBody(SnakeBody)     #画蛇
        DrawApple(apple)             #画食物
        DrawLine()					 #画网格线											
        DrawScreen(len(SnakeBody) - 3)   #画分数
        pygame.display.update()      #将画的图形显示在窗面上
        SnakespeedCLOCK.tick(Snakespend)  #设置刷新速度

画各种东西的函数

def DrawScreen(Screen) :  #显示分数
    ScreenBuf = BASICFONT.render('Screen : %s' %(Screen),True,YELLOW)
    ScreenRect = ScreenBuf.get_rect()
    ScreenRect.topleft = (Window_Width - 120 , 0)
    DISPLAYSURF.blit(ScreenBuf,ScreenRect)


def DrawSnakeBody(SnakeBody):  #显示蛇
    for body in SnakeBody : 
        x = body['x'] * Cell_Size #将每一节的具体左边求出来
        y = body['y'] * Cell_Size
        BodyRect = pygame.Rect(x,y,Cell_Size,Cell_Size) #将坐标转换为最小单位方格
        pygame.draw.rect(DISPLAYSURF,DARKGreen,BodyRect) #在窗口画出来
        BodyInnerRect = pygame.Rect(x + 4, y + 4, Cell_Size - 8, Cell_Size - 8) #将格子中间再选出来
        pygame.draw.rect(DISPLAYSURF,Green,BodyInnerRect) #再画出来

def DrawApple(apple): #画食物,方法和画蛇一样
    x = apple['x'] * Cell_Size
    y = apple['y'] * Cell_Size
    appleRect = pygame.Rect(x,y,Cell_Size,Cell_Size)
    pygame.draw.rect(DISPLAYSURF,Red,appleRect)

def DrawLine():  #画线
    for x in range(0, Window_Width, Cell_Size):
        pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, Window_High))
    for y in range(0, Window_High, Cell_Size):
        pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (Window_Width, y))

最后运行

if __name__ == '__main__' :
    try :
        main()
    except SystemExit :
        pass

4 总结

感觉写出了一个小游戏还挺有意思的,虽然里面有很多是看了很久才搞懂的,而且感觉这个贪吃蛇还可以继续的优化。但是还是很满足了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzm777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值