公众号:编程驿站
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>//描述蛇的节点信息
typedef struct SnakeNode
{int x;int y;
} Snode;//箱子:放置蛇的所有节点
Snode snakes[100];
//保存用户选择的方向
char dir='l'; // u d l r
//保存食物
Snode food;
//蛇身有效长度
int size=5;
//速度
int speed=300;
//保存计分
int count=0;/**
自定义一个功能函数:给我一个坐标,我就能够把你定位
*/
void setPosition(int x,int y)
{COORD point;point.X=x;point.Y=y;//重置坐标SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}/**
显示友好的游戏界面
*/
void wellcome()
{setPosition(30,10);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);printf("欢迎来到贪吃蛇的世界!");setPosition(30,15);//暂停system("pause");//清屏createFoodsystem("cls");//输出操作提示setPosition(30,10);printf("使用向上、向下、向左、向右的方向键控制蛇的方向");setPosition(30,11);system("pause");system("cls");
}/*
功能模块:绘制围墙 1B=8bit A:1B 中文:2B
*/
void paintWall()
{int index=0;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);//上边。下边for(index=0; index<58; index=index+2){setPosition(index,0);printf("■");setPosition(index,26);printf("■");}//左边、右边akes[0].x=oldX+2;for(index=1; index<=26; index++){setPosition(0,index);printf("■");setPosition(56,index);printf("■");}srand(time(0));int x=rand()%54+2;int y=rand()%24+1;int l=4;for(index=0;index<l;index++){setPosition(x,y);printf("■");x=x+2;}
}/*检查新生成的食物的坐标是否和蛇身重合
*/
int isTogether(int x,int y)
{int index=0;for(index=0; index<size; index++){if(snakes[index].x==x && snakes[index].y==y){//重合return 1;}}//没有重合return 0;
}/*
创建食物
*/
void createFood()
{//随机数字//随机种子int randX=0;int randY=0;srand(time(0));//食物坐标随机randY=rand()%24+1;do{//只是能偶数randX=rand()%54+2;//检查是否和蛇身重合}while(!(randX%2==0 && isTogether(randX,randY)==0)) ;food.x=randX;food.y=randY;setPosition(food.x,food.y);printf("■");
}/*
显示蛇:节点 蛇头 5节点
*/
void initSnake()
{//蛇的节点起点位置int x=24;int y=5;int index=0;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);//输出5个节点for(index=0; index<size; index++, x=x+2){//设置节点的坐标snakes[index].x=x;snakes[index].y=y;setPosition(snakes[index].x,snakes[index].y);printf("■");}
}/*
清除蛇身图形
*/
void clearSnake()
{int index=0;for(index=0; index<size; index++){setPosition(snakes[index].x,snakes[index].y);printf(" ");}
}/*
解析用户的按键,改变方向值
*/
void selDir()
{if(GetAsyncKeyState(VK_UP) && dir!='d' ){dir='u';}else if(GetAsyncKeyState(VK_DOWN) && dir!='u' ){dir='d';}else if(GetAsyncKeyState(VK_LEFT) && dir!='r'){dir='l';}else if(GetAsyncKeyState(VK_RIGHT) && dir!='l'){dir='r';}
}/*
移动蛇
*/
void moveSnake()
{//蛇头的原来坐标int oldX=snakes[0].x;int oldY=snakes[0].y;//两个临时变量int tempX=0;int tempY=0;int index=0;//重置一个新坐标switch(dir){case 'u':snakes[0].x=oldX;snakes[0].y=oldY-1;break;case 'd':snakes[0].x=oldX;snakes[0].y=oldY+1;break;case 'l':snakes[0].x=oldX-2;snakes[0].y=oldY;break;case 'r':snakes[0].x=oldX+2;snakes[0].y=oldY;break;}//检查蛇头是否和食物重合if(snakes[0].x==food.x && snakes[0].y==food.y){size++;createFood();//计分count=count+20;setPosition(60,10);printf("当前计分%d",count);speed-=50;if(speed<100){speed=100;}}//检查蛇头是否碰到墙if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>25 ){//碰到墙system("cls");printf("gameover");system("pause");exit(0);}//自己吃自己for(index=1; index<size; index++){if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y){
//碰到墙system("cls");printf("gameover");system("pause");exit(0);}}setPosition(snakes[0].x,snakes[0].y);printf("■");//移动除了蛇头之外的节点for(index=1; index<size; index++){//在移动节点之前保存节点的坐标tempX=snakes[index].x;tempY=snakes[index].y;//重新指定新坐标,前一个节点留下的空白snakes[index].x=oldX;snakes[index].y=oldY;//指定光标点setPosition(snakes[index].x,snakes[index].y);printf("■");//重置原坐标oldX=tempX;oldY=tempY;}
}//主函数:语法结构(固定)运行时候,起点
int main()
{wellcome();//绘制围墙paintWall();initSnake();createFood();//清除蛇原来的图形while(1){selDir();clearSnake();moveSnake();Sleep(speed);}return 0;
}```