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

/*数据设计*/
#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 美是初见__

相关文章: