网站首页  词典首页

请输入您要查询的论文:

 

标题 贪吃蛇游戏的开发设计
范文

    吕橙

    

    

    

    摘要:运用EasyX和C语言在Visual Studio 2019 平台上设计开发了一款贪吃蛇游戏。通过游戏的开发,达到学习C语言和熟悉软件开发流程的目的。

    关键词:EasyX;Visual Studio 2019;贪吃蛇游戏

    中图分类号:TP311.52? ? ? 文献标识码:A

    文章编号:1009-3044(2021)03-0118-04

    Abstract: Using EasyX and C language, a snake game is designed and developed on the platform of visual studio 2019. Through the development of the game, to achieve the purpose of learning C language and familiar with the software development process.

    Key words: EasyX; Visual Studio 2019; Snake Game

    1 背景

    经典的贪吃蛇游戏是一款休闲益智类游戏,有PC和手机等多平台版本。该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,游戏通过键盘操作,简单方便,老少皆宜。

    文献[1]利用C#开发环境,开发实现了贪吃蛇游戏。文献[2]基于 HTML5 技术,采用 JavaScript 语言编程实现了简单的贪吃蛇游戏。文献[3]利用Protues 设计软件并仿真电路,制作了相应的PCB板,从硬件和软件两方面模拟了贪吃蛇游戏。文献[4]采用VS2010介绍了C++版的双人贪吃蛇游戏设计思想,文献[5]采用OpenGL实现了多人在线贪吃蛇游戏,可供多人多终端同步游戏。

    贪吃蛇游戏常用于学生课设、实验等实践环节,本文用EasyX和Visual Studio 2019软件实现贪吃蛇游戏。

    2 贪吃蛇游戏功能分析

    2.1 游戏规则分析

    一条蛇出现在封闭空间中,通过键盘控制,蛇可以向上下左右四个方向移动。随机产生食物,如果蛇头撞到食物,食物消失,蛇身体长增加一节,得分加100,刷新食物。游戏可以设置蛇移动的速度。如果蛇在前進过程中撞到墙或自己身体,则游戏结束。

    2.2 游戏功能分析

    游戏功能设计为3个模块:

    1)初始化模块,主要包括初始化地图、难度设置、初始化蛇的属性、初始化食物等;

    2)游戏控制模块,主要包括产生食物、移动蛇、按键控制、死亡判断;

    3)统计模块,主要包括实时显示玩家积分,玩家积分每超过500,自动升级到下一个难度级别,随机出现的食物增加1个。

    贪吃蛇游戏功能如图1所示。

    3 贪吃蛇游戏详细设计

    3.1 初始化模块

    功能主要包括初始化地图、难度设置、初始化蛇、初始化食物等。其中,难度设置,难度I每次产生一个食物,难度Ⅱ每次产生两个食物,难度Ⅲ每次产生三个食物,依次类推,最多每次产生食物不超过10个。

    坐标点、蛇、食物的结构体如下:

    // 坐标属性

    struct point

    {

    int x;

    int y;

    };

    // 蛇的属性

    struct Snake

    {

    vector xy;? ?// 每节坐标

    point next;? ? ?// 为下一节预留的位置

    vector color;? ? ?// 每节颜色

    int num;? ? ? ? ?// 长度

    int position;? ? ? ? // 方向

    }snake;

    // 食物的属性

    struct Food

    {

    point fdxy[10];? ?// 坐标

    int grade;? ? // 分数

    int num = 1;? ? ? ?// 食物总数

    COLORREF color[10];? // 食物颜色

    }food;

    enum position { up, down, left, right };? // 枚举蛇的方向

    3.2 游戏控制模块

    游戏执行过程中,通过按键控制蛇的走向,移动蛇,不停地产生食物,吃掉食物后,玩家积分增加,如果超过一定积分,难度升级,每次同时产生多个食物,判断是否撞墙或撞到自己,如果撞到了游戏结束。

    游戏流程如图2所示。

    3.3 统计模块

    游戏过程中,蛇每吃掉一个食物,累积积分100,积分每超过500自动升级到下一个难度级别,系统实时显示玩家积分。

    4 贪吃蛇游戏代码实现

    4.1 游戏中的坐标系

    以左上角(0,0)为游戏界面的原点,沿水平方向向右是x轴,逐渐增加,沿垂直方向向下是y轴,逐渐增加。游戏界面设计原理如图3所示。

    4.2 初始化模块代码实现

    初始化模块,主要是初始化游戏界面,初始化蛇,初始化食物。主要代码如下:

    初始化游戏设置函数:设置游戏界面尺寸,设置背景颜色,初始化随机数种子,设置文字前景色和背景色。

    initgraph(800, 600);

    setbkcolor(RGB(95, 183, 72));

    srand((unsigned)time(NULL));

    settextcolor(BLUE);

    setbkmode(TRANSPARENT);? ?// 设置文字输出模式为透明

    degree_dif= 1;? ? ? ? ? ? ? ? ? ? ? // 设置游戏难度

    初始化蛇函数:初始化蛇头位置,蛇身颜色,蛇身字节数量。

    // 初始化蛇

    void initSnake()

    {

    point xy;

    xy.x = 20;

    xy.y = 0;

    snake.xy.push_back(xy);

    snake.color.push_back(RGB(rand() % 256, rand() % 256, rand() % 256)); // 设置一个随机颜色

    xy.x = 10;

    xy.y = 0;

    snake.xy.push_back(xy);

    snake.color.push_back(RGB(rand() % 256, rand() % 256, rand() % 256)); // 设置一个随机颜色

    xy.x = 0;

    xy.y = 0;

    snake.xy.push_back(xy);

    snake.color.push_back(RGB(rand() % 256, rand() % 256, rand() % 256)); // 设置一个随机颜色

    snake.num = 3;

    snake.position = right;

    }

    初始化食物函數:初始化食物位置,食物随机产生到蛇身处理判断。

    // 初始化食物

    void initFood(int num /* 食物编号 */)

    {

    int i;

    food.fdxy[num].x = rand() % 80 * 10;

    food.fdxy[num].y = rand() % 60 * 10;

    for (i = 0; i < snake.num; i++)

    if (food.fdxy[num].x == snake.xy[i].x && food.fdxy[num].y == snake.xy[i].y)? // 避免食物生成在蛇身上

    {

    food.fdxy[num].x = rand() % 80 * 10;

    food.fdxy[num].y = rand() % 60 * 10;

    }

    }

    4.3 游戏控制模块代码实现

    该模块需要进行按键控制,移动蛇,产生食物,死亡判断等操作。主要代码如下:

    按键控制函数:根据用户按键,进行判断,“w”“s”“a”“d”分别表示“上”“下”“左”“右”四个方向。

    // 按键控制

    void keyDown()

    {

    char userKey = _getch();

    if (userKey == -32)? ?// 表明这是方向键

    userKey = -_getch();? ? ?// 获取具体方向,并避免与其他字母的 ASCII 冲突

    switch (userKey)

    {

    case 'w':

    case 'W':

    if (snake.position != down)

    snake.position = up;

    break;

    case 's':

    case 'S':

    if (snake.position != up)

    snake.position = down;

    break;

    case 'a':

    case 'A':

    if (snake.position != right)

    snake.position = left;

    break;

    case 'd':

    case 'D':

    if (snake.position != left)

    snake.position = right;

    break;

    }

    }

    产生食物函数:吃掉一个食物,积分增加100,积分每得500分,增加一个食物,游戏难度加一。

    void createFood()

    {

    int i;

    for (i = 0; i <= food.num - 1; i++)

    if (snake.xy[0].x == food.fdxy[i].x && snake.xy[0].y == food.fdxy[i].y)

    {

    snake.num++;

    snake.xy.push_back(snake.next);? // 新增一个节到预留位置

    snake.color.push_back(food.color[i]); // 将新增节的颜色设置为当前吃掉食物的颜色

    food.grade += 100;

    initFood(i);

    if (food.num < 10 && food.grade % 500 == 0 && food.grade != 0)

    {

    food.num++;? // 每得 500 分,增加一个食物,但食物总数不超过 10 个

    degree_dif++;

    initFood(food.num - 1); // 初始化新增加的食物

    }

    break;

    }

    }

    移动蛇函数:蛇头带领蛇身移动,不能反向移动,蛇头可以“上”“下”“左”“右”方向变化。

    // 移动蛇

    void moveSnake()

    {

    int i;

    // 将预留节设置为未移动前的尾节

    snake.next = snake.xy[snake.num - 1];

    // 将除蛇头以外的节移动到它的前面一節

    for (i = snake.num - 1; i >= 1; i--)

    snake.xy[i] = snake.xy[i - 1];

    // 根据当前移动方向移动蛇头

    switch (snake.position)

    {

    case right:

    snake.xy[0].x += 10;

    break;

    case left:

    snake.xy[0].x -= 10;

    break;

    case up:

    snake.xy[0].y -= 10;

    break;

    case down:

    snake.xy[0].y += 10;

    }

    }

    死亡判断函数:蛇撞到自己或撞到墙,游戏结束。

    // 游戏结束

    bool snakeStatus()

    {

    // 撞墙,将墙向外扩展一圈(否则蛇无法到达地图边缘)

    if (snake.xy[0].y <= -10 && snake.position == up)? return true;

    if (snake.xy[0].y + 10 >= 610 && snake.position == down) return true;

    if (snake.xy[0].x <= -10 && snake.position == left)? return true;

    if (snake.xy[0].x + 10 >= 810 && snake.position == right) return true;

    // 撞自己

    for (int i = 1; i < snake.num; i++)

    {

    if (snake.xy[0].x <= snake.xy[i].x + 10 && snake.xy[0].x >= snake.xy[i].x && snake.xy[0].y == snake.xy[i].y && snake.position == left)

    return true;

    if (snake.xy[0].x + 10 >= snake.xy[i].x && snake.xy[0].x + 10 <= snake.xy[i].x + 10 && snake.xy[0].y == snake.xy[i].y && snake.position == right)

    return true;

    if (snake.xy[0].y <= snake.xy[i].y + 10 && snake.xy[0].y >= snake.xy[i].y && snake.xy[0].x == snake.xy[i].x && snake.position == up)

    return true;

    if (snake.xy[0].y + 10 >= snake.xy[i].y && snake.xy[0].y + 10 <= snake.xy[i].y + 10 && snake.xy[0].x == snake.xy[i].x && snake.position == down)

    return true;

    }

    return false;

    }

    4.4 统计功能代码实现

    该模块的代码主要是实时统计并显示玩家积分,积分累加每超过500,自动升级进入到下一个难度级别。

    5 系统测试与结果

    游戏实现了贪吃蛇游戏基本功能,可以通过操纵“w”“s”“a”“d”实现蛇头的上下左右转动,运行界面如图4所示。

    游戏功能还可以进一步完善。比如:

    1)通过标准键盘的方向键(left、right、down、up)控制贪吃蛇的移动。

    2)游戏界面设置暂停和启动功能键。

    6 结束语

    本文以贪吃蛇游戏为原型,利用EasyX完成了游戏的基本运行,包括游戏的初始化设置、游戏控制模块和统计模块,游戏操作简单,运行准确,反应速度快,基本上满足了学生课设要求,提高学生的兴趣,带给学生具有挑战度的游戏类编程体验。

    参考文献:

    [1] 商利华.C#版贪吃蛇游戏的设计与实现[J].电脑与电信,2015(11):65-67.

    [2] 施瑶.基于HTML5的贪吃蛇游戏设计与实现[J].福建电脑,2018,34(7):118-119.

    [3] 汪源,李宛聪,黄文敏,等.一种基于LabVIEW的贪吃蛇游戏的设计[J].信息与电脑(理论版),2018(9):102-103,106.

    [4] 李嘉诚.基于VS2010的双人贪吃蛇设计与实现[J].数字技术与应用,2015(4):164.

    [5] 沈旭,孟巍,彭正超.多人在线版贪吃蛇3D游戏App设计与开发[J].计算技术与自动化,2019,38(4):126-132.

    【通联编辑:谢媛媛】

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/22 13:04:44