C语言-贪吃蛇

本人学生党一个,也是一个热爱编程的小码农(嘻嘻!),经过3天的打造写好了自己的一个贪吃蛇小游戏(C语言版),之前也写过Javascript版的,如果你要是一个爱好编程的小伙伴,就一起学习吧!(祝大家愚人节快乐!)
在这里插入图片描述

/*数据设计*/
#include <stdio.h>
#include <string.h>
#include <windows.h>//光标设置的API
#include <time.h>//食物随机
#include <conio.h>//按钮监控

#define MAXHEIGHT 25//窗口最大宽
#define MAXWIDTH  60//窗口最大高
#define SNAKESIZE 50//蛇的最大节数
//蛇结构
struct{
	int x;
	int y;
}food;
//蛇的结构
struct{
	//记录每一节蛇的坐标
	int x[SNAKESIZE];
	int y[SNAKESIZE];
	int len;//蛇的长度
	int sleep;//蛇的移动速度
}snake;
//全局变量
int i,k,foods=0,totals=0;
int key = 'A';//初始化蛇的移动方向
int changeFlag = 0;//蛇的变化标记
/*模块设计(功能设计)*/
//开始欢迎界面
void welcom();
//计分函数
void total();
//1.地图生成
void drawMap();
//2.蛇的产生
void createFood();
//3.按键操作
void keyDown();
//4.蛇的状态(判断游戏是否结束)
int snakeStatus();
//5.辅助函数(光标的移动)
void gotoxy(int x,int y);

//主函数
void main(){
	system("mode con cols=100 lines=28");
	welcom();
	system("cls");
	drawMap();
	total();
	while(1){
		createFood();
		Sleep(snake.sleep);
		keyDown();
		if(!snakeStatus()){
			break;
		}
	}
	gotoxy(MAXWIDTH/2-2,MAXHEIGHT/2);
	printf("游戏结束\n");
	gotoxy(MAXWIDTH/2-6,MAXHEIGHT/2+1);
	system("pause");
}
//欢迎界面
void welcom(){
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2-4);
	printf("************************");
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2-2);
	printf("\t   美是初见");
	gotoxy(MAXWIDTH/2,MAXHEIGHT/2);
	printf("       支持正版,拒绝盗版!\n");
	gotoxy(MAXWIDTH/2,MAXHEIGHT/2+1);
	printf("       适当游戏,健康你我!\n");
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+2);
	printf("\t 微信Gen1273145688");
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+4);
	printf("         开始");
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+6);
	printf("************************");
	gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+3);
	printf("    ");
	system("pause");
}
//1.地图生成
void drawMap(){
	//蛇身:■ 食物:★
	srand((unsigned int)time(NULL));//随机函数
	//1.画地
	//左右地图边框
	for(i=0;i<=MAXHEIGHT;i++){
		gotoxy(0,i);
		printf("■");
		gotoxy(MAXWIDTH,i);
		printf("■");
	}
	//上下地图边框
	//■占用2个字符
	for(i=0;i<=MAXWIDTH;i+=2){
		gotoxy(i,0);
		printf("■");
		gotoxy(i,MAXHEIGHT);
		printf("■");
	}
	//2.画蛇
	snake.len = 3;//蛇的初始长度
	snake.sleep = 250;//蛇的移动速度
	//确定蛇的头部(在控制台中间)
	snake.x[0] = MAXWIDTH/2;
	snake.y[0] = MAXHEIGHT/2;
	//画蛇头
	gotoxy(snake.x[0],snake.y[0]);
	printf("■");
	//画蛇身
	for(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("■");//一节是x=2
	}
	//3.画食
	food.x = rand()%(MAXWIDTH-4)+2;//窗口的左右边框占2像素
	food.y = rand()%(MAXHEIGHT-2)+1;//窗口的上下边框占1像素
	gotoxy(food.x,food.y);
	printf("★");
}
//2.蛇的产生
void createFood(){
	//蛇吧食物吃了
	if(snake.x[0]==food.x&&snake.y[0]==food.y){
		srand((unsigned int)time(NULL));
		total();//计分
		//产生的食物不能在蛇的身上,并且坐标是偶数(蛇身占两个字节)
		while(1){
			int flag = 1;
			food.x = rand()%(MAXWIDTH-4)+2;
			food.y  =rand()%(MAXHEIGHT-2)+1;
			//产生的食物不能在蛇的身上
			for(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++;
	changeFlag = 1;//蛇的标记1
	}
}
//计分函数
void total(){
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-7);
	printf("美是初见");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-6);
	printf(" ");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-5);
	printf("*********************");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-4);
	printf("吃食物个数:%d个",foods++);
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-3);
	printf("总得分数为:%d分",totals+=10);
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-2);
	printf("*********************");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-1);
	printf("如果你要是编程爱好者!");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2);
	printf("那就加入我们吧!");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+1);
	printf("我们的承诺是:永久免费!");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+2);
	printf("认证微信Gen1273145688");
	gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+3);
	printf("*********************");
}
//3.按键操作
void keyDown(){
	//无按键的处理
	if(_kbhit()){
		fflush(stdin);//清除缓冲区
		key = _getch();//接收键盘按键
	}
	//擦除蛇的最后一节
	if(!changeFlag){
		gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
		printf("  ");//两个空格
	}
	//后面的蛇身变化
	for(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':
	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("■");
	changeFlag = 0;
	gotoxy(MAXHEIGHT+2,0);
}
//4.蛇的状态(判断游戏是否结束)
int snakeStatus(){
	if(snake.x[0]==0||snake.x[0]==MAXHEIGHT-2||snake.y[0]==0||snake.y[0]==MAXWIDTH-2){
		return 0;
	}
	for(k=1;k<snake.len;k++){
		if(snake.x[0]==snake.x[k]&&snake.y[k]==snake.y[0]){
			return 0;
		}
	}
	return 1;
}
//5.辅助函数(光标的移动)
void gotoxy(int x,int y){
	//调用win32 API 设置控制台的光标位置
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	//光标的结构体
	COORD coord={x,y};
	//设置坐标
	//coord.x = x;
	//coord.y = y;
	//同步到控制台Set Console Cursor Position
	SetConsoleCursorPosition(handle,coord);
}

==觉得好就收藏吧,记得双击,谢谢!==
												__2019/04/01 美是初见__
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值