贪吃蛇游戏开发

贪吃蛇游戏开发


一、实验目标

1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制蛇的移动,吃到豆子后蛇的身体加长一点。
2.蛇碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。
3.为游戏设计友好的交互界面,例如欢迎界面,游戏界面,游戏结束界面。
对蛇吃豆子进行分值计算,可以设置游戏速度,游戏音乐等扩展元素。

二、实现方式

用Python以及pygame模块。之所以选择pygame,是因为pygame是一个设计用来开发游戏的Python模块,在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序,pygame支持多种操作系统,是一个开源的软件。

三、具体步骤

1.设置屏幕上的网格

代码如下(示例):

import pygame
import sys
import random
import time
from pygame.locals import*
cellwidth = 34     #屏幕上在X坐标轴上显示的方格数
cellheight = 34    #屏幕上在Y坐标轴上显示的方格数

屏幕的width=680,height=680,每个方格的大小为20.

2.设置颜色

代码如下(示例):

#RGB
WHITE = (255, 255, 255)
BLACK = (0, 0 , 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
DARKGREEN = (0, 155, 0)
DARKGRAY = (40, 40, 40)

3.设置main函数

代码如下(示例):

def main():
    global fps_clock   #定义全局变量
    global screen
    global font
    pygame.init()      #初始化pygame
    fps_clock = pygame.time.Clock()   #获得pygame时钟
    screen = pygame.display.set_mode((680, 680))    #设置屏幕大小
    font = pygame.font.Font("freesansbold.ttf", 18)   #设置屏幕字体
    pygame.display.set_caption('贪吃蛇')   #设置屏幕标题为“贪吃蛇”
 
    showStartScreen()  #显示游戏开始画面
    while True:
        runGame()   #运行游戏主体
        showGameOverScreen()    #显示游戏结束画面

4.设置游戏运行函数

代码如下(示例):

def runGame():
    #设置蛇身开始在随机位置,28是原来屏幕显示了34个方格数,为了防止蛇一开始出现在方格边界直接游戏结束,所以在距边界6个方格的位置随机生成贪吃蛇。
    startx = random.randint(5, 28)   
    starty = random.randint(5, 28)
    # 以这个点为起点,建立一个长度为3格的贪吃蛇(列表)
    wormCoods = [{'x': startx, 'y': starty},
                 {'x': startx-1, 'y': starty},
                 {'x': startx-2, 'y': starty}]
    direction = 'right'   #蛇初始方向向右
 
    #得到一个随机豆子的位置
    bean = getRandomLocation()
 
    while True:
        for event in pygame.event.get():
        #退出设置
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:     #按键设置,处理蛇的移动方向
        #如果按下的是左键或a键,且当前的方向不是向右,就改变方向,以下类似
                if (event.key == K_LEFT or event.key == K_a) and direction != 'right':
                    direction = 'left'
                elif (event.key == K_RIGHT or event.key == K_d) and direction != 'left':
                    direction = 'right'
                elif (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_ESCAPE:
                    pygame.quit()
                    sys.exit()
        #看蛇身是否撞击到自己或四周墙壁,即查看蛇头坐标
        if wormCoods[HEAD]['x'] == -1 or wormCoods[HEAD]['x'] == cellwidth or wormCoods[HEAD]['y'] == -1 or wormCoods[HEAD]['y'] == cellheight:
            return #game over
        #检查贪吃蛇是否撞到自己,即检查蛇头的坐标是否等于蛇身的坐标
        for wormBody in wormCoods[1:]:
            if wormBody['x'] == wormCoods[HEAD]['x'] and wormBody['y'] == wormCoods[HEAD]['y']:
                return #game over
        #判断蛇是否吃到豆子,若没吃到,则删除尾端,蛇身前进一格
        if wormCoods[HEAD]['x'] == bean['x'] and wormCoods[HEAD]['y'] == bean['y']:
            bean = getRandomLocation() #随机显示一个新的豆子
        else:
            del wormCoods[-1] #删除蛇的尾巴,即列表最后一个小方块
        #根据蛇的移动方向,给蛇添加一个新的头部
        if direction == 'up':
            newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']-1}
        elif direction == 'down':
            newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']+1}
        elif direction == 'left':
            newHead = {'x': wormCoods[HEAD]['x']-1, 'y': wormCoods[HEAD]['y']}
        elif direction == 'right':
            newHead = {'x': wormCoods[HEAD]['x']+1, 'y': wormCoods[HEAD]['y']}
       # 插入新的蛇头在数组的最前面
        wormCoods.insert(0,newHead)
        
        screen.fill(BLACK)   #背景颜色为黑色
        drawWorm(wormCoods) #画蛇身
        drawBean(bean) #画豆子
        drawScore(len(wormCoods) - 3)#显示蛇身长度计算玩家的分数
        pygame.display.update()  #更新屏幕
        fps_clock.tick(15)    #设置频率

5.按键模块

代码如下(示例):

#提示按键消息
def drawPressKeyMsg():
    pressKeySurf = font.render('Press a key to play.', True, DARKGRAY)
    pressKeyRect = pressKeySurf.get_rect()
    pressKeyRect.topleft = (680 - 200, 680-30)
    screen.blit(pressKeySurf, pressKeyRect)  
#检测按键游戏是否要退出
def checkForKeyPress():
    if len(pygame.event.get(QUIT)) > 0:
        pygame.quit()
        sys.exit()
    keyUpEvents = pygame.event.get(KEYUP)
    if len(keyUpEvents) == 0:
        return None
    if keyUpEvents[0].key == K_ESCAPE:
        pygame.quit()
        sys.exit()
    return keyUpEvents[0].key
 

6.随机生成豆子

代码如下(示例):

def getRandomLocation():
    return  {'x': random.randint(0, cellwidth - 1), 'y': random.randint(0, cellheight - 1)}

7.游戏开始和结束函数

代码如下(示例):

#显示开始界面
def showStartScreen():
        titleFont = pygame.font.Font("freesansbold.ttf", 70)
        titleSurf1 = titleFont.render("Game Start!", True, WHITE)
        while True:
                screen.fill(BLACK)
                titleRect1 = titleSurf1.get_rect()
                titleRect1.center = (340, 340)
                screen.blit(titleSurf1,titleRect1)
                drawPressKeyMsg()
                if checkForKeyPress():
                    pygame.event.get()
                    return
                pygame.display.update()
                fps_clock.tick(15)
                 
#游戏结束时的画面
def showGameOverScreen():
    gameOverFont = pygame.font.Font("freesansbold.ttf", 70)
    gameOverSurf = gameOverFont.render("GAME OVER!", True, WHITE)
    gameOverRect = gameOverSurf.get_rect()
    gameOverRect.center = (340,340)
    screen.blit(gameOverSurf, gameOverRect)
    drawPressKeyMsg()
    pygame.display.update()
    pygame.time.wait(5)
    checkForKeyPress()
    while True:
        if checkForKeyPress():
            pygame.event.get()
            return

8.分数设置

代码如下(示例):

def drawScore(score):
    scoreSurf = font.render('Score: %s' %(score), True, WHITE)
    scoreRect = scoreSurf.get_rect()
    scoreRect.midtop = (520,520)
    screen.blit(scoreSurf, scoreRect)

9.贪吃蛇设置

代码如下(示例):

# 根据wormCoords列表绘制贪吃蛇
def drawWorm(wormCoods):
    for coord in wormCoods:
        x = coord['x'] * 20
        y = coord['y'] * 20
        wormSegmentRect = pygame.Rect(x, y, 20, 20)
        pygame.draw.rect(screen, DARKGREEN, wormSegmentRect)
        wormInnerSegmentRect = pygame.Rect(x+4, y+4, 20-8, 20-8)
        pygame.draw.rect(screen, YELLOW, wormInnerSegmentRect)

10.食物设置

代码如下(示例):

# 根据coord绘制豆子
def drawBean(coord):
    x = coord['x'] * 20
    y = coord['y'] * 20
    pygame.draw.rect(screen, RED, Rect(x, y, 20, 20))

四、示意图展示

在这里插入图开始界面片描述
在这里插入图片描述

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值