c语言贪吃蛇(简易版本含完整代码)

article/2025/10/25 21:50:03

文章目录

    • 前引
    • 头文件注释部分
    • 头文件部分
    • 主函数部分
    • 实现效果


前引


这个贪吃蛇是在我学完C语言的基本部分 在跟着哈工大的c语言程序设计Mooc课程完了之后做的 因为学完C语言很迷茫 不晓得应该学什么 学校里面的题库感觉刷起来又没有实际我能看到的东西 我认为在阶段性的学习过程中应该找到自己能够看得到的成果 才能刺激自己继续往前进 继续学习 不然很枯燥的学习谁都坚持不下去

这也是在看了视频教程后 自己一步步敲出来的 其实还是建议大家在看懂 了代码后自己实现 因为不要怕自己忘不忘 这又不是理论知识 敲出来的代码就是自己的 一步步的提升 加油qwq

另外 此代码保证可以运行
在这篇博客发布后一年 我需要用这个交大作业时用的还是这个博客的代码
编译无错 依然能够流畅无阻的运行
主要问题部分集中于头文件部分
详情多看一下头文件注释部分


头文件注释部分


这里是head.h头文件 因为可以使主文件看起来更整洁更清晰
因为我用的是code:blocks 头文件的创建是在File->New->Class中 然后点击创建就ok了 记得如果想看一下这个代码的实现效果 自己也创建头文件名字是head哦 不然头文件名字匹配不了hhhh 或者大家自己把代码一起copy到主程序里面也可以qwq 还有记得要把cpp给取消掉qwq

头文件创建截图
在这里插入图片描述


头文件部分


#ifndef HEAD_H
#define HEAD_H
#define SnakeMaxLength 20
typedef int bool;
#define true 1
#define false -1//背景布置
//这里解释一下 一个特殊字符实线格子在横列是占两格
//所以空白格子在圈中要以两倍的间隔空格隔开char MyBackGround[22][80]={  "■■■■■■■■■■■■■■■■■■■■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\t\t\t欢乐时光就要开始了\n","■                                    ■\n","■                                    ■\t\t\tW A S D控制操作\n","■                                    ■\n","■                                    ■\t\t\t碰到墙壁死亡\n","■                                    ■\n","■                                    ■\t\t\t祝好运\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■                                    ■\n","■■■■■■■■■■■■■■■■■■■■\n"};
//这里使用了枚举 为什么这里go_ease = -2 因为这里特殊字符在横向占两格 
//数列只占一个格子enum Direction{go_east = -2,go_west = 2,go_north = -1,go_south = 1};
int ArrSnake[SnakeMaxLength][3]={{0,0,0}};//判断蛇默认开始方向
int SnakeDirection = go_east;//判断食物是否还存在
bool OptionFoodAlive = false;
int x,y;
#endif

这里是主函数main.h的实现
里面有音乐播放功能 但只能用WAV文件格式
wav格式的音乐文件甩到你的exe文件旁边
因为用的是相对路径 然后歌名改成1.wav就ok了如果不想改音乐文件的话就把程序中的MyMusic那里1.wav改成你的音乐名字即可


主函数部分


#include <stdio.h>
#include <stdlib.h>
#include <string.h>//使用strncpy函数
#include <conio.h>//_getch()要用
#include <windows.h>//这个是有些函数要用
#include "head.h"//包含头文件
#include <time.h>//随机值懂得奥
#define true 1
#define false -1
typedef int bool;
int scores = 0;//首页
void FirstPage();
//播放音乐
void MyMusic();
//按回车键进入游戏
void EnterGame();
//停止音乐
void StopMusic();
//清空页面
void CleanScreen();
//背景基础函数
void BackGround();
//蛇爹的初始位置
void SetSnakePos();
//画蛇的位置
bool GiveSnake();
//给蛇的位置赋值
void MoveSnake();
//删除蛇
void DeleteSnake();
//控制蛇
void ControlSnake();
//判断蛇是否死亡
bool IsSnakeAlive();
//制造食物
void ProduceFood();
//蛇变长
void LengthenSnake();//首页
void FirstPage()
{printf("\n\n\n\n\n\n");printf("\t\t\t\t\t  《欢迎来到贪吃蛇的世界》\n\n\n");printf("\t\t\t\t\t 《W A S D 控制蛇前进后退》\n\n\n");printf("\t\t\t\t\t 《按下ENTER键开始新游戏》\n\n\n\n");printf("\t\t\t\t\t  《再次感谢游玩此游戏》\n");
}//播放音乐
//这里可以删除功能 不想添加因为删掉就ok了
void MyMusic()
{PlaySound("1.wav",NULL,SND_FILENAME | SND_ASYNC );
}//按回车键进入游戏
void EnterGame()
{while('\r'!=_getch());
}//停止音乐
void StopMusic()
{PlaySound(NULL, 0, 0);
}//清空页面
void CleanScreen()
{system("cls");
}//背景基础函数
//布置背景嗷 头文件里面的背景
void BackGround()
{int i;for(i=0; i<20; i++){printf("%s",MyBackGround[i]);}
}//蛇爹的初始位置
void SetSnakePos()
{//其实这里的x , y我在后面加备注的时候我觉得会错意了//这里的x 我想表示的是他的行数//这里的y 我想表示的是他的列数 就是第几列//如果大家想改程序可以改成//x是rows y是lines即可 我懒我就懒得改了 大家懂的就ok了int x=-1;int y=-1;srand(time(NULL));y = rand()%16+1;//给蛇的位置赋值 默认蛇初始有三个格子x = rand()%16+1;ArrSnake[0][0] = x;ArrSnake[0][1] = y*2;//为什么乘以二呢 因为特殊格子在横向是占两格ArrSnake[0][2] = go_east;ArrSnake[1][0] = x;ArrSnake[1][1] = y*2 + 2;//加二是因为一个字符两个格子ArrSnake[1][2] = go_east;ArrSnake[2][0] = x;ArrSnake[2][1] = y*2 + 4;ArrSnake[2][2] = go_east;
}//画蛇的位置
bool GiveSnake()
{int i;for(i=0; ArrSnake[i][0] != 0;i++){//为什么使用strncpy呢 因为更安全hhhh 可以限制格子数strncpy(&MyBackGround[ArrSnake[i][0]][ArrSnake[i][1]],"■",2);if(i && ArrSnake[0][0] == ArrSnake[i][0] &&  ArrSnake[0][1] == ArrSnake[i][1])   return false;}return true;
}//删除蛇
//为什么要删除蛇呢 因为这个蛇的移动就是一个 赋值 删除 赋值 删除的过程
//删除掉原来的蛇 然后再把现在的蛇表示出来 不然的话
//原来的蛇和现在的蛇就一直重复 导致原来的蛇一直在屏幕上
void DeleteSnake()
{int i;for(i=0; ArrSnake[i][0] != 0;i++){strncpy(&MyBackGround[ArrSnake[i][0]][ArrSnake[i][1]],"  ",2);}
}//蛇的坐标赋值
void MoveSnake()
{int i=SnakeMaxLength-1;ArrSnake[0][2]=SnakeDirection;for(;i>=1;i--){//过滤坐标为0if(0 == ArrSnake[i][0]){continue;}//将上一个物块的值赋值给下一个物块(除蛇头)ArrSnake[i][0]=ArrSnake[i-1][0];ArrSnake[i][1]=ArrSnake[i-1][1];ArrSnake[i][2]=ArrSnake[i-1][2];}//处理蛇头if( go_east == ArrSnake[0][2] || go_west == ArrSnake[0][2]){ArrSnake[0][1]+=ArrSnake[0][2];}else{ArrSnake[0][0]+=ArrSnake[0][2];}
}//控制蛇的方向
//这里是控制蛇的方向
//具体为什么用这个函数 大家可以自急查询一下
//这个Asyn的意思就是 异步的意思 表示你在操作的时候同时读入你键盘的值
//如果是同步的话 大家可以想象一下 需要你敲下回车 蛇才移动 不是嘛hhhh
void ControlSnake()
{if(GetAsyncKeyState('W')){if(SnakeDirection != go_south)SnakeDirection=go_north;}else if(GetAsyncKeyState('S')){if(SnakeDirection != go_north)SnakeDirection=go_south;}else if(GetAsyncKeyState('A')){if(SnakeDirection != go_west)SnakeDirection=go_east;}else if(GetAsyncKeyState('D')){if(SnakeDirection != go_east)SnakeDirection=go_west;}
}//判断蛇是否死亡
bool IsSnakeAlive()
{if(0 == strncmp(&MyBackGround[ArrSnake[0][0]][ArrSnake[0][1]],"■",2)){return false;}else{return true;}
}//制造食物
void ProduceFood()
{//蛇的坐标int i;srand(time(NULL));//蛇的坐标给予if(true == OptionFoodAlive){return;}while(1){bool tempbool = true;x=rand()%18 + 1;y=rand()%18 + 1;for(i=0 ; i<ArrSnake[i][0] ; i++){if(x == ArrSnake[i][0] && 2*y == ArrSnake[i][1]){tempbool = false;break;}}if(true == tempbool){break;}}strncpy(&MyBackGround[x][y*2],"★",2);OptionFoodAlive = true;
}//这里就是加长蛇的长度了
void LengthenSnake()
{int i=0;if(x == ArrSnake[0][0] && 2*y == ArrSnake[0][1]){OptionFoodAlive = false;scores += 10;for(; ;i++){if(ArrSnake[i][0] == 0){if(ArrSnake[i][2] == go_north || ArrSnake[i][2] == go_south){ArrSnake[i][0]=ArrSnake[i-1][0]-ArrSnake[i-1][2];ArrSnake[i][1]=ArrSnake[i-1][1];ArrSnake[i][2]=ArrSnake[i-1][2];}else{ArrSnake[i][0]=ArrSnake[i-1][0];ArrSnake[i][1]=ArrSnake[i][1]-ArrSnake[i][2];ArrSnake[i][2]=ArrSnake[i][2];}break;}}}
}//这里就是主函数具体怎么实现的了
//这个贪吃蛇还包含了重启功能
//这个注释还是挺详细的了 希望能对大家有所帮助 大家一起加油
int main()
{FirstPage();//首页显示MyMusic();//音乐播放EnterGame();//按回车键进入游戏StopMusic();//停止音乐CleanScreen();//清空屏幕(为正式游戏做铺垫)SetSnakePos();//设置蛇的初始坐标while(1){int flag = 0;ProduceFood();//制造食物DeleteSnake();//删除蛇ControlSnake();//控制蛇的移动MoveSnake();//蛇移动图案if(false == IsSnakeAlive()) flag = 1;LengthenSnake();if(false == GiveSnake())    flag = 1;//给予蛇在背景中图案BackGround();//布置背景Sleep(300);system("cls");if(flag){printf("Ur scores = %d\n",scores);printf("Thanks for playing this game!\n");break;}system("pause");}return 0;
}

实现效果


一年后 重新复制本篇博客到
新的文件 codeblocks 本地运行 运行编译正确 运行流畅

在这里插入图片描述
在这里插入图片描述


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

相关文章

C语言实现简单贪吃蛇代码

基本构成 穿墙控制 死亡控制 初始化蛇&#xff08;init_snake函数&#xff09; 移动蛇&#xff08;move_snake函数&#xff09; 打印蛇&#xff08; print_snake函数&#xff09; 利用for循环检测坐标对应的蛇的位置 代码演示 #include <stdio.h> #include <window…

C语言实现贪吃蛇

C语言实现贪吃蛇 贪吃蛇项目是在b站的一位老师那里边学边敲的&#xff08;现在视频被老师删掉了&#xff09;&#xff0c;在这里记录一下代码和学习时的一些思考&#xff0c;希望自己以后能用链表将贪吃蛇实现。 思考过程&#xff1a; 贪吃蛇 C语言实现 1.打印首页 --FirstP…

C语言写个贪吃蛇游戏

贪吃蛇是个非常经典的游戏&#xff0c;用C语言来实现也是一个好玩的事情。这个游戏我写完后放在知乎&#xff0c;竟然点赞的人数超级多。我觉得大家喜欢&#xff0c;一个方面是因为写得简单&#xff0c;大家都能看得懂&#xff0c;一个可扩展性还是非常强的。 我试了说一下这个…

C语言实现贪吃蛇小游戏(详解)

目录 一、程序实现的原理&#xff1a; 二、预备知识 1、控制台窗口 2、通过代码将光标移动到控制台指定位置 三、 程序框架 四、具体操作 1、定义相关头文件 2、定义函数结构以及相关属性 五、完成各代码块 1、 实现将光标移到指定位置的操作 2、 打印游戏边框以及游戏初始…

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

C语言实现&#xff0c;编译环境VS&#xff12;&#xff10;&#xff11;&#xff17; 附&#xff1a;easyx图形化(文章末尾&#xff09; 效果图如下 &#xff08;有一些函数kbhit&#xff0c;getch&#xff0c;在这表示为_kbhit与_getch&#xff09;//不同编译器原因 注意在Dev…

【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;顶层模块。 …