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.游戏界面

2.游戏说明

贪吃蛇游戏按键说明:

按方向键上下左右,可以实现蛇移动方向的改变:

3.程序源代码

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

#define width 60     
#define hight 25
#define SNAKESIZE 200   //蛇身的最长长度

int key = 72;           //初始化蛇的运动方向,向上
int changeflag = 1;     //用来标识是否生成食物,1表示蛇还没吃到食物,0表示吃到食物
int speed = 0;          //时间延迟
struct {

    int len;
    //用来记录蛇身每个方块的坐标
    int x[SNAKESIZE];
    int y[SNAKESIZE];
    int speed;
}snake;

struct
{
    int x; int y;
}food;
void gotoxy(int x, int y)//调用Windows的API函数,可以在控制台的指定位置直接操作,这里可暂时不用深究
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//■○
void drawmap()
{
    //打印图框
    for (int _y = 0; _y < hight; _y++)
    {
        for (int x = 0; x < width; x += 2)
        {
            if (x == 0 || _y == 0 || _y == hight - 1 || x == width - 2)
            {
                gotoxy(x, _y);
                printf("■");
            }
        }
    }
    //打印蛇头
    snake.len = 3;
    snake.x[0] = width / 2;
    snake.y[0] = hight / 2;
    gotoxy(snake.x[0], snake.y[0]);
    printf("■");
    //打印蛇身
    for (int i = 1; i < snake.len; i++)
    {
        snake.x[i] = snake.x[i - 1];
        snake.y[i] = snake.y[i - 1] + 1;
        gotoxy(snake.x[i], snake.y[i]);
        printf("■");
    }
    //初始化食物的位置
    food.x = 20;
    food.y = 20;
    gotoxy(food.x, food.y);
    printf("○");
}

/*
    *控制台按键所代表的数字
    *“↑”:72
    *“↓”:80
    *“←”:75
    *“→”:77
    */
void snake_move()       //按键处理函数
{
    int history_key = key;
    if (_kbhit())
    {
        fflush(stdin);
        key = _getch();
        key = _getch();
    }
    if (changeflag == 1)//还没吃到食物,把尾巴擦掉
    {
        gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
        printf("  ");
    }
    for (int i = snake.len - 1; i > 0; i--)
    {
        snake.x[i] = snake.x[i - 1];
        snake.y[i] = snake.y[i - 1];
    }
    if (history_key == 72 && key == 80)    key = 72;
    if (history_key == 80 && key == 72)    key = 80;
    if (history_key == 75 && key == 77)    key = 75;
    if (history_key == 77 && key == 75)    key = 77;
    switch (key)
    {
    case 72:snake.y[0]--; break;
    case 75:snake.x[0] -= 2; break;
    case 77:snake.x[0] += 2; break;
    case 80:snake.y[0]++; break;
    }
    gotoxy(snake.x[0], snake.y[0]);
    printf("■");
    gotoxy(0, 0);
    changeflag = 1;
}
void creatfood()
{
    if (snake.x[0] == food.x && snake.y[0] == food.y)//只有蛇吃到食物,才能生成新食物
    {
        changeflag = 0;
        snake.len++;
        if (speed <= 100)speed += 10;
        while (1)
        {
            srand((unsigned int)time(NULL));
            food.x = rand() % (width - 6) + 2;//限定食物的x范围不超出围墙,但不能保证food.x为偶数
            food.y = rand() % (hight - 2) + 1;
            for (int i = 0; i < snake.len; i++)
            {
                if (food.x == snake.x[i] && food.y == snake.y[i])//如果产生的食物与蛇身重合则退出
                    break;
            }
            if (food.x % 2 == 0)    break;//符合要求,退出循环
        }
        gotoxy(food.x, food.y);    printf("○");
    }
}

bool Gameover()
{
    //碰到围墙,OVER
    if (snake.x[0] == 0 || snake.x[0] == width - 2)return false;
    if (snake.y[0] == 0 || snake.y[0] == hight - 1)  return false;
    //蛇身达到最长,被迫OVER
    if (snake.len == SNAKESIZE)              return false;
    //头碰到蛇身,OVER
    for (int i = 1; i < snake.len; i++)
    {
        if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i])
            return false;
    }
    return true;
}
int main()
{
    system("mode con cols=60 lines=27");
    drawmap();
    while (Gameover())
    {
        snake_move();
        creatfood();
        Sleep(350 - speed);//蛇的移动速度
    }
    return 0;
}

感谢阅读,如有不足之处,欢迎来指正。谢谢!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:10:02  更:2022-03-08 22:11:36 
 
开发: 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年11日历 -2024/11/24 4:20:55-

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