基于Python设计的贪吃蛇游戏

贪吃蛇游戏 一,课程设计内容概述 1,1 开发环境和开发工具说明 使用基于 Python 语言的 pygame 库进行开发,编译环境是 Pycharm

本文包含相关资料包-----> 点击直达获取<-------

贪吃蛇游戏

一、课程设计内容概述

1.1 开发环境和开发工具说明

使用基于 Python 语言的 pygame 库进行开发,编译环境是 Pycharm。

1.2 课程设计的任务

开发一个贪吃蛇游戏,通过四个方向键来上下左右控制蛇的运动方向,寻找吃的东西,每吃一口蛇的身子会长一点,身子越长玩的难度就越大,当碰墙,咬到自己的身体或者咬自己的尾巴时,游戏结束。

1.3 程序运行顺序说明

先安装 pygame, time, sys, random 等库,接着在 pycharm 中打开 snake.py 运行。

二、系统设计方案

主要需要包括界面初始化,键盘按键检测,蛇的移动,吃果子检测,死亡检测等部分。

  • 初始化部分:初始化界面
  • 键盘按键检测部分与蛇的移动部分:检测到相应方向键按下,蛇做出相应方向的移动。
  • 吃果子检测部分:如果有果子被吃,则随机出现新的果子,并且蛇长大。
  • 死亡检测部分:如果蛇碰到了墙或者自己,则游戏结束,否则游戏继续。

三、程序主要代码分析

键盘按键检测部分:

```python

判断键盘事件

if event.key == K_RIGHT or event.key == ord('d'): changeDirection = 'right' if event.key == K_LEFT or event.key == ord('a'): changeDirection = 'left' if event.key == K_UP or event.key == ord('w'): changeDirection = 'up' if event.key == K_DOWN or event.key == ord('s'): changeDirection = 'down'

```

蛇的变化部分:

```python

判断键盘事件

if event.key == K_RIGHT or event.key == ord('d'): changeDirection = 'right' if event.key == K_LEFT or event.key == ord('a'): changeDirection = 'left' if event.key == K_UP or event.key == ord('w'): changeDirection = 'up' if event.key == K_DOWN or event.key == ord('s'): changeDirection = 'down'

```

吃果子检测部分:

```c++

判断是否吃掉了果子

if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]: raspberrySpawned = 0 else: snakeSegments.pop()

如果吃掉果子,则重新生成果子

if raspberrySpawned == 0: x = random.randrange(1,32) y = random.randrange(1,24) raspberryPosition = [int(x 20),int(y 20)] raspberrySpawned = 1

```

四、程序调试中出现的问题及解决办法

程序运行出现界面后,遇到蛇的大小一直是一个方块大小的问题,吃了果子之后也一直是那么大,并没有变大。推测这可能是增加蛇的长度的语句出错了。

在 snakeSegments.insert(0, snakePosition)中,.insert 中第一个参数是要插入的元素的位置,第二个参数是要插入的元素,这里表示在最开始的位置插入坐标。snakePosition 只是一个坐标组合,当要插入元素时,需要先将它强制转换成为 list,才能再添加元素。将语句改为 snakeSegments.insert(0, list(snakePosition))后,蛇就会正常变大,程序就正常了,和预想的一样了。

在蛇碰到墙,游戏结束后,会报错 pygame.error: font not initialized。是字体没有初始化的意思,通过百度查找这个错误,有网友说是缺少对 pygame 的初始化,也就是缺少 pygame.init()。将这句话加于程序运行的最开始,作为主函数里执行的第一条语句,再次运行程序,在游戏结束的时候就不会报错了。

五、主要参考资料

Python 和 pygame 游戏开发指南

pygame 教程

六、程序及解释

```c++

!/usr/bin/env python

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

定义颜色变量

redColour = pygame.Color(255,0,0) blackColour = pygame.Color(0,0,0) whiteColour = pygame.Color(255,255,255) greyColour = pygame.Color(150,150,150)

定义gameOver函数

def gameOver(playSurface): gameOverFont = pygame.font.Font('arial.ttf',72) gameOverSurf = gameOverFont.render('Game Over', True, greyColour) gameOverRect = gameOverSurf.get_rect() gameOverRect.midtop = (320, 10) playSurface.blit(gameOverSurf, gameOverRect) pygame.display.flip() time.sleep(5) pygame.quit() sys.exit()

定义main函数

def main(): # 初始化pygame pygame.init() fpsClock = pygame.time.Clock() # 创建pygame显示层 playSurface = pygame.display.set_mode((640,480)) pygame.display.set_caption('Raspberry Snake')

# 初始化变量
snakePosition = [100,100]
snakeSegments = [[100,100],[80,100],[60,100]]
raspberryPosition = [300,300]
raspberrySpawned = 1
direction = 'right'
changeDirection = direction
while True:
    # 检测例如按键等pygame事件
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            # 判断键盘事件
            if event.key == K_RIGHT or event.key == ord('d'):
                changeDirection = 'right'
            if event.key == K_LEFT or event.key == ord('a'):
                changeDirection = 'left'
            if event.key == K_UP or event.key == ord('w'):
                changeDirection = 'up'
            if event.key == K_DOWN or event.key == ord('s'):
                changeDirection = 'down'
            if event.key == K_ESCAPE:
                pygame.event.post(pygame.event.Event(QUIT))
    # 判断是否输入了反方向
    if changeDirection == 'right' and not direction == 'left':
        direction = changeDirection
    if changeDirection == 'left' and not direction == 'right':
        direction = changeDirection
    if changeDirection == 'up' and not direction == 'down':
        direction = changeDirection
    if changeDirection == 'down' and not direction == 'up':
        direction = changeDirection
    # 根据方向移动蛇头的坐标
    if direction == 'right':
        snakePosition[0] += 20
    if direction == 'left':
        snakePosition[0] -= 20
    if direction == 'up':
        snakePosition[1] -= 20
    if direction == 'down':
        snakePosition[1] += 20
    # 增加蛇的长度
    snakeSegments.insert(0, list(snakePosition))
    # 判断是否吃掉了果子
    if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:
        raspberrySpawned = 0
    else:
        snakeSegments.pop()
    # 如果吃掉果子,则重新生成果子
    if raspberrySpawned == 0:
        x = random.randrange(1,32)
        y = random.randrange(1,24)
        raspberryPosition = [int(x*20),int(y*20)]
        raspberrySpawned = 1
    # 绘制pygame显示层
    playSurface.fill(blackColour)
    for position in snakeSegments:
        pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))
        pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],
                                                    raspberryPosition[1],20,20))

    # 刷新pygame显示层
    pygame.display.flip()
    # 判断是否死亡
    if snakePosition[0] > 620 or snakePosition[0] < 0:
        gameOver(playSurface)
    if snakePosition[1] > 460 or snakePosition[1] < 0:
        for snakeBody in snakeSegments[1:]:
            if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
                gameOver(playSurface)
    # 控制游戏速度
    fpsClock.tick(5)

if name == " main ": main()

```

参考文献

  • 基于手持移动设备的教学游戏设计与开发(上海师范大学·覃柳思)
  • 基于网络爬虫的电影集成搜索系统设计与实现(江西农业大学·江沛)
  • 基于RETAIN模型的教育游戏设计与开发——以青少年安全教育为例(天津师范大学·杨玲玲)
  • 基于轻量级J2EE的网络游戏虚拟物品交易系统的设计与实现(北京邮电大学·曹鹃)
  • 手机游戏跨平台开发框架的设计与实现(北京工业大学·郑琳)
  • 面向计算思维发展的游戏创作学习活动设计与应用研究——以小学编程教学为例(华东师范大学·程亮)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 基于微服务的游戏鉴赏互动系统设计与实现(华中科技大学·孙宝)
  • 基于asp.net的在线软件项目交易系统的设计与实现(电子科技大学·顾杰)
  • 基于网络爬虫的电影集成搜索系统设计与实现(江西农业大学·江沛)
  • 基于Hadoop的分布式爬虫及其实现(北京邮电大学·程锦佳)
  • 面向计算思维发展的游戏创作学习活动设计与应用研究——以小学编程教学为例(华东师范大学·程亮)
  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 网页游戏平台的管理与设计(哈尔滨师范大学·苏润泽)
  • 基于.NET平台的游戏门户系统设计与实现(电子科技大学·余胜鹏)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码导航 ,原文地址:https://m.bishedaima.com/yuanma/36147.html

相关推荐

发表回复

登录后才能评论