C语言入门项目篇:贪吃蛇(完整代码+详细注释)

article/2025/10/23 10:54:13

C语言入门项目篇:贪吃蛇

可直接运行。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
/*大一上的时候C语言入门学的一个小游戏。还是挺有意思的,有兴趣的同学可以继续优化下:比如蛇头碰到蛇身就判定为输 /给蛇身加点颜色等。
*/
//1.2食物结构体
#define MAPHEIGHT 25
#define MAPWIDTH 60
#define SNAKESIZE 50  //蛇的最大节数
struct FOOD
{int x;int y;
}food;#define SNAKESIZE 50  //蛇的最大节数
struct
{ //每一节蛇的坐标int x[SNAKESIZE];int y[SNAKESIZE];int len; //蛇长int speed; //
}snake;
///全局变量
int key='w';//初始化移动方向
int changFlag = 0;//蛇变化标记
//模块化设计
//
//1.画地图
void gotoxy(int x,int y); //实现的函数声明
void drawMap();
void createFood();
int snakeStatus();
void drawMap(){srand((unsigned)time(NULL)); //随机函数种子//1.圈地//1.1 左右边框for(int i=0;i<=MAPHEIGHT;i++){gotoxy(0,i);printf("■");gotoxy(MAPWIDTH,i);printf("■");}for(int i=0;i<=MAPWIDTH;i+=2) //上下  ■占用两个字符{gotoxy(i,0);printf("■");gotoxy(i,MAPHEIGHT);printf("■");}//2.画蛇  ■//2.1确定蛇的属性snake.len=3;snake.speed =100;snake.x[0]=MAPWIDTH/2;  //开始蛇头放屏幕中间snake.y[0]=MAPHEIGHT/2;//2.2画蛇头gotoxy(snake.x[0],snake.y[0]);printf("■"); //一节 x=2//画身体for(int k =1;k<snake.len;k++){snake.x[k]=snake.x[k-1]+2;snake.y[k]=snake.y[k-1];gotoxy(snake.x[k],snake.y[k]);printf("■");}//3.画食物  ● //3.1确定坐标food.x=rand()%(MAPWIDTH-4)+2;  //边框的宽度是2 占用两个字符 两边边框就是4food.y=rand()%(MAPHEIGHT-2)+1;  //上下各占一个if(food.x%2!=0){food.x=food.x+1;}//3.2 画出来就可以gotoxy(food.x,food.y);printf("●");}
//2.food
void createFood()
{//蛇头坐标等于食物坐标,就是吃了if(snake.x[0]==food.x && snake.y[0]==food.y){srand((unsigned int)time(NULL));//产生的食物不能在蛇的身上,并且坐标要是偶数 因为蛇头的宽度是偶数while(1){int flag=1;food.x=rand()%(MAPWIDTH-4)+2;food.y=rand()%(MAPHEIGHT-2)+1;//产生的食物不能在蛇身上for(int k=0;k<snake.len;k++){if(snake.x[k]==food.x&&snake.y[k]==food.y){flag = 0; //不合适的标志break;}}if(flag&&food.x%2==0){break;}}gotoxy(food.x,food.y);//产生新的食物printf("●");snake.len++;changFlag =1;//蛇的标记是1}
//gotoxy(food.x,food.y);//产生新的食物// printf("●");}
void keyDown() //3.按键操作
{
//无按键的处理 原方向
if(_kbhit())
{//有按键fflush(stdin);key=_getch();
}
//擦除
if(!changFlag)
{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];}
//移动方向的处理
switch(key)
{
case 'W': //往上走 y--
case 'w':snake.y[0]--;break;
case 'S':
case 's':snake.y[0]++;break;
case 'A':
case 'a':snake.x[0]-=2;break;
case 'd':
case 'D':snake.x[0]+=2;break;}//画蛇头gotoxy(snake.x[0],snake.y[0]);printf("■");changFlag=0;gotoxy(MAPHEIGHT+2,0); //移动不能一直看着光标
}
int snakeStatus()  //4.蛇的状态:判断是否结束游戏
{
if (snake.x[0]==0||snake.x[0]==MAPWIDTH||snake.y[0]==0||snake.y[0]==MAPHEIGHT){return 0;//蛇头不能撞自己for(int k=1;k<snake.len;k++){if(snake.x[0]== snake.x[k]&& snake.y[k]==snake.y[0])return 0;}}
return 1;
}
void gotoxy(int x,int y) //5.光标移动
{//调用win32 API去设置控制台的光标位置//1.找到控制台的这个窗口HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//2.光标的结构体COORD coord;//3.设置光标coord.X =x;coord.Y =y;//4.同步到控制台  Set Console Cursor PositionSetConsoleCursorPosition(handle,coord);
}int main(){drawMap();while(1){createFood();Sleep(snake.speed);//延时keyDown();if(!snakeStatus()){break;}}gotoxy(MAPWIDTH/2,MAPHEIGHT/2);printf("You lose!");system("pause"); //return 0;
}

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

相关文章

完整!贪吃蛇游戏c语言代码分享(包括界面,计数,提示)

最近看到身边有些朋友抱怨&#xff0c;网上的贪吃蛇项目完整源码太少&#xff0c;或者说运行不了&#xff0c;甚至还有花钱购买的情况&#xff0c;作为你们的过来人&#xff0c;学长了解你们期末考试的苦&#xff0c;今天的博客我就不啰嗦&#xff0c;我直接放代码给你们。 所有…

C7-如何学好C语言

1&#xff1a;必须实践--敲代码 2&#xff1a;画图理解--内存布局 3&#xff1a;调试&#xff01;调试&#xff01; 课本推荐&#xff1a;

学好C语言从关键字开始

目录 1、C语言数据类型 2、变量的命名规则 3、最冤枉的关键字——sizeof 4、signed和unsigned 原、反、补 深入理解变量内容的存入和取出 大小端 1、C语言数据类型 在学习C语言数据类型之前&#xff0c;我们得先了解&#xff1a;为什么要有类型&#xff1f; 类型为什…

【c语言】如何学好c语言?c语言应该怎么去学?

大家好&#xff0c;我是想要慢慢变得优秀的向阳同学&#xff0c;谢谢大家的支持&#xff01;让我这个菜鸟博主可以有非常开心的收获1000的浏览量和200的粉丝&#xff01;我也会不断努力去持续分享一下高质量的博客内容的&#xff01;再次感谢大家的支持&#xff01;如果觉得我的…

python open函数编码_python中的open函数如何编码?

python中的open函数可以通过在打开文件时添加encoding参数来指定使用的编码方式&#xff0c;encoding表示的是返回的数据采用何种编码。 open()的函数原型&#xff1a;open(file, mode‘r, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue) 从官方文档中我…

open函数和 write函数

问题 Python内置多种函数与第三方库&#xff0c;本文对python中的open()函数和 write函数进行简单的讲解。 方法 open()函数 open()函数用于创建或打开指定文件&#xff0c;该函数的常用语法格式: open(name[,mode[,buffering]]) name : 要创建或打开文件的文件名称&#xff0c…

python open函数用法_Python使用open函数打开文件的常用模式

python 中open()的用法? open("/path/to/my/image.png", "rb") 中的‘rb’代表了什么意思?所有试图感动你而做的事,最终都只感动了小编自己。 r表示只读,b表示二进制 与此对应的是w表示可写,t表示文本方式打开。 再增加一些官方的解释: >>>…

linux中open函数详解

1、open函数 包含头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> open函数有两个参数和三个参数 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); Pathname:要打开的文件名…

python open函数默认路径_Python open函数打开文件路径

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符,标示符r表示读。 >>> f = open(D:/test.txt,r) 注意了,对初学python的同学而言,open()函数着实存在一个不大不小的坑,而且十分不容易发现。 错误演示: >>> f = open…

linux open详解,Linux系统open函数详解

Linux系统中open函数主要作用就是打开和创建文件,可以根据参数来定制我们需要的文件的属性和用户权限等各种参数,下面良许教程网为大家分享一下Linux系统open函数具体使用方法。 一、open函数用来干什么 open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定…

第9.2节 Python的文件打开函数open详解

一、 引言 在操作一个文件前&#xff0c;大部分情况需要先打开文件&#xff0c;才能进行&#xff0c;在Python中使用内置函数open来打开一个文件。open函数是Python的一个内置函数&#xff0c;io模块 定义的函数open是该内置函数的同义词&#xff08;这是Python官网中关于io.op…

Python open 函数

open 函数语法 open() 函数的作用是打开一个文件,并返回一个 file对象(即文件对象)。 open 是一个动作,可以理解为我们打开文档的点击动作。 file 对象是一个实物,可以理解为我们打开的具体文档,例如记事本、表格、Word 或其他具体的文档。 open() 函数的语法为: f =…

Linux 文件IO学习之open函数深入了解

open()函数是在学习文件IO中的第一个函数。作用是打开一个文件&#xff0c;或者创建出一个文件。 需要注意的是&#xff0c;能实现这样功能的函数其实有两套&#xff0c;一个是系统IO所提供的open()函数&#xff0c;一个是标准IO提供的fopen()函数。(二者对比放在最后) 先看看…

Python open函数详解

演示环境&#xff0c;操作系统&#xff1a;Win10 21H2&#xff08;64bit&#xff09;&#xff1b;Python解释器&#xff1a;3.8.10。 open是Python的一个内置函数&#xff0c;一般用于本地文件的读写操作。用法如下。 my_file open(file, mode, buffering, encoding, errors…

sql去重查询

背景&#xff1a; 项目有消息推送&#xff0c;根据消息推送记录&#xff0c;筛选出一共有哪几种消息类型&#xff0c;并且标题和文本是什么 表部分结构如图&#xff1a; 主要是根据subject来去重所有数据&#xff0c;难点是&#xff0c;使用distinct的话&#xff0c;无法显示…

sql 去重查询 distinct

sql 去重查询 select Distinct UserId,Name from UserInfo where UserType1 介绍 distinct一般是用来去除查询结果中的重复记录的&#xff0c;而且这个语句在select、insert、delete和update中只可以在select中使用&#xff0c; 具体的语法如下&#xff1a; select distinc…

SQL去重的三种方法

目录 1.distinct去重 2.group by去重 3.row_number() over (parttion by 分组列 order by 排序列) 有这么一张test的表, 我们将对这张表进行操作来自验证去重 这里的去重&#xff1a;查询的时候, 不显示重复&#xff0c;并不是删除表中的重复项 1.distinct去重 只能一列去…

SQL去重方法汇总

更多教程请到友情连接&#xff1a; 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.cn 兴化论坛http://www.yimoge.cn 电白论坛 http://www.fcdzs.com 在使用SQL提数的时候&#xff0c;常会遇到表内有重复值的时候&…

SQL中去除重复数据的几种方法,我一次性都告诉你​

使用SQL对数据进行提取和分析时&#xff0c;我们经常会遇到数据重复的场景&#xff0c;需要我们对数据进行去重后分析。 以某电商公司的销售报表为例&#xff0c;常见的去重方法我们用到distinct 或者group by 语句&#xff0c; 今天介绍一种新的方法&#xff0c;利用窗口函数对…

SQL:数据去重的三种方法

1、使用distinct去重 distinct用来查询不重复记录的条数&#xff0c;用count(distinct id)来返回不重复字段的条数。用法注意&#xff1a; distinct【查询字段】&#xff0c;必须放在要查询字段的开头&#xff0c;即放在第一个参数&#xff1b;只能在SELECT 语句中使用&#…