python简易贪吃蛇小游戏任务书含代码

第一章 绪论

  1.1 开发的背景  

随着科技的发展,现在手机的功能已不仅仅是简单的打接电话、收发短信了。更多的手机用户希望在工作、学习之余通过方便灵巧可随身携带的仪器休闲娱乐。因此,为了迎合众多用户的需求并适应现在手机的规模,我们开发出一套适合各阶层人士的具有很强的娱乐性和交互性的贪吃蛇小游戏。

贪吃蛇,之所以取这样的名字,去用意还是很明显的.贪吃蛇其实并不贪,它是人不断向前追求的象征.就像现代的人只有不断努力向前才能得到自己想要的。而食物也是随机出现的,就像现在社会存在的机会,而我们只有找好自己的目标才能成功。

虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的。因为它的特殊在于它能吸引人更深入,爱不释手.随着游戏速度不断加快,其刺激性也更强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行。对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的。这样的小游戏刚好迎合了他们的需求。

1.2 开发的目的  

在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,。让我们从繁重的日常生活中解脱出来。

游戏的主界面应该力求美观,爽心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。

1.3 开发的意义

通过这个游戏可以使玩贪吃蛇的人感到心情轻松,愉悦。使心情得以舒畅,让工作的压力可以得到缓解。给大家一个愉悦的游戏环境。

1.4 开发工具简介  

PyCharm是一种Python IDE(Integrated Development Environment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮项目管理、代码跳转、智能提示、自动完成单元测试版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

PyCharm拥有一般IDE具备的功能,比如, 调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制

另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython

<摘抄> Python语言非常简单,可以比Java、C语言等其他编程语言更快地掌握内容、程序和测试。并且每次输入相应的程序图标都能产生结果,使得一些非软件专业学生大大缩短了Python编程语言的学习时间[1]

第二章 需求分析

  2.1 需求分析  本游戏主要是完成贪吃蛇游戏的基本操作。本游戏需要满足以下几点要求:

   (1) 利用方向键来改变蛇的运行方向。

   (2) 在随机的地方产生食物。

   (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。

2.2 可行性分析

  贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。

    贪吃蛇的核心算法是如何实现移动和吃掉食物,在没有碰到食物的时候,把当前运动方向上的下个节点入队,然后把头指针所指的节点出队,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够停止和运行。

本次设计主要运用pycharm语言来完成。Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

第三章 系统概要设计

3.1 设计目标

这是针对贪吃蛇小游戏的py程序,利用方向见来改变蛇的运行方向,空格键暂停或继续游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。

第四章 详细设计与实现

4.1 设计思路

1.这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。

4.2.数据结构设计及用法说明 

1.开始部分:

游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像数有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面,我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重要变量的初始化。

2.运行部分:

作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到

自己或墙壁;由第四步起游戏有两条支线(A、B):

A:第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失 ;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环

的第一步,重复第一轮的步骤;

B:第四步,蛇碰到自己或墙壁,终止游戏。

3.结束部分:

游戏结束时,显示“GAME OVER”

程序描述蛇:

基本描述:长度,颜色,位置。

对应数据与数据类型:长度-虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位-节数,以固定长度的每节描述;坐标--整型;颜色--

整型;位置--X,Y坐标。

增加的描述:蛇运动的方向,蛇的生命。

对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整

型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。 食物:

基本描述:颜色,位置。

对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置-X、Y坐标。

增加的描述:食物的存在。

对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)

其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。

还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。

4.3 程序设计

(0)安装并导入pygame库

<1>第一种方法:我在官网上下载了符合电脑以及python版本的pipi资源包和pygame库,之后在cmd命令行中利用pip install pygame指令进行安装,最后在pycharm中用import pygame 导入即可。

<2>第二种方法:在pycharm中点击设置,点击项目,再点击python解释器,点软件包上方的+号,搜索pycharm,点击下载安装,之后在pycharm中用import pygame 导入即可。

  1. 定义游戏窗口的大小和标题等相关参数

初始化: 导入pygame库后,首先引用pygame库中的init()函数初始化。

标题:再用pygame库中的display模块,通过pygame.display.set_caption(“标题”)创建窗口的标题,我输入的标题是“贪吃蛇游戏”。

创建窗口: 利用pygame.display.set_mode(width,height)函数创建一个窗口,并输入宽和高。

屏幕背景颜色: 用fill(color)函数,将颜色进行填充(注:颜色用颜色的编码填入。),将语句放入主循环。

屏幕更新频率: 首先创建一个时钟对象用pygame库time模块中的pygame.time.Clock()实现,然后定义帧数变量,最后在主循环中的更新画面部分,写表示更新画面速度的语句,用时钟对象.tick(帧数)函数实现。

  1. 定义游戏主循环

主循环结构:

 用while函数进行循环,定义为True的变量作为条件,用变量易于结束死循环。我在主循环中分为了三部分模块,分别为用户控制,更新数据,和更新画面。

用户控制:

在此处需要用户控制贪吃蛇的移动,即按下键盘时,贪吃蛇的移动方向改变。见附录

更新数据:

需要更新数据,使贪吃蛇的状态进行刷新,设置蛇的身体(用列表实现 见附录)让蛇的身体向前增加一格的同时,尾部减少一格;还需要更新出食物出现的位置数据,食物需要利用随机数的函数来定义食物的坐标,使得食物能够在屏幕内随机位置出现。 见附录

更新画面:

需要更新画面中的各种图像,填充背景颜色,画背景格子,画蛇的头和身体,画食物。控制它们的颜色,大小等参数。在这个位置用绘制pygame.draw.rect()和填充fill()函数居多。

  1. 定义贪吃蛇的初始状态

绘制贪吃蛇:利用pygame库draw模块绘制矩形的函数实现,的pygame.draw.rect(),这里可设置作用在哪个屏幕,颜色,初始位置,尺寸。

  1. 定义食物的初始位置

我是直接随机的,所以初始值是不固定的。

  1. 定义贪吃蛇的移动参数
  2. 定义边界检测函数,判断贪吃蛇是否撞墙
  3. 定义食物生成函数,判断食物是否与贪吃蛇重叠
  4. 定义游戏结束函数,判断贪吃蛇是否撞到自己
  5. 定义键盘事件函数,控制贪吃蛇的移动方向。

以上代码见附录

第五章 测试

5.1 测试的意义

系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。 测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些实例来运行程序,以便发现错误。系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试时应遵循以基本原则。

5.2 实施测试

对游戏程序进行试运行,对容易出错和比较复杂的模块进行重点测试。

5.3 各功能界面截图与遇到的问题和解决方案

(1)在安装pygame库时出现的问题

我一开始是在cmd命令行中直接输入的安装pygame的指令,却频频报错,说未找到符合pygame的版本和pygame的分布错误。之后我在知乎的一位博客的文章[2]中按照他的步骤,发现在检查pip和之后的pygame库是否安装和版本更新中都出现报错,于是我才在官网中下载了相关资源并进行了更新。然后我在pycharm中试着导入,却发现报错说找不到pygame,我不知道为什么pycharm没有自动检测的pygame库文件。于是尝试了第二种方法,才解决了问题。

  1. 设置背景与贪吃蛇颜色时,所遇到的问题

设置颜色时我输入的颜色参数是颜色对应的英文,后来发现有颜色对应的编码,将编码作为参数后,成功运行。

5.4 测试结果

最后程序运行正常,没有发现什么错误,可以运行自如。

结束语

课程设计就快结束了,我自己认为自己学python没学好,而在整个程序设计中我觉得贪吃蛇的游戏应该是最简单的。

   通过这次课程设计,我对python又有了更深刻的认识。也有了更深一步的喜爱,决定一定要努力学好python,并能更好的应用于以后的工作中。

这次贪吃蛇的设计,我做的不是很完美,也没想象中的那么好,但也获得了许多宝贵的经验:

  1. 在设计程序之前,务必要对自己所要设计的题目和内容有一个系统的,大概的了解,知道所设计的题目和内容包含哪些资源。         (2)设计程序采用什么编程语言并不是非常重要,关键是要有一个清晰的思路和一个完整的程序流程图,所有要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。

(3)在设计程序时,不能妄想一次就将整个程序设计好,“反复不断改进”是程序设计的必经之路,发现错误也是取得成绩及成绩的一种必经之路。

(4)要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白自己的思路,这样也为资料的保存和交流提供了方便。在以后的工作中,我希望我能把这些经验应用起来。为以后的工作顺利进行,也让自己获得一定的能力,能够拥有一份好的工作。

(5)总之编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。所以认真仔细就是非常重要的了。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习python语言的一次实践作业,自己进步的证明。

通过这次课程设计,使我对python语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对python语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对python语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习python语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

 附 录

# 贪吃蛇游戏

# 导入模块
import random
import sys
import pygame
from tkinter import *


pygame.init()   # pygame库初始化 #如果用print()输出,会返回一个元组。例(5,0)表示有5个模块被载入而且成功,没有失败的。
pygame.display.set_caption("贪吃蛇游戏") # 更改窗口的标题
game_screen_width, game_screen_height = 640, 480    # 定义屏幕宽和高
game_screen = pygame.display.set_mode((game_screen_width, game_screen_height)) # 创建一个窗口对象(宽高)
game_clock = pygame.time.Clock()    # 创建一个时钟对象
game_speed = 3 # 定义帧数
game_screen_color = 00, 00, 00  # 定义屏幕背景颜色
game_linecolor = 33, 33, 33  # 格子线条的颜色

square_color = 33, 255, 33  # 贪吃蛇颜色
square_color2 = 33, 195, 33 # 贪吃蛇颜色
square_color3 = 255, 95, 33 # 贪吃蛇头的颜色
square_x, square_y = 0, 0   # 贪吃蛇初始位置
square_size = 20    # 贪吃蛇尺寸
square_speed = 20    # 贪吃蛇的速度
square_become = 0   # 贪吃蛇速度变化参数
square_speed_x, square_speed_y = square_speed, 0    # 控制速度的关键中间变量
square_body = [pygame.Rect(0, 0, 0, 0)] * 3    # 蛇的身体
game_field = game_screen.get_rect()     # <rect (0, 0, 640, 480),用于判断是否出墙的变量
square_rect = pygame.draw.rect(game_screen, square_color, (square_x, square_y, square_size, square_size))   # 蛇头
# food
food_color = 255, 255, 255  # 食物的颜色
m = 0 # 吃掉的食物个数
x = random.randrange(0, 640, 20)    # 食物位置参数x
y = random.randrange(0, 480, 20)    # 食物位置参数y
game_food = pygame.draw.rect(game_screen, square_color, (x, y, square_size, square_size))   # 食物位置以及大小

game_running = True
game_playing = True
while game_running: # 主循环
    # 用户控制
    for event in pygame.event.get():    # 从队列中获取事件  在后续获取鼠标键盘操作时可以得到应用
        if event.type == pygame.QUIT:   # 此时结束循环
            game_running = False
        elif event.type == pygame.KEYDOWN:  # 按下键盘时,贪吃蛇的移动控制
            if square_speed_y == 0:
                if event.key == pygame.K_UP and square_x % 20 == 0:
                    square_speed_x = 0
                    square_speed_y = -square_speed
                elif event.key == pygame.K_DOWN and square_x % 20 == 0:
                    square_speed_x = 0
                    square_speed_y = square_speed
            if square_speed_x == 0:
                if event.key == pygame.K_LEFT and square_y % 20 == 0:
                    square_speed_x = -square_speed
                    square_speed_y = 0
                elif event.key == pygame.K_RIGHT and square_y % 20 == 0:
                    square_speed_x = square_speed
                    square_speed_y = 0

    # 更新数据
        # 蛇的移动
    square_x += square_speed_x  # 贪吃蛇位置数据
    square_y += square_speed_y
    square_body.insert(0, square_rect)  # 增加一节身体
    square_body.pop()  # 尾部减少一节

        # Food

    if square_rect == game_food:
        x = random.randrange(0, 640, 20)
        y = random.randrange(0, 480, 20)
        game_food = pygame.draw.rect(game_screen, square_color, (x, y, square_size, square_size))
        square_body.append(pygame.Rect(0, 0, 0, 0))
        m += 1

    if len(square_body) != square_become:
        if len(square_body) % 5 == 0:
            game_speed += 2
            square_become = len(square_body)
    # 更新画面
    if game_playing:
        game_screen.fill(game_screen_color) # 填充背景颜色
            # 画格子
        for i in range(square_size, game_screen_width, square_size):
            pygame.draw.line(game_screen, game_linecolor, (i, 0), (i, game_screen_height))
        for i in range(square_size, game_screen_height, square_size):
            pygame.draw.line(game_screen, game_linecolor, (0, i), (game_screen_width, i))

            # 绘制蛇
                # 蛇头
        square_rect = pygame.draw.rect(game_screen, square_color, (square_x, square_y, square_size, square_size)) # 绘制蛇头,square_size这里表示长和宽
        game_screen.fill(square_color3, square_rect.inflate(-5, -5))    # 丰富蛇头色彩
                # 身体
        # pygame_Rect = pygame.draw.rect(game_screen, square_color,(square_x-20, square_y, square_size, square_size))
        for cell in square_body:    # 利用循环,绘制身体
            game_screen.fill(square_color, cell)
            game_screen.fill(square_color2, cell.inflate(-5, -5))
                # 食物
        game_food = pygame.draw.rect(game_screen, food_color, (x, y, square_size, square_size))

        # game over
        if game_playing:
            # 撞墙
            if not game_field.contains((square_x, square_y, square_size, square_size)):
                game_playing = False
                # 撞身体
            for cell in square_body:
                if square_rect == cell:
                    game_playing = False
            # 得分
            if not game_playing:
                print("GAME OVER")
                win = Tk()  # 创建根窗口
                win.title("游戏结果")   # 窗口的标题
                win.geometry("400x100+600+300")  # 窗口的大小和出现的位置
                win.configure(bg="white")   # 窗口颜色
                a = Label(win, text='您一共吃到了{0}食物\n蛇的长度为{1}\n您的最终得分为{2}'.format(m, len(square_body)+1, m*100*(len(square_body)+4))) #显示数据
                a.grid()    # 显示文字
                win.mainloop()  # 显示窗口
                game_running = False


        # 更新窗口内容
    pygame.display.flip()   # 更新整个待显示的 Surface 对象到屏幕上。(一般来说第一次更新用flip,后续更新使用update)
    game_clock.tick(game_speed)     # 更新画面速度



pygame.quit()    # 取消初始化

注:提前下好相关的第三方库,不然会报错。

猜你喜欢

转载自blog.csdn.net/qq_74349936/article/details/129679621
今日推荐