C语言小游戏——贪吃蛇

2023-11-14

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;
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言小游戏——贪吃蛇 的相关文章

随机推荐

  • Node.js连接MySQL连接池解决自动断开问题

    1 为什么要使用连接池 自己将node 写的api接口 部署服务器时 发现运行一段时间后 会查询不到数据库里的内容 通过自己百度发现到了自己没有关闭数据库 默认数据库可以保持连接一段时间 之后 就会断开连接 2 连接池如何使用 const
  • UA分享

    之前自架短地址服务搜集到的UA 感觉很乱没法分析 看看大佬们有没有兴趣 Mozilla 5 0 Linux U Android 4 4 2 zh cn GT I9500 Build KOT49H AppleWebKit 537 36 KHT
  • Opencl入门Demo

    最近负责的几个项目需要使用opencl进行编程 进行了学习 并将学习后编写的主要Demo代码记录下来 供大家初步入门使用 opencl的介绍 原理等这里就不说了 百度一下有很多 直接切入主题 这个demo实现两个数组的相加操作 1 进行平台
  • 初探BlockChain——哈希和电子签名

    昨天在B站学习到北京大学肖臻老师的 区块链技术与应用 的公开课 感到豁然开朗 BlockChain涉及到密码学的两个方面 哈希和电子签名 1 哈希 有计算机基础的童鞋都比较清楚其机制 这里再简单说一下其基本原理 哈希的意思就是引入随机数量的
  • 一对一和一对多的关联查询(该实体类中存在实体类属性和实体类集合属性,将关联的实体类详细信息查询出来,但没有查询所有该实体类信息)

    一 高级查询 高级查询主要是一对一查询 一对多查询 多对多查询 1 一对一查询 有用户和订单两个表 用户对订单是1对1查询 也就是订单中有一个外键是指向用户的 先创建实体类 User java public class User priva
  • c语言文件的方式写通讯录,用c语言多文件编写1000人的通讯录

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 1 添加联系人信息 2 删除指定联系人信息 3 查找指定联系人信息 4 修改指定联系人信息 5 显示所有联系人信息 6 清空所有
  • Redis —— 设置密码

    文章目录 Redis 设置密码 简介 需要修改两处 1 命令行进入Redis进行密码修改 2 修改Redis配置 redis conf 修改后重启redis Redis 设置密码 简介 没有密码 设置密码 需要修改两处 1 命令行进入Red
  • linux添加硬盘扫描

    查看host个数 ls sys class scsi host 重新扫描 echo gt sys class scsi host host编号 scan 可以形成脚本 也可以设置别名 简化操作
  • cmake获取当前编译器的类型与版本

    在使用cmake编译程序的时候 如何获取当前使用的编译器的类型 例如是clang 还是gcc cmake提供了很多相关的编译参数 可以查看当前使用的编译器的类型 当前使用的c 编译器 message CMAKE CXX COMPILER C
  • LLVM源码调试

    一 编译LLVM debug版本 调试LLVM代码需要基于debug版本 编译LLVM时 将build type设为Debug即可 cmake DCMAKE BUILD TYPE Debug 二 GDB调试 调试OPT reference
  • Linux下磁盘分区与扩容

    虚拟机增加磁盘进行磁盘分区 查看磁盘情况 root localhost df 查看设备 root localhost ls dev sd 增加磁盘 root localhost ls dev sd 找到对应增加的设备 假设增加的sdb ro
  • 【2】Qt的MainWindow的能看不能吃的框架 以及 添加图片资源

    就是加上菜单栏 窗口 这些东西 而且没做回调函数 没有做button 所以h文件没有改动 mainwindow cpp include mainwindow h include
  • selenium爬取药监总局

    url http 125 35 6 84 81 xk from selenium import webdriver from lxml import etree from time import sleep page text list d
  • python 复杂表达式

    复杂表达式 使用for循环的迭代不仅可以迭代普通的list 还可以迭代dict 假设有如下的dict d Adam 95 Lisa 85 Bart 59 完全可以通过一个复杂的列表生成式把它变成一个 HTML 表格 tds tr td s
  • LeetCode·每日一题·1177. 构建回文串检测·前缀和

    作者 小迅 链接 https leetcode cn problems can make palindrome from substring solutions 2309940 qian zhui he zhu shi chao ji xi
  • Jina Hub:一站式神经搜索系统组件分享平台

    Hub 是 Jina 全家桶中非常重要的一个成员 本期推文我们将详细介绍 Hub 的相关内容 在过往推文中 我们介绍过 高度适配深度学习任务的可扩展数据结构 DocArray 开源神经搜索框架 Jina 神经搜索系统结果调优工具 Finet
  • 嵌入式Web项目(二)——CGI的引入

    文章目录 静态网页工作原理 动态网页工作原理 CGI的概念 CGI工作原理 boa配置静态文件与CGI文件访问路径 静态文件 CGIPath 动态网页 以shell语言 实现动态网页案例 第一次访问测试 第二次测试 C语言测试 静态网页工作
  • C++ 原始指针、shared_ptr、unique_ptr分别在什么场景下使用

    开发中一直萦绕我的一个困惑是 智能指针和原始指针什么场景怎么用 现在终于有了答案 2020 03 22 增加了unique ptr指针的使用 1 智能指针天生负责对象生命期管理 所以生命期对象全都由unique ptr和shared ptr
  • Redis详解

    1 键值数据库的基本架构 不同键值数据库支持的key类型一般差异不大 而value类型则有较大差别 我们在对键值数据库进行选型时 一个重要的考虑因素是它支持的value类型 例如 Memcached支持的value类型仅为String类型
  • C语言小游戏——贪吃蛇

    贪吃蛇 1 游戏界面 2 游戏说明 3 程序源代码 1 游戏界面 2 游戏说明 贪吃蛇游戏按键说明 按方向键上下左右 可以实现蛇移动方向的改变 3 程序源代码 代码如下 示例 include