前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【程序源代码】python 贪吃蛇

【程序源代码】python 贪吃蛇

作者头像
程序源代码
发布2020-06-04 10:31:43
9080
发布2020-06-04 10:31:43
举报
文章被收录于专栏:程序源代码程序源代码

关键字:python 贪吃蛇

正文 | 内容

今天这篇文章主要是介绍: 贪吃蛇游戏是一款休闲益智类游戏,既简单又耐玩。游戏通过控制蛇头方向吃苹果,从而使得蛇变得越来越长。

01

02

获取源码

代码语言:javascript
复制
#导入相关模块与函数
import random, pygame, sys
from pygame.locals import *

global Speed,Trackingtime, Displayobject, WindowTypeface
pygame.init() #初始化pygame,为使用硬件做准备
Speed = 8
Trackingtime = pygame.time.Clock() #创建一个对象来帮助跟踪时间
Displayobject = pygame.display.set_mode((640,480))
WindowTypeface = pygame.font.SysFont('Calibri.ttf', 25) #从一个字体文件创建一个Typeface对象
pygame.display.set_caption('贪吃蛇') #设置窗口标题
cellsize = 20
backgroundcolor = (255,255,255) #白色
#侦测操作
def CheckKeyboardPress():
    if len(pygame.event.get(QUIT)) > 0:
        pygame.quit()
        sys.exit()
    keyUpEvents = pygame.event.get(KEYUP)
    if len(keyUpEvents) == 0:
        return None
    return keyUpEvents[0].key

#游戏开始界面设计
def DesignStartScreen():
    global Speed
    titleTypeface1 = pygame.font.SysFont('Calibri.ttf', 200)
    titleTypeface2 = pygame.font.SysFont('Calibri.ttf', 60)
    KeyboardTypeface = pygame.font.SysFont('Calibri.ttf', 15)
    titleContent1 = titleTypeface1.render('RETRO SNAKER', True, (0,0,0),(0,0,0))
    titleContent2 = titleTypeface2.render('RETRO SNAKER', True, (255,0,0))
    KeyboardContent = WindowTypeface.render('Press any key to start', True, (0,0,0))
    Displayobject.fill(backgroundcolor)
    revolveContent1 = pygame.transform.rotate(titleContent1, 0)
    revolveRect1 = revolveContent1.get_rect()
    revolveRect1.center = (640 / 2, 480 / 2)
    Displayobject.blit(revolveContent1, revolveRect1)
    revolveContent2 = pygame.transform.rotate(titleContent2, 0)
    revolveRect2 = revolveContent2.get_rect()
    revolveRect2.center = (640 / 2, 480 / 2)
    Displayobject.blit(revolveContent2, revolveRect2)
    KeyboardRect = KeyboardContent.get_rect() #获得一个对象的rect,以便于设置其坐标位置
    KeyboardRect.topleft = (640 - 200, 480 - 30)
    Displayobject.blit(KeyboardContent, KeyboardRect.topleft)
    pygame.display.update()
    Trackingtime.tick(Speed)
    while True:
        if CheckKeyboardPress():
            pygame.event.get() #清除事件队列
            return
    
#游戏结束界面设计
def DesignGameOverScreen():
    gameOverTypeface = pygame.font.SysFont('Calibri.ttf', 100)
    KeyboardTypeface = pygame.font.SysFont('Calibri.ttf', 20)#freesansbold
    gameoverContent = gameOverTypeface.render('Game Over', True, (0,0,0))
    KeyboardContent = WindowTypeface.render('Press any key to restart', True, (0,0,0))
    gameoverRect = gameoverContent.get_rect()
    gameoverRect.center = (640 / 2, 480 / 2)
    Displayobject.blit(gameoverContent,gameoverRect)
    KeyboardRect = KeyboardContent.get_rect() #获得一个对象的rect,以便于设置其坐标位置
    KeyboardRect.topleft = (640 - 220, 480 - 30)
    Displayobject.blit(KeyboardContent, KeyboardRect.topleft)
    pygame.display.update()
    pygame.time.wait(600)
    while True:
        if CheckKeyboardPress():
            pygame.event.get() #清除事件队列
            return
#贪吃蛇蛇身设计
def DesignRetroSnaker(RetroSnakerCoords):
    for coord in RetroSnakerCoords:
        x = coord['x'] * 20 #规定每行单元格的大小为20
        y = coord['y'] * 20
        RetroSnakerSegmentRect = pygame.Rect(x, y, 20, 20)
        pygame.draw.rect(Displayobject, (0,0,255), RetroSnakerSegmentRect)
        RetroSnakerInnerSegmentRect = pygame.Rect(x + 4, y + 4, 20 - 8, 20 - 8)
        pygame.draw.rect(Displayobject, (173, 216, 230), RetroSnakerInnerSegmentRect)

#苹果设计
def DesignApple(coord):
    x = coord['x'] * 20
    y = coord['y'] * 20
    appleRect = pygame.Rect(x, y, 20, 20)
    pygame.draw.rect(Displayobject, (255,0,0), appleRect)

#分数设计
def DesignScore(score):
    scoreContent = WindowTypeface.render('Score: %s' % (score), True, (0,0,0))
    scoreRect = scoreContent.get_rect()
    scoreRect.topleft = (640 - 100, 10)
    Displayobject.blit(scoreContent, scoreRect)

#边框线设计
def DesignBorderline():
    for x in range(0, 640, 640-1): #绘制垂直线
       pygame.draw.line(Displayobject, (0,0,0), (x, 0), (x, 480),5)
    for y in range(0, 480, 480-1):#绘制平行线
       pygame.draw.line(Displayobject, (0,0,0), (0, y), (640, y),5)

#设置游戏主要运行机制
def GameRunning():
    global Speed
    #设置随机起点
    startx = random.randint(5, 26) #初始单元格位置横向在(5, 26)范围中选一个随机数
    starty = random.randint(5, 18) #初始单元格位置纵向在(5, 18)范围中选一个随机数
    RetroSnakerCoords = [{'x': startx,     'y': starty},
                         {'x': startx - 1, 'y': starty},
                         {'x': startx - 2, 'y': starty}]#RetroSnakerCoords:列表,贪吃蛇坐标位置
    direction = 'right' #初始方向朝右
    #设置苹果在一个随机位置
    apple = {'x':random.randint(0,31),'y':random.randint(0,23)}

    while True: #游戏主循环
        #判断键盘事件
        for event in pygame.event.get(): #事件处理循环
            if event.type == KEYDOWN:
               if event.key == K_LEFT and direction != 'right':
                    direction = 'left'
               elif event.key == K_RIGHT and direction != 'left':
                    direction = 'right'
               elif event.key == K_UP and direction != 'down':
                    direction = 'up'
               elif event.key == K_DOWN and direction != 'up':
                    direction = 'down'
        #根据方向改变蛇头的坐标
        if direction == 'up':
            m = {'x': RetroSnakerCoords[0]['x'], 'y': RetroSnakerCoords[0]['y'] - 1}
        elif direction == 'down':
            m = {'x': RetroSnakerCoords[0]['x'], 'y': RetroSnakerCoords[0]['y'] + 1}
        elif direction == 'left':
            m = {'x': RetroSnakerCoords[0]['x'] - 1, 'y': RetroSnakerCoords[0]['y']}
        elif direction == 'right':
            m = {'x': RetroSnakerCoords[0]['x'] + 1, 'y': RetroSnakerCoords[0]['y']}
        
        #通过向贪吃蛇移动的方向添加一个单元格来加长贪吃蛇
        RetroSnakerCoords.insert(0, m)
        
        #侦测贪吃蛇是否吃到苹果
        if RetroSnakerCoords[0]['x'] == apple['x'] and RetroSnakerCoords[0]['y'] == apple['y']:
            apple = {'x':random.randint(0,31),'y':random.randint(0,23)}#在随机位置放置一个苹果
            Speed = Speed + 0.2
        else:
            del RetroSnakerCoords[-1] #去除贪吃蛇的尾段
        
        #侦测贪吃蛇是否触碰到窗口边缘或自身
        if RetroSnakerCoords[0]['x'] == -1 or RetroSnakerCoords[0]['x'] == 32 or RetroSnakerCoords[0]['y'] == -1 or RetroSnakerCoords[0]['y'] == 24:
            return #游戏结束
        for RetroSnakerBody in RetroSnakerCoords[1:]:
            if RetroSnakerCoords[0]['x'] == RetroSnakerBody['x'] and RetroSnakerCoords[0]['y'] == RetroSnakerBody['y']:
                return #游戏结束
        
        #绘制相关角色在窗口中
        Displayobject.fill(backgroundcolor)
        DesignRetroSnaker(RetroSnakerCoords)
        DesignApple(apple)
        DesignScore(len(RetroSnakerCoords) - 3)
        DesignBorderline()
        pygame.display.update() #让绘制的东西显示在屏幕上
        Trackingtime.tick(Speed)

if __name__ == '__main__':
    DesignStartScreen()
    while True:
        GameRunning()
        DesignGameOverScreen(

03

更多视频专辑

Springboot开发视频

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序源代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档