IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言小程序】贪吃蛇 -> 正文阅读

[C++知识库]【C语言小程序】贪吃蛇

贪吃蛇1.0

规则

? 初始蛇身长为2,向右移动,每吃到一次食物身长加1,积分加10

? wasd控制移动方向

? 碰到墙壁、障碍物或者吃到自身时死亡,游戏结束

代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <conio.h>

#define WIDE 60 //地图宽
#define HIGH 20 //地图高

typedef struct _body //蛇身一块的坐标信息
{
    int x;
    int y;
} BODY;

typedef struct snake //蛇的信息
{
    int size;
    BODY list[WIDE * HIGH]; //蛇身坐标
    BODY food;              //当前食物的坐标
    COORD coord;            //光标位置
    BODY tail;              //原本蛇尾的坐标
    int dx;                 //蛇的移动方向,默认向右
    int dy;
} SNAKE;

void hide_cur();                    //终端窗口隐藏光标
void init_snake(SNAKE *snake);      //初始化蛇的信息
void init_food(SNAKE *snake);       //随机生成食物位置
void init_wall();                   //初始化墙
void show_ui(SNAKE *snake);         //显示蛇、食物
void start_game(SNAKE *snake);      //开始游戏
void move_snake(SNAKE *snake);      //根据按键改变蛇坐标信息
void snake_direction(SNAKE *snake); //根据按键改变蛇的移动方向
void eat_food(SNAKE *snake);        //蛇是否碰到食物
int eat_self(SNAKE *snake);         //判断蛇是否吃到自己,吃到返回 1,否则 0
void game_over(SNAKE *snake);       //游戏结束

int main()
{
    system("cls"); //清屏

    hide_cur(); //终端窗口隐藏光标

    SNAKE *snake = (SNAKE *)malloc(sizeof(SNAKE));
    init_snake(snake); //初始化蛇的信息

    start_game(snake); //开始游戏
    return 0;
}

void hide_cur()
{
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = sizeof(cci);
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}

void init_ui()
{
    for (int i = 0; i < HIGH; i++)
    {
        for (int j = 0; j < WIDE; j++)
        {
            printf("#");
        }
        printf("\n");
    }
}

void init_snake(SNAKE *snake)
{
    //初始化蛇首坐标
    snake->list[0].x = WIDE / 2;
    snake->list[0].y = HIGH / 2;
    //初始化蛇尾坐标
    snake->list[1].x = WIDE / 2 - 1;
    snake->list[1].y = HIGH / 2;
    //初始化蛇身长度
    snake->size = 2;
    //随机生成初始食物位置
    init_food(snake);
    //默认移动方向向右
    snake->dx = 1;
    snake->dy = 0;
}

void init_food(SNAKE *snake)
{
    srand(time(NULL));

    snake->food.x = rand() % (WIDE - 3) + 1; //-2、+1都是防止出界
    snake->food.y = rand() % (HIGH - 3) + 1; //-2、+1都是防止出界
}

void init_wall()
{
    //显示墙
    for (int i = 0; i < HIGH; i++)
    {
        for (int j = 1; j < WIDE + 1; j++)
        {
            if (i == 0 || i == HIGH - 1 || j == 1 || j == WIDE)
                printf("#");
            else
                printf(" ");
        }
        printf("\n");
    }
}

void show_ui(SNAKE *snake)
{
    //显示蛇
    for (int i = 0; i < snake->size; i++)
    {
        if (!snake->list[i].x && !snake->list[i].y)
            return;

        //设置光标位置
        snake->coord.X = snake->list[i].x;
        snake->coord.Y = snake->list[i].y + 1; //加 1是避免和终端窗口中的命令语句重叠
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);

        if (i == 0) //蛇头
        {
            printf("@");
        }
        else //蛇身
        {
            printf("*");
        }
    }

    //清除屏幕上原本蛇尾部分
    snake->coord.X = snake->tail.x;
    snake->coord.Y = snake->tail.y + 1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
    printf(" ");

    //显示食物
    snake->coord.X = snake->food.x;
    snake->coord.Y = snake->food.y + 1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);
    printf("+");
}

void start_game(SNAKE *snake)
{
    init_wall(); //初始化墙

    while (snake->list[0].x < WIDE - 1 && snake->list[0].x > 0 && snake->list[0].y < HIGH - 2 && snake->list[0].y > -1) //没撞墙时
    {
        snake_direction(snake); //控制蛇的方向

        move_snake(snake); //更新蛇的坐标

        show_ui(snake); //显示蛇、食物

        eat_food(snake); //蛇是否碰到食物

        if (eat_self(snake)) //判断蛇是否吃到自己
            break;

        Sleep(200); //延时0.2s
    }

    game_over(snake);
}

void snake_direction(SNAKE *snake)
{
    char key = 0;
    while (_kbhit())    //按下按键进入循环
        key = _getch(); //获取按键值
    switch (key)
    {
    case 'w':
        snake->dx = 0;
        snake->dy = -1;
        break;

    case 's':
        snake->dx = 0;
        snake->dy = 1;
        break;
    case 'a':
        snake->dx = -1;
        snake->dy = 0;
        break;
    case 'd':
        snake->dx = 1;
        snake->dy = 0;
        break;
    default:
        break;
    }
}

void move_snake(SNAKE *snake)
{
    //记录原本蛇尾位置
    snake->tail.x = snake->list[snake->size - 1].x;
    snake->tail.y = snake->list[snake->size - 1].y;

    //蛇身位置改变
    for (int i = snake->size - 1; i > 0; i--)
        snake->list[i] = snake->list[i - 1];

    //蛇首位置改变
    snake->list[0].x += snake->dx;
    snake->list[0].y += snake->dy;
}

void game_over(SNAKE *snake)
{
    system("chcp 65001"); //防止终端汉字乱码
    system("cls");        //清屏,美观

    //居中打印结果
    COORD coord;
    coord.X = WIDE / 2 - 10;
    coord.Y = HIGH / 2;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    printf("游戏结束,得分:%d\n", 10 * (snake->size - 2));

    //美观考虑,移动光标
    coord.X = 0;
    coord.Y = HIGH;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

    Sleep(2000); //延时2s
    exit(0);
}

int eat_self(SNAKE *snake)
{
    for (int i = 1; i < snake->size; i++)
        if (snake->list[0].x == snake->list[i].x && snake->list[0].y == snake->list[i].y)
            return 1;

    return 0;
}

void eat_food(SNAKE *snake)
{
    if (snake->list[0].x == snake->food.x && snake->list[0].y == snake->food.y)
    {
        //重新生成初始食物位置
        init_food(snake);

        //蛇身长度加 1
        snake->size++;
    }
}
运行方法

? 打开命令行窗口,执行

gcc -o greedy_snake.c greedy

? 生成greedy_snake.exe可执行文件

? 执行

./greedy_snake
待实现功能

关卡设置,积分达到一定值进入下一关

加入障碍物、巡逻者等

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:19:21  更:2021-08-15 15:21:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 4:44:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码