小白入门——“贪吃蛇”的C语言实现(详细)

article/2025/10/25 21:40:21

C语言实现,编译环境VS2017 附:easyx图形化(文章末尾)

 

 

效果图如下

 

(有一些函数kbhit,getch,在这表示为_kbhit与_getch)//不同编译器原因 注意在Dev等集成开发软件下可能会CE

 

o(* ̄▽ ̄*)o

 

 

 

一、引言

    作为一个小白,相信大家的心情都是一样的,渴望写一个人生的第一个“贪吃蛇”。

    在网上看了基本思路后,如果有一定的知识(链表的相关操作),写出这个应该是不难的。

    1、背景

        打印游戏背景框,以及一些初设的东西,如蛇的初始长度,可以的话可以自己加上出场界面

    2、食物产生

        通过srand,与rand 函数实现随机产生

    3、键盘信号获取

        由 _kbhit(),_getch() ,函数获取

    4、蛇的移动

        分为普通移动与吃到食物的移动

        ps.(许多网上通过刷屏实现,其实可以靠覆盖实现,将原来蛇覆盖用空格,然后重新打印蛇)

二、一些必要函数

    打印这个并不是图形库实现,所以要通过光标跳转实现打印

    注:此方法我也不清楚是从网上查阅资料所得,目前还是小白(ง •_•)ง

    

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

    应该是获取窗口句柄

    详细可以参考

    https://baike.baidu.com/item/SetConsoleCursorPosition/575826

    https://baike.baidu.com/item/GetStdHandle/6909878?fr=aladdin

    https://baike.baidu.com/item/coord/4594820?fr=aladdin

三、不多说,看代码

以前写的太烂了 现在重新更新了

/*
@Author: Joke-Lin
@Time: 2020-03-19
@Encoding: GB 2312
@IDE: VS2019
*/#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 main()
{system("color 0B"); // 设置控制台字体颜色 welcome();          // 欢迎界面 creatgraph();       // 创建地图 creatfood();        // 新建食物 // 捕获鼠标按键 ClickControlif (ClickControl() == 0) return 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);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;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 / 10;if (count <= 10) speed = 150;else if (count > 10 && count <= 20) speed = 100;else if (count > 20 && count <= 40) speed = 50;else speed = 10;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");
}

四、

   easyx 实现:链接地址

 效果如下:

     

觉得好的话欢迎犒劳(ง •_•)ง (要恰饭的嘛嘿嘿)

对评论里的重点问题,我有时间在博客里多加一些


http://chatgpt.dhexx.cn/article/gQOWl9jy.shtml

相关文章

【C语言】贪吃蛇游戏的实现(一)

&#xff08;注意&#xff1a;本代码是在VC6.0环境下编译的&#xff0c;在其他环境如codeblocks下运行可能会产生意想不到的问题&#xff0c;请尽量使用VC。至于为什么要使用VC编译&#xff0c;哦&#xff0c;我亲爱的朋友&#xff0c;这只有上帝才知道&#xff09; 最近由于小…

C语言贪吃蛇 新手入门(超详细)

贪吃蛇小程序&#xff0c;主要采用C语言描述&#xff0c;采用数组进行数据存储的图形化操作界面&#xff0c;会涉及一点点C 知识&#xff08;特别少的一点点&#xff09;&#xff0c;但是有C语言基础就够用了&#xff0c;编译器&#xff1a;VS2015&#xff0c;会涉及部分库函数…

C语言实现的贪吃蛇(无EasyX,详解)

&#x1f4a6;前言 或许厌倦了枯燥的做题&#xff0c;那就学学贪吃蛇&#xff0c;激发你的学习乐趣吧~ 你将进一步加深对结构体&#xff0c;单链表&#xff0c;函数&#xff0c;循环等基础的理解。 希望对你有所帮助~ 纯C实现的贪吃蛇&#x1f40d; &#x1f4a6;前言&#x1f…

教你如何用C语言做一个简单的贪吃蛇

小时候大家可能都玩过贪吃蛇&#xff0c;但有没有想过自己做一个出来玩玩看。今天我们就教大家用C语言做一个简单的贪吃蛇游戏。这里没有采用图形界面去做&#xff0c;而是采用win32控制台。 首先&#xff0c;先把做好的游戏初始界面和游戏截图先展示一下。 游戏初始界面如图&a…

C语言实现贪吃蛇(简易)

文章目录 目录 文章目录 前言 一、游戏功能和效果 1.游戏功能 2.游戏效果 二. 游戏初步实现 1.确定地图大小 2.创建蛇对象&#xff0c;食物对象 3.初始化蛇 4.生成随机食物 5.画蛇 6.画食物 7. 游戏内移动控制 1.当按上下左右时移动方向改变 。 2.开始游戏时的默认方向 8.判…

C语言贪吃蛇小游戏,贪吃蛇C语言代码实现大全

一、C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础&#xff0c;训练编程思维&#xff0c;培养解决问题的思路&#xff0c;领略多姿多彩的C语言。 贪吃蛇是非常经典的一款游戏&#xff0c;本次我们模拟在控制台实现贪吃蛇游戏&#xff0c;也就是实现…

C语言实现贪吃蛇[内附详细步骤]

C语言贪吃蛇项目 今天给分享一下使用C语言写个贪吃蛇小游戏&#xff0c;主要包含以下10部分内容&#xff1a; 1、windows光标定位与隐藏 2、欢迎界面 3、打印围墙 4、产生食物 5、初始化蛇身 6、响应按键 7、蛇身运动 8、碰撞检测 9、结束界面 10、程序运行 windows…

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

贪吃蛇&#xff08;也叫做贪食蛇&#xff09;游戏是一款休闲益智类游戏&#xff0c;有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋&#xff0c;从而使得蛇变得越来越长。 我们的今天的目标就是&#xff1a;用C语言来实现一个贪吃蛇项目&#xff0c;也不用…

C语言 贪吃蛇

基于C语言编写的贪吃蛇 编写环境&#xff1a;VS2019x86 这是一个基于C语言链表开发的贪吃蛇游戏 其实贪吃蛇游戏要解决的主要问题就是 1、这个游戏的基本组成元素和数据结构 2、如何初始化贪吃蛇并正常行走 3、如何判断事件发生 代码中运用到了键盘虚拟键判断、终端窗口大小的…

游戏贪吃蛇(c语言)

游戏贪吃蛇&#xff08;c语言&#xff09; 一、项目背景二、设计目的三、项目功能需求1、初始化游戏2、控制蛇的运行轨迹3、控制蛇的长度4、控制食物生成5、计算分数6、结束条件 四、系统的功能结构图五、总体设计1、初始化模块2、游戏控制模块3、运行控制模块4、食物生成模块 …

C语言实现贪吃蛇(详细版)

一、需要掌握的知识&#xff1a; C语言基础语法&#xff08;结构体、指针、链表&#xff09;、<windows.h>库、<stdlib.h>库、<time.h>库中的一些函数&#xff08;不需要额外学习&#xff0c;本文后面会讲贪吃蛇需要用到的相关函数&#xff09; 由于作者水平…

贪吃蛇(C语言实现)

文章目录 游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面颜色设置初始化蛇随机生成食物打印蛇与覆盖蛇移动蛇游戏主体逻辑函数执行按键判断得分与结束从文件读取最高分更新最高分到文件主函数 游戏说明 游戏界面当中没有打印相关的按键说明…

SDRAM控制器(初始化)

SDRAM控制器&#xff08;初始化&#xff09; 文章目录 SDRAM控制器&#xff08;初始化&#xff09;初始化模块时序逻辑图代码仿真结果 初始化模块 SDRAM 在上电之后&#xff0c;执行正常操作之前需要被初始化&#xff0c;实际上就是对上文提到的SDRAM 内部逻辑控制单元进行初始…

SDRAM 控制器设计基本完结

项目可以拓展的地方&#xff1a; 1、接口为AXI 2、接口为AXI与AXI DMA 交互 2、优化读写时序&#xff0c;使得SDRAM输出效率最大&#xff1b; 总结&#xff1a; 项目不足&#xff1a;没有进行效率的优化&#xff0c;无地址映射&#xff0c;无外接交互接口&#xff0c;功能单一…

SDRAM读写控制

SDRAM读写控制器&#xff0c;这里分为三个部分&#xff0c;分别是SDRAM的基本操作实现&#xff0c;SDRAM控制器&#xff0c;封装成FIFO,以方便使用。 一、SDRAM的基本操作&#xff1a;初始化模块、自动刷新模块、写操作模块、读操作模块、SDRAM仲裁模块&#xff0c;顶层模块。 …

SDRAM 控制器(二)——初始化模块

1、初始化模块 SDRAM 的初始化是芯片上电后必须进行的一项操作&#xff0c;只有进行了初始化操作的 SDRAM 芯片才可被正常使用。SDRAM 的初始化是一套预先定义好的流程&#xff0c;除此之外的其 他操作会导致 SDRAM 出现不可预知的后果。 初始化时序图&#xff1a; CK&#xf…

SDRAM详细介绍

概念介绍&#xff1a; SDRAM&#xff1a;Synchronous Dynamic Random Access Memory&#xff0c;同步动态随机存储器。同步是指其时钟频率和CPU前端总线的系统时钟相同&#xff0c;并且内部命令的发送与数据的传输都以它为基准&#xff1b;动态是指存储阵列需要不断的刷新来保证…

sdram简易控制器设计

耗时一周&#xff0c;终于完成sdram简易控制器的所有代码设计&#xff0c;其中感谢开源骚客 – 邓堪文老师在b站发布的相关视频学习教材&#xff1b;其中仿真模块及所使用到的sdram仿真文件来源于开源骚客&#xff1b; 因为时间较为紧迫&#xff0c;其中就不做代码的一些注释&…

基于FPGA的SDRAM控制器设计(一)

基于FPGA的SDRAM控制器设计&#xff08;一&#xff09; 1. SDRAM控制器整体框架2.UART_RX模块3.UART_TX模块4. RX与TX模块的整合5.需要注意的问题6.代码7.参考资料 1. SDRAM控制器整体框架 图1.1整体框架 PC端通过串口模块UART_RX发送读写命令以及数据到Cmd_encode模块&#xf…

基于FPGA的SDRAM控制器设计(1)

基于FPGA的SDRAM初始化配置 SDRAM简述SDRAM的引脚及作用SDRAM初始化时序控制SDRAM上电时序代码SDRAM测试模块的代码仿真测试结果参考文献总结 SDRAM简述 SDRAM&#xff08; Synchronous Dynamic Random Access Memory&#xff09;&#xff0c;同步动态随机存储器。同步是指 Me…