Pygame制作《贪吃蛇游戏》

该项目介绍了如何利用Python的pygame库来创建经典的贪吃蛇游戏。游戏包括了界面设计、小蛇运动轨迹的控制、键盘事件处理(改变蛇的方向)、碰撞检测(墙壁和自身)以及吃苹果增加分数的逻辑。文章详细讲解了各个功能的实现步骤和关键代码。
摘要由CSDN通过智能技术生成

项目背景:

在亚当夏娃的传说中,蛇一口吃掉了苹果。正是这个有趣的故事启发下诞生了《贪吃蛇》这款经典的小游戏。用键盘控制小蛇的运动,小蛇一会向左一会向,一口一个吃掉苹果。那么我们如何来设计游戏的界面?如何用代码来控制小蛇的运行轨迹?本项目我们就来学习下如何完成这个小游戏的制作。
在这里插入图片描述

项目分析:

本项目的开发需要完成以下几部分的任务:
本项目需要用到的库:randome pygame
本项目需要用到重要 pyghon 语法知识:if 语句、函数构选、pygame 使用
本项目实施需要哪些具体的步骤,参考如下思维导图。
在这里插入图片描述

项目实施:

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

各种颜色

RED = (255, 0, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREY = (30, 30, 30)
GREEN = (0,255,0)

各种变量

speed = 2             # 游戏速度
points = 0            # 游戏得分
one_grid = 20         # 一个方格子,标准长度单位
screen_width = 640    # 屏幕长度
screen_height = 480   # 屏幕高度
start = False         # 开始游戏控制
snakeBody = [[100, 100], [80, 100], [60, 100]]    # 这里坐标好像不对,蛇是20像素的矩形
snakePosition = [100, 100]     # 蛇头的初始位置(像素坐标)
applePosition = [260, 200]     # 苹果的初始位置(像素坐标)
direction = 'right'            # 蛇运动的初始方向
fpsClock = pygame.time.Clock() # 时钟对象用于设置fps

窗体设置

pygame.init()
playscreen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("贪吃蛇")

游戏结束

def gameover():
    global start
    start = False
    pygame.display.update()
    draw_string = "游戏结束,游戏得分:{}".format(points)
    font1 = pygame.font.SysFont("SimHei", 50)
    text1 = font1.render(draw_string, True, GREEN)  # 第二个参数为是否反锯齿
    playscreen.blit(text1, (50, 300))

通过键盘事件控制方向

def getKeyboardDirection(direction):
    global speed,start
    new_direction = direction         #如果方向没有被改变,就返回原来的方向
    for event in pygame.event.get():
        # 退出事件
    if event.type == QUIT:
        pygame.quit()
        sys.exit()
    # 判断键盘事件
    elif event.type == KEYDOWN:
        # 向右移动
        if event.key == K_d or event.key == K_RIGHT: 
            if not direction == 'left':   # 只能转弯、不能掉头
                new_direction = 'right'
        # 向左移动
        elif event.key == K_a or event.key == K_LEFT: 
            if not direction == 'right':
                new_direction = 'left'
        # 向上移动
        elif event.key == K_w or event.key == K_UP: 
            if not direction == 'down':
                new_direction = 'up'
        # 向下移动
        elif event.key == K_s or event.key == K_DOWN: 
            if not direction == 'up':
                new_direction = 'down'
        # 按下+,速度加1
        elif event.key == K_KP_PLUS: 
            speed += 1 
        # 按下-,速度减1
        elif event.key == K_KP_MINUS: 
            speed -= 1 
        # 按空格开始,再按停止
        elif event.key == K_SPACE: 
            start = not start
# 遵循结构化设计原则,单一出口
return new_direction

网格线绘制

def Drawline():
    # 竖线
    for k in range(one_grid, screen_width, one_grid):  # 边界不用画线
        pygame.draw.line(playscreen, GREY, [k, 0], [k, screen_height])
    # 横线
    for k in range(one_grid, screen_height, one_grid):
        pygame.draw.line(playscreen, GREY, [0, k], [screen_width, k])
    # 绘制蛇的身体
    for k in snakeBody:
        pygame.draw.rect(playscreen, RED, Rect(k[0], k[1], one_grid, one_grid)) # pygame.Rect对象

文字绘制

def DrawText():
    draw_string = "游戏速度:" + str(speed) + " 游戏得分:" + str(points)
    font1 = pygame.font.SysFont("SimHei", 30)
    text1 = font1.render(draw_string, True, GREEN)  # 第二个参数为是否反锯齿
    playscreen.blit(text1, (150, 20))

蛇移动

def SnakeMove(direction):
    if start:
        if direction == 'right':
            snakePosition[0] += one_grid
        if direction == 'left':
            snakePosition[0] -= one_grid
        if direction == 'down':
            snakePosition[1] += one_grid
        if direction == 'up':
            snakePosition[1] -= one_grid
        snakeBody.insert(0, list(snakePosition))
        snakeBody.pop(len(snakeBody) - 1)
        playscreen.fill(BLACK)

撞墙

def Crash_wall(snakePosition):
    if snakePosition[0]<0 or snakePosition[0]>=screen_width or snakePosition[1]<0 or snakePosition[1]>=screen_height:
        gameover()

撞自己

def Crash_own():
    j = 0
    for i in snakeBody:
        j += 1
        # 如果头撞到身体则游戏失败,当然必须排除自己的头
        if j == 1:
            continue
        if operator.eq([snakePosition[0],snakePosition[1]],i):
            gameover()

吃苹果

def eatApple(snakePosition):
    global applePosition,points,speed
    if snakePosition[0] == applePosition[0] and snakePosition[1] == applePosition[1]:
        snakeBody.insert(0, list(snakePosition))
        applePosition=[random.randrange(0,screen_width,one_grid),random.randrange(0,screen_height,one_grid)]
        points += 5
        speed += 0.5
    random_color = (random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 彩色苹果
    pygame.draw.rect(playscreen, random_color, Rect(applePosition[0], applePosition[1], one_grid, one_grid))

if __name__ == "__main__":
    while True:
        direction = getKeyboardDirection(direction)
        SnakeMove(direction)
        Crash_wall(snakePosition)
        DrawText()
        Drawline()
        Crash_own()
        eatApple(snakePosition)
        pygame.display.flip()   # 更新整个待显示的 Surface 对象到屏幕上
        fpsClock.tick(speed)    # 更新刷新率
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值