C语言制作小游戏——贪吃蛇

article/2025/10/25 21:56:24

直接上代码

​
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <time.h>
#include <windows.h>//MAXWIDTH、MAXHEIGHT、INITLEN 以字符记
#define MAXWIDTH (30)
#define MAXHEIGHT MAXWIDTH
#define INITLEN (3)  //贪吃蛇的初始长度 //程序中用到的各种字符,以及它们的颜色和类型(以数字表示)
struct{char *ch;int color;char type;
}
charBorder = {"□", 4, 1},  //边框
charBg = {"■", 2, 2},  //背景
charSnake = {"★", 0xe, 3},  //贪吃蛇节点
charFood = {"●", 0xc, 4};  //食物//用一个结构体数组保存地图中的各个点
struct{char type;int index;
}globalMap[MAXWIDTH][MAXHEIGHT];//贪吃蛇有效活动范围地图的索引
struct{int x;int y;
} snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ], scoresPostion;int scores = 0;  //得分
int snakeMapLen = (MAXWIDTH-2)*(MAXHEIGHT-2);
int headerIndex, tailIndex;  //蛇头蛇尾对应的snakeMap中的索引(下标)
HANDLE hStdin;  //控制台句柄// 设置光标位置,x为行,y为列
void setPosition(int x, int y){COORD coord;coord.X = 2*y;coord.Y = x;SetConsoleCursorPosition(hStdin, coord);
}// 设置颜色
void setColor(int color){SetConsoleTextAttribute(hStdin, color);
}//创建食物
void createFood(){int index, rang, x, y;//产生随机数,确定 snakeMap 数组的索引 srand((unsigned)time(NULL));if(tailIndex<headerIndex){rang = headerIndex-tailIndex-1;index = rand()%rang + tailIndex + 1;}else{rang = snakeMapLen - (tailIndex - headerIndex+1);index = rand()%rang;if(index>=headerIndex){index += (tailIndex-headerIndex+1);}}x = snakeMap[index].x;y = snakeMap[index].y;setPosition(x, y);setColor(charFood.color);printf("%s", charFood.ch);globalMap[x][y].type=charFood.type;
}//死掉
void die(){int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;setPosition(xCenter, yCenter-5);setColor(0xC);printf("You die! Game Over!");getch();exit(0);
}// 蛇移动
void move(char direction){int newHeaderX, newHeaderY;  //新蛇头的坐标int newHeaderPreIndex;  //新蛇头坐标以前对应的索引int newHeaderPreX, newHeaderPreY;  //新蛇头的索引以前对应的坐标int newHeaderPreType;  //新蛇头以前的类型int oldTailX, oldTailY;  //老蛇尾坐标// -----------------------------------------------//新蛇头的坐标switch(direction){case 'w':newHeaderX = snakeMap[headerIndex].x-1;newHeaderY = snakeMap[headerIndex].y;break;case 's':newHeaderX = snakeMap[headerIndex].x+1;newHeaderY = snakeMap[headerIndex].y;break;case 'a':newHeaderX = snakeMap[headerIndex].x;newHeaderY = snakeMap[headerIndex].y-1;break;case 'd':newHeaderX = snakeMap[headerIndex].x;newHeaderY = snakeMap[headerIndex].y+1;break;}//新蛇头的索引headerIndex = headerIndex==0 ? snakeMapLen-1 : headerIndex-1;// -----------------------------------------------//新蛇头坐标以前对应的索引newHeaderPreIndex = globalMap[newHeaderX][newHeaderY].index;//新蛇头的索引以前对应的坐标newHeaderPreX = snakeMap[headerIndex].x;newHeaderPreY = snakeMap[headerIndex].y;//双向绑定新蛇头索引与坐标的对应关系snakeMap[headerIndex].x = newHeaderX;snakeMap[headerIndex].y = newHeaderY;globalMap[newHeaderX][newHeaderY].index = headerIndex;//双向绑定以前的索引与坐标的对应关系snakeMap[newHeaderPreIndex].x = newHeaderPreX;snakeMap[newHeaderPreIndex].y = newHeaderPreY;globalMap[newHeaderPreX][newHeaderPreY].index = newHeaderPreIndex;//新蛇头以前的类型newHeaderPreType = globalMap[newHeaderX][newHeaderY].type;//设置新蛇头类型globalMap[newHeaderX][newHeaderY].type = charSnake.type;// 判断是否出界或撞到自己if(newHeaderPreType==charBorder.type || newHeaderPreType==charSnake.type ){die();}//输出新蛇头setPosition(newHeaderX, newHeaderY);setColor(charSnake.color);printf("%s", charSnake.ch);//判断是否吃到食物if(newHeaderPreType==charFood.type){  //吃到食物createFood();//更改分数setPosition(scoresPostion.x, scoresPostion.y);printf("%d", ++scores);}else{//老蛇尾坐标oldTailX = snakeMap[tailIndex].x;oldTailY = snakeMap[tailIndex].y;//删除蛇尾setPosition(oldTailX, oldTailY);setColor(charBg.color);printf("%s", charBg.ch);globalMap[oldTailX][oldTailY].type = charBg.type;tailIndex = (tailIndex==0) ? snakeMapLen-1 : tailIndex-1;}
}//下次移动的方向
char nextDirection(char ch, char directionOld){int sum = ch+directionOld;ch = tolower(ch);if( (ch=='w' || ch=='a' || ch=='s' || ch=='d') && sum!=197 && sum!=234 ){return ch;}else{return directionOld;}
}//暂停
char pause(){return getch();
}// 初始化
void init(){// 设置相关变量 int x, y, i, index;int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;CONSOLE_CURSOR_INFO cci;  //控制台光标信息//判断相关设置是否合理if(MAXWIDTH<16){printf("'MAXWIDTH' is too small!");getch();exit(0);}//设置窗口大小 system("mode con: cols=96 lines=32");//隐藏光标hStdin = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleCursorInfo(hStdin, &cci);cci.bVisible = 0;SetConsoleCursorInfo(hStdin, &cci);//打印背景 for(x=0; x<MAXHEIGHT; x++){for(y=0; y<MAXWIDTH; y++){if(y==0 || y==MAXWIDTH-1 || x==0 || x==MAXHEIGHT-1){globalMap[x][y].type = charBorder.type;setColor(charBorder.color);printf("%s", charBorder.ch);}else{index = (x-1)*(MAXWIDTH-2)+(y-1);snakeMap[index].x= x;snakeMap[index].y= y;globalMap[x][y].type = charBg.type;globalMap[x][y].index = index;setColor(charBg.color);printf("%s", charBg.ch);}}printf("\n");}//初始化贪吃蛇globalMap[xCenter][yCenter-1].type = globalMap[xCenter][yCenter].type = globalMap[xCenter][yCenter+1].type = charSnake.type;headerIndex = (xCenter-1)*(MAXWIDTH-2)+(yCenter-1) - 1;tailIndex = headerIndex+2;setPosition(xCenter, yCenter-1);setColor(charSnake.color);for(y = yCenter-1; y<=yCenter+1; y++){printf("%s", charSnake.ch);}//生成食物createFood();//设置程序信息setPosition(xCenter-1, MAXWIDTH+2);printf("   Apples : 0");setPosition(xCenter, MAXWIDTH+2);printf("   Author : xiao p");setPosition(xCenter+1, MAXWIDTH+2);printf("Copyright : c.biancheng.net");scoresPostion.x = xCenter-1;scoresPostion.y = MAXWIDTH+8;
}int main(){char charInput, direction = 'a';init();charInput = tolower(getch());direction = nextDirection(charInput, direction);while(1){if(kbhit()){charInput = tolower(getch());if(charInput == ' '){charInput = pause();}direction = nextDirection(charInput, direction);}move(direction);Sleep(500);}getch();return 0;
}​

【操作过程】

编译运行后,先按enter键使游戏开始,然后w,s a d 分别控制上下左右移动

【运行展示】

 


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

相关文章

C语言之贪吃蛇游戏源码

贪吃蛇游戏是我编程以来做的第一个游戏&#xff0c;很兴奋&#xff0c;我记得当时我一直最求代码数量的最小化&#xff0c;即以最少的代码实现功能&#xff0c;有的时候&#xff0c;对换行、括号之类的都下手&#xff0c;呵呵&#xff0c;现在想想都想笑&#xff0c;那些年让我…

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

文章目录 前引头文件注释部分头文件部分主函数部分实现效果 前引 这个贪吃蛇是在我学完C语言的基本部分 在跟着哈工大的c语言程序设计Mooc课程完了之后做的 因为学完C语言很迷茫 不晓得应该学什么 学校里面的题库感觉刷起来又没有实际我能看到的东西 我认为在阶段性的学习过程中…

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 内部逻辑控制单元进行初始…