2021-08-08

 

目  录

设计总说明 I

1 设计目的 1

2 详细设计 1

2.1 贪吃蛇本体设计 1

2.2 贪吃蛇食物设计 2

2.3 游戏界面设计...........................................................................................3

2.3.1 游戏初始化......................................................................................................3

2.3.2 游戏开始..........................................................................................................3

2.3.3 游戏结束..........................................................................................................3

  2.4 游戏玩法规则设计...................................................................................3

  2.5 核心设计...................................................................................................3

3 功能测试.................................................................................................................3

   3

参考文献 4

设计总说明

编写一个使用c语言的小游戏。

基本要求:

  1. 实现一个小游戏
  2. 实现基本游戏控制功能
  3. 具有计算分数功能
  4. 界面布局合理、美观

设计目的:

通过使用Visual Srudio2019实现一个小游戏的课程设计,进一步掌握c语言的使用方法和锻炼自己动手写程序的能力。了解游戏设计的整个过程,通过熟练使用c语言来编写游戏。程序主要

关键词:贪吃蛇;流程图;C语言;源程序

2详细设计

2.1贪吃蛇本体设计

蛇有坐标,以x和y来代表,用链表来连接每一节的蛇。

typedef struct Snakes

{

    int x;

    int y;

    struct Snakes* next;

}snake;

2.2贪吃蛇食物设计

贪吃蛇的食物有一个坐标(x,y),并且食物还有一个布尔型flag,当食物为false就会产生新的食物,但是flag为ture的时候就不会再产生新食物。

struct Food

{

    int x;

    int y;

}food;

 bool flag = false;

2.3游戏界面设计

2.3.1游戏初始化

1.先设置控制台的颜色,然后使用welcom函数printf出欢迎界面。

2.然后用void creatgraph()函数创建地图,用void creatfood()函数创建食物。

int main()

{

    system("color 0B"); // 设置控制台字体颜色

    welcome();          // 欢迎界面

    creatgraph();       // 创建地图

    creatfood();        // 新建食物

    // 捕获键盘按键 ClickControl

    if (ClickControl() == 0)

        return 0;

}

2.3.2游戏开始

一开始没有捕获键盘按键,蛇不动,用int ClickControl()函数捕获到键盘按键的时候,用void MovingBody()函数来蛇开始移动。

2.3.3游戏结束

蛇死亡时再按一次任意键,则游戏结束与退出

2.4 游戏玩法规则设计

输入name后进入游戏,按除了p或者空格暂停,按了wasd其中一个则会继续,当按键盘上的“w”“s”“a”“d”键时,蛇体方向的改变。按“w”时,如果蛇的方向不是朝下的,就将direct方向置为上,使其向上运动,当然如果本身就是向上运动的,那么蛇的运动方向没有变化;如果蛇的方向朝下,按上,则不能改变它的方向。其他按法与上类似。游戏过程中若蛇死亡,则结束游戏

  2.5 核心设计

一开始接收到键盘按键的时候,利用循环和void MovingBody()函数依次画出蛇头和两蛇身,并且蛇每一节用(x,y)来表示它的位置,其次,用void ChangeBody(int x, int y)函数将蛇的前一节的横纵坐标赋给后面一节,并将蛇头,按照最新获得的方向按键加x或者加y的值,用void gotoprint(int x, int y)函数用●打印蛇,然后用void gotodelete(int x, int y) ‘ ’(空格)来清除蛇的最后一节。

鸣  谢

谢谢老师的大力支持,和同学们的乐心帮助,和自己的用心努力。

参考文献

  1. 百度知道
  2. c语言程序设计

附录1  源程序 (要求附上所有的程序)

#include<stdio.h>

#include<string.h>

#include<windows.h>

#include<time.h>

#include<conio.h>

#define up 'w'

#define down 's'

#define left 'a'

#define right 'd'

void welcome();               // 开始界面

void Finish();                // 结束界面

void creatgraph();            // 围墙打印

void gotoxy(int x, int y);    // 光标跳转,横为X 0,1,2..

void gotoprint(int x, int y); // 跳转打印

void gotodelete(int x, int y);// 跳转删除

void creatfood();             // 食物产生

int ClickControl();           // 获取键盘信号

int Judge();                  // 游戏结束判断

void MovingBody();            // 蛇的移动

void Eating();                // 蛇吃到东西后的操作(伸长)

void ChangeBody(int x, int y); // 蛇的坐标变换

/******************************结构体******************************/

/*全局变量 + 预处理:*/

typedef struct Snakes

{

    int x;

    int y;

    struct Snakes* next;

}snake;

snake* head;    // 声明蛇头指针

// 申明并定义食物

struct Food

{

    int x;

    int y;

}food;

/******************************全局变量******************************/

char name[20];  // 保存用户名 有兴趣可以制作登录系统

int score = 0;  // 分数

char click = 1; // 记录敲下的键盘按键

int speed;      // 速度 其实是延迟的毫秒数

int flat = 0;   //进行颜色的改变

/******************************主函数******************************/

int main()

{

    system("color 0B"); // 设置控制台字体颜色

    welcome();          // 欢迎界面

    creatgraph();       // 创建地图

    creatfood();        // 新建食物

    // 捕获键盘按键 ClickControl

    if (ClickControl() == 0)

        return 0;

}

/**********************************************************/

void welcome()

{

    gotoxy(15, 10);

    printf("/**********************************************/");

    gotoxy(15, 20);

    printf("/**********************************************/");

    gotoxy(20, 13);

    printf("WELCOME TO THE GAME OF RETRO SNAKE");

    gotoxy(14, 16);

    printf("请在英文输入法中操作,反向移动等同于吃到自己,wasd控制p暂停");

    gotoxy(20, 18);

    printf("PLEASE ENTER YOUR NAME:");

    scanf_s("%s", &name, 20);

    system("cls");

}

/**********************************************************/

void creatgraph() {

    int i;

    /*

    注意这里横坐标是每次+2 因为控制台字符宽高比为1:2

    */

    for (i = 0; i < 58; i += 2)

    {

        gotoprint(i, 0);

        gotoprint(i, 26);

    }

    for (i = 1; i < 26; i++)

    {

        gotoprint(0, i);

        gotoprint(56, i);

    }

    gotoxy(63, 10);

    printf("hello %s,Welcome To Play", name);

    gotoxy(63, 15);

    printf("Your Score Is:%d    = ̄ω ̄= ", score);

    gotoxy(63, 20);

    printf("This Game Is Created By JOKER");

    head = (snake*)malloc(sizeof(snake));

    snake* p = (snake*)malloc(sizeof(snake));

    snake* q = (snake*)malloc(sizeof(snake));

    head->x = 16;

    head->y = 15;

    p->x = 16;

    p->y = 16;

    q->x = 16;

    q->y = 17;

    head->next = p;

    p->next = q;

    q->next = NULL;

}

/**********************************************************/

void gotoxy(int x, int y)

{

    // 更新光标位置

    COORD pos;

    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

    pos.X = x;

    pos.Y = y;

    SetConsoleCursorPosition(hOutput, pos);

    // 隐藏光标

    CONSOLE_CURSOR_INFO cursor;

    cursor.bVisible = FALSE;

    cursor.dwSize = sizeof(cursor);

    SetConsoleCursorInfo(hOutput, &cursor);

}

/**********************************************************/

void gotoprint(int x, int y)

{

    gotoxy(x, y);

    if(flat==0)

        system("color 0F"); // 设置控制台字体颜色

    else if(flat==1)

        system("color 0D");

    else if(flat==20)

        system("color 0B");

    else

        system("color 0E");

    printf("●");

}

/**********************************************************/

void gotodelete(int x, int y)

{

    gotoxy(x, y);

    printf("  ");

}

/**********************************************************/

void creatfood()

{

    // 随机产生一个食物

    bool flag = false;

    while (!flag)

    {

        flag = true;

        srand((int)time(NULL));

        food.y = rand() % (25 - 1 + 1) + 1;

        food.x = rand() % (54 - 2 + 1) + 2;

        if (food.x % 2 != 0)

        {

            food.x = food.x + 1;

        }

        snake* judge = head;

        while (1)  //遍历排除蛇身重复

        {

            if (judge->next == NULL) break;

            if (food.x == judge->x && food.y == judge->y)

            {

                flag = false;

            }

            judge = judge->next;

        }

    }

    gotoxy(food.x, food.y);

    printf("⊙");

}

/**********************************************************/

// 捕获按键 游戏主循环

int ClickControl()

{

    char c = 0;

    while (1)

    {

        if (Judge() == 0) return 0;

        if (_kbhit())

        {

            click = _getch();

        }

        MovingBody();

        Eating();

    }

    return 1;

}

/**********************************************************/

void MovingBody() {

    int x = head->x, y = head->y;

    snake* p = head;

    // 通过先清空后打印实现动画效果

    while (p->next != NULL) {

        p = p->next;

    }

    gotodelete(p->x, p->y); // 消除尾节点

    switch (click)

    {

    case up:

        y -= 1;

        break;

    case down:

        y += 1;

        break;

    case left:

        x -= 2;

        break;

    case right:

        x += 2;

        break;

    default:

        break;

    }

    if (x != head->x || y != head->y) {

        // 改变坐标时更新 暂停游戏停止更新蛇

        ChangeBody(x, y);

    }

    p = head;

    // 打印蛇头

    gotoprint(p->x, p->y);

    // 蛇速度控制

    int count = score / 5;

    if (count <= 10) speed = 150;

    else if (count > 10 && count <= 20) speed = 100,flat=flat+1;

    else if (count > 20 && count <= 40) speed = 50;

    else speed = 20;

    Sleep(speed);

}

/**********************************************************/

// 吃到食物处理 添加一个尾巴

void Eating()

{

    if (head->x == food.x && head->y == food.y)

    {

        creatfood();

        snake* _new = (snake*)malloc(sizeof(snake));

        snake* p;

        p = head;

        while (1)

        {

            if (p->next == NULL) break;

            p = p->next;

        }

        p->next = _new;

        _new->next = NULL;

        score += 10;

        gotoxy(77, 15);

        printf("%d", score);

    }

}

/**********************************************************/

// 更新蛇体坐标 只需要消除尾结点 然后把新坐标结点置为头结点即可

void ChangeBody(int x, int y)

{

    snake* p = head;

    while (p->next->next != NULL) {

        p = p->next;

    }

    free(p->next);

    p->next = NULL;

    snake* new_head = (snake*)malloc(sizeof(snake));

    new_head->x = x;

    new_head->y = y;

    new_head->next = head;

    head = new_head;

}

/**********************************************************/

// 判断是否游戏结束

int Judge()

{

    if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)

    {

        Finish();

        return 0;

    }

    snake* p = head->next;

    while (1)

    {

        if (p == NULL) break;

        if (head->x == p->x && head->y == p->y)

        {

            Finish();

            return 0;

        }

        p = p->next;

    }

    return 1;

}

/**********************************************************/

void Finish()

{

    system("cls");

    gotoxy(15, 10);

    printf("/**********************************************/");

    gotoxy(15, 20);

    printf("/**********************************************/");

    gotoxy(18, 14);

    printf("GAME   OVER      o(* ̄▽ ̄*)o");

    gotoxy(20, 16);

    printf("Your Score is %d    hiahiahia", score);

    gotoxy(18, 18);

    printf("还不错哦,     继续努力O(∩_∩)O");

    gotoxy(0, 27);

    // 释放空间

    snake* p = head, * q;

    while (p != NULL) {

        q = p->next;

        free(p);

        p = q;

    }

    system("pause");

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ffmpeg-2021-08-08-git-ac0408522a是一个开源的音视频处理工具,它可以在多个平台上进行编译和安装。该版本是2021年8月8日的最新版本,使用了ac0408522a的Git提交ID。 full_build表示这个版本是一个完整的构建版本,它包含了所有的功能和模块。在编译过程中,会将ffmpeg的所有组件和依赖项都包含进去,以便用户可以使用和访问所有的功能。 通过使用该版本的ffmpeg,用户可以进行各种音视频处理任务,例如转码、剪辑、合并、分割、提取音频等等。它支持多种音视频格式,包括但不限于MP4、AVI、MKV、MP3、AAC等。用户可以根据自己的需求选择不同的输入和输出格式,并且可以自定义各种编解码参数。 此外,ffmpeg还提供了丰富的命令行选项和参数,以便用户可以灵活地控制和配置转码过程。用户可以通过给定不同的命令行选项来指定输入文件、输出文件、编码方式、视频尺寸、比特率、帧率等等,以达到不同的处理目的。 需要注意的是,由于ffmpeg是一个功能强大且复杂的工具,对于初学者来说可能需要一定的学习和实践才能熟练掌握。因此,建议用户在使用之前先阅读官方文档或者参考相关教程,以便更好地了解和使用ffmpeg的功能。 ### 回答2: ffmpeg-2021-08-08-git-ac0408522a-full_build 是一个版本号为 ac0408522a 的 ffmpeg 软件的完整构建版。 FFmpeg 是一个开源的音视频处理工具,能够对音视频进行转码、混流、剪辑等操作。它提供了很多功能丰富的命令行工具,可以满足各种音视频处理需求。 这个版本的 ffmpeg 是在 2021 年 8 月 8 日基于 ac0408522a 提交的代码所编译而成。ac0408522a 是版本的特定标识符,用于追踪、识别和检索代码库中的不同版本。 full_build 表示这个版本是基于完整构建进行的,即所有功能和特性都被包含在内。这意味着在这个版本中,你可以使用 FFmpeg 提供的所有命令和选项,无需额外编译或安装其他附加组件。 对于想要使用 FFmpeg 进行音视频处理的用户来说,这个完整构建版提供了方便和易用性。用户可以通过命令行调用 ffmpeg 工具,并根据自己的需求使用不同的参数和选项,完成各种音视频处理任务,如转码、剪辑、添加字幕、提取音频等等。 由于 FFmpeg 是一个持续更新和发展的开源项目,新的版本可能会修复漏洞、增加新的功能或性能改进。因此,使用最新的版本可以获得更好的用户体验和更高的稳定性。 总之,ffmpeg-2021-08-08-git-ac0408522a-full_build 是基于 ac0408522a 提交的代码所编译而成的一个完整构建版的 FFmpeg 软件,用户可以使用其中的功能丰富的命令行工具来进行音视频处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值