#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"winmm.lib")
struct snake{
int len; //蛇的长度
int speed; //速度
int x[100]; //x坐标
int y[100]; //y坐标
}snake;
struct food{
int x;
int y;
}food;
int flag=0;
int dir; //蛇运动的方向
int score=0; //得分
void printa(); //打印出游戏界面并初始化简单模式
void printb(); //打印出游戏界面并初始化中等模式
void printc(); //打印出游戏界面并初始化困难模式
void gotoxy(int x,int y); // 光标跳转,行y,列x
void move(); //蛇的移动加键盘输入
bool live(); //判断游戏是否结束
void creatfooda(); //随机生成食物简单模式
void creatfoodb(); //随机生成食物中等模式
void creatfoodc(); //随机生成食物困难模式
void welcome(); //显示欢迎界面
void over(); //显示结束界面
void sign(); //提示
void easy(); //简单模式
void middle(); //中等模式
void difficult(); //困难模式
void color(short x); //自定义函根据参数改变颜色
void explain(); //游戏说明
int main()
{
//mciSendString();
int a;
char c[10];
SetConsoleTitle("贪吃蛇--C语言版");
welcome();
gotoxy(29,27);
color(3) ;
printf("请选择[1 2 3]:[ ]\b\b"); //\b为退格,使得光标处于[]中间
scanf("%d",&a);
system("color 0E"); // 设置控制台字体颜色--紫色
switch(a)
{
case 1:
system("cls");
easy();
break;
case 2:
system("cls");
middle();
break;
case 3:
system("cls");
difficult();
break;
case 4:
system("cls");
explain();
break;
}
system("cls");
system("color 0F"); // 设置控制台字体颜色--黄色
over();
gotoxy(34,7);
printf("是否继续游戏?y重新开始,其余键退出游戏[ ]\b\b");
scanf("%s",&c);
if(strcmp(c,"y")==0)
{
system("cls");
main();
}
return 0;
}
void color(short x) //自定义函根据参数改变颜色
{
if(x>=0 && x<=15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void explain()
{
int i,j;
gotoxy(43,6);
color(11);
printf("游 戏 说 明");
color(14) ;
//黄色边框
for(i=10;i<=15;i++) //输出上下边框---
{
for (j = 27; j <= 84; j++) //输出左右边框 :
{
gotoxy(j,i);
if(i==10||i==15)
{
printf("-");
}
else if(j==27||j==84)
{
printf("|");
}
}
}
gotoxy(28,11);
printf("简单模式:初始速度为400,每吃一个食物,速度-5,得分+10");
gotoxy(28,12);
printf("简单模式:初始速度为300,每吃一个食物,速度-10,得分+20");
gotoxy(28,13);
printf("简单模式:初始速度为200,每吃一个食物,速度-20,得分+40");
gotoxy(28,14);
printf("w a s d可实现上左下右移动,q可实现暂停/开始功能");
gotoxy(43,16);
printf("按y键返回主菜单[ ]\b\b");
char c[10];
scanf("%s",&c);
if(strcmp(c,"y")==0)
{
system("cls");
main();
}
}
void easy()
{
printa();
while(1)
{
move();
if(!live())
break;
creatfooda();
Sleep(snake.speed);
sign();
}
}
void middle()
{
printb();
while(1)
{
move();
if(!live())
break;
creatfoodb();
Sleep(snake.speed);
sign();
}
}
void difficult()
{
printc();
while(1)
{
move();
if(!live())
break;
creatfoodc();
Sleep(snake.speed);
sign();
}
}
void welcome()
{
color(2); //绿色
gotoxy(0,0);
printf("★");
color(3); //蓝色
gotoxy(5,5);
printf("★");
color(4);
gotoxy(12,7); //红色
printf("★");
color(5);
gotoxy(15,2); //紫色
printf("★");
color(6);
gotoxy(22,10); //黄色
printf("★");
color(7);
gotoxy(80,13); //白色
printf("★");
color(8);
gotoxy(60,4); //白色
printf("★");
color(9);
gotoxy(70,8); //白色
printf("★");
color(10);
gotoxy(75,13); //白色
printf("★");
color(11);
gotoxy(68,2); //白色
printf("★");
color(12);
gotoxy(20,15); //白色
printf("★");
color(3);
gotoxy(30,17); //白色
printf("★");
color(4);
gotoxy(90,19); //白色
printf("★");
color(5);
gotoxy(100,11); //白色
printf("★");
color(6);
gotoxy(18,20); //白色
printf("★");
color(7);
gotoxy(104,21); //白色
printf("★");
color(1);
gotoxy(96,22); //白色
printf("★");
color(9);
gotoxy(88,24); //白色
printf("★");
color(2);
gotoxy(89,16); //白色
printf("★");
color(0); //绿色
gotoxy(10,5);
printf("★");
color(3); //蓝色
gotoxy(22,12);
printf("★");
color(4);
gotoxy(32,14); //红色
printf("★");
color(5);
gotoxy(35,17); //紫色
printf("★");
color(6);
gotoxy(12,18); //黄色
printf("★");
color(7);
gotoxy(100,3); //白色
printf("★");
color(8);
gotoxy(90,4); //白色
printf("★");
color(9);
gotoxy(85,6); //白色
printf("★");
color(10);
gotoxy(95,7); //白色
printf("★");
gotoxy(42,4);
printf("_______/");
gotoxy(41,4);
color(2);
printf("|");
gotoxy(53,4);
color(10);
printf("\\");
gotoxy(42,5);
color(2);
printf("\\______") ;//蛇嘴
gotoxy(54, 5);
color(10);
printf("\\");
gotoxy(49,6) ;
gotoxy(45,1);
color(6) ;
printf("/^\\/^\\");//蛇眼睛
gotoxy(44,2);
printf("|__| 0|");//蛇眼睛
gotoxy(43,2);
color(2);
printf("_");
gotoxy(35,3) ;
color(12) ;
printf("\\/");//蛇信
gotoxy(41,3);
color(2);
printf("/");
gotoxy(47,3);
color(6) ;
printf(" \\_/");//蛇眼睛
gotoxy(51,3);
color(10);
printf(" \\");
gotoxy(36,4);
color(12);
printf("\\____");//舌头
gotoxy(42,4);
printf("_______/");
printf("| | "); //下面都是画蛇身
gotoxy(48,7);
printf("/ / \\");
gotoxy(47,8) ;
printf("/ / \\ \\");
gotoxy(45,9) ;
printf("/ / \\ \\");
gotoxy(44,10) ;
printf("/ / \\ \\");
gotoxy(43,11);
printf("/ / _---_ \\ \\");
gotoxy(42,12);
printf("/ / _-` `-_ | |");
gotoxy(41,13);
printf("( ( _-` _--_ `-_ _/ |");
gotoxy(42,14);
printf("\\ `-___-` _-` `-_ `-_-` /");
gotoxy(43,15);
printf("`-_ _-` `-_ _-`");
gotoxy(45,16);
printf("`--_____-` `-___-`");
int n;
int i,j =1;
gotoxy(53,18);
color(11) ;
printf("贪 吃 蛇 大 作 战");
color(14) ;
//黄色边框
for(i=20;i<=26;i++) //输出上下边框---
{
for (j = 37; j <= 84; j++) //输出左右边框 :
{
gotoxy(j,i);
if(i==20||i==26)
{
printf("-");
}
else if(j==37||j==84)
{
printf("|");
}
}
}
color(12);
gotoxy(45,22) ;
printf("1.简单模式") ;
gotoxy(65,22);
printf("2.中等模式") ;
gotoxy(45,24) ;
printf("3.困难模式") ;
gotoxy(65,24);
printf("4.游戏说明") ;
}
void over()
{
gotoxy(40,1);
printf("制作人:盛晓");
gotoxy(40,3);
printf("Game Over!");
gotoxy(40,4);
printf("分数为:%d",score);
}
void gotoxy(int x, int y)
{ // 更新光标位置
COORD pos;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hOutput, pos);
// 隐藏光标
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
SetConsoleCursorInfo(hOutput, &cursor);
}
void printa()
{
int i,j;
//打印边框
for(i=0;i<=98;i=i+2) //打印上下边框
{
gotoxy(i,0);
printf("■");
gotoxy(i,19);
printf("■");
}
for(i=1;i<19;i++) //打印左右边框
{
gotoxy(0,i);
printf("■");
gotoxy(98,i);
printf("■");
}
//食物初始化
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19- 2) + 1; //生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致 //会导致吃食物的时候只吃到一半
if (food.x % 2 == 0)
break;
} //将光标移到食物的坐标处打印食物
gotoxy(food.x, food.y);
printf("★");
dir=0; //蛇的方向初始化为向上
snake.len=3; //蛇长
snake.speed=400; //初始速度
//蛇头初始化(位于地图中央)
snake.x[0]=98/2+1; //必须是偶数
snake.y[0]=19/2;
gotoxy( snake.x[0],snake.y[0]);
printf("■");
//打印出蛇身
for(int i=1;i
snake.x[i]=snake.x[i-1]+2;
snake.y[i]=snake.y[0];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
}
void printb()
{
int i,j;
//打印边框
for(i=0;i<=98;i=i+2) //打印上下边框
{
gotoxy(i,0);
printf("■");
gotoxy(i,19);
printf("■");
}
for(i=1;i<19;i++) //打印左右边框
{
gotoxy(0,i);
printf("■");
gotoxy(98,i);
printf("■");
}
//食物初始化
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19- 2) + 1; //生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致 //会导致吃食物的时候只吃到一半
if (food.x % 2 == 0)
break;
} //将光标移到食物的坐标处打印食物
gotoxy(food.x, food.y);
printf("★");
dir=0; //蛇的方向初始化为向上
snake.len=3; //蛇长
snake.speed=300; //初始速度
//蛇头初始化(位于地图中央)
snake.x[0]=98/2+1; //必须是偶数
snake.y[0]=19/2;
gotoxy( snake.x[0],snake.y[0]);
printf("■");
//打印出蛇身
for(int i=1;i
snake.x[i]=snake.x[i-1]+2;
snake.y[i]=snake.y[0];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
}
void printc()
{
int i,j;
//打印边框
for(i=0;i<=98;i=i+2) //打印上下边框
{
gotoxy(i,0);
printf("■");
gotoxy(i,19);
printf("■");
}
for(i=1;i<19;i++) //打印左右边框
{
gotoxy(0,i);
printf("■");
gotoxy(98,i);
printf("■");
}
//食物初始化
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19- 2) + 1; //生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致 //会导致吃食物的时候只吃到一半
if (food.x % 2 == 0)
break;
} //将光标移到食物的坐标处打印食物
gotoxy(food.x, food.y);
printf("★");
dir=0; //蛇的方向初始化为向上
snake.len=3; //蛇长
snake.speed=200; //初始速度
//蛇头初始化(位于地图中央)
snake.x[0]=98/2+1; //必须是偶数
snake.y[0]=19/2;
gotoxy( snake.x[0],snake.y[0]);
printf("■");
//打印出蛇身
for(int i=1;i
snake.x[i]=snake.x[i-1]+2;
snake.y[i]=snake.y[0];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
}
void move()
{
if(kbhit()!=0) //如果有键盘输入
{
char c;
c=getch(); //输入
switch(c)
{
case'w': //上0
if(dir!=1)
dir=0;
break;
case's': //下1
if(dir!=0)
dir=1;
break;
case'a': //左2
if(dir!=3)
dir=2;
break;
case'd': //右3
if(dir!=2)
dir=3;
break;
case'q':
system("pause"); //暂停
break;
}
}
//没吃到食物移动时去尾
if(flag==0)
{
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(dir)
{
case 0:
snake.y[0]--;
break;
case 1:
snake.y[0]++;
break;
case 2:
snake.x[0]-=2;
break;
case 3:
snake.x[0]+=2;
break;
}
//打印出蛇头
gotoxy(snake.x[0],snake.y[0]);
//由于目前没有吃到食物,flag值为0
printf("■");
flag=0;
}
bool live()
{
//撞到上下边框
if(snake.y[0]==0||snake.y[0]==19)
{
return false;
}
//撞到左右边框
if(snake.x[0]==0||snake.x[0]==98)
{
return false;
}
//蛇头撞到蛇尾
for(int i=1;i
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
return false;
}
}
return true;
}
/*
随机生成食物
1.不能生成在蛇身上
2.生成食物的x坐标必须是偶数
3.生成食物不能超出边框范围
*/
void creatfooda()
{
//蛇头碰到食物
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{
//重新生成食物
while(1)
{
int ff=1; //判断是否可以生成食物
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19-2) + 1;
//不能生成在蛇身上
for(int i=0;i
if(snake.x[i]==food.x&&snake.y[i]==food.y)
{
ff=0;
break;
}
}
//生成食物的x坐标必须是偶数
if(ff&&food.x%2==0)
break;
}
//打印食物
gotoxy(food.x,food.y);
printf("★");
snake.len++; //蛇身长度+1
score+= 10;//每个食物得10分
snake.speed -=10;//随着吃的食物越来越多,速度会越来越快
flag=1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果
}
}
void creatfoodb()
{
//蛇头碰到食物
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{
//重新生成食物
while(1)
{
int ff=1; //判断是否可以生成食物
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19-2) + 1;
//不能生成在蛇身上
for(int i=0;i
if(snake.x[i]==food.x&&snake.y[i]==food.y)
{
ff=0;
break;
}
}
//生成食物的x坐标必须是偶数
if(ff&&food.x%2==0)
break;
}
//打印食物
gotoxy(food.x,food.y);
printf("★");
snake.len++; //蛇身长度+1
score+=20;//每个食物得10分
snake.speed -=20;//随着吃的食物越来越多,速度会越来越快
flag=1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果
}
}
void creatfoodc()
{
//蛇头碰到食物
if(snake.x[0]==food.x&&snake.y[0]==food.y)
{
//重新生成食物
while(1)
{
int ff=1; //判断是否可以生成食物
srand((unsigned int)time(NULL));
food.x = rand() % (98-4) + 2;
food.y = rand() % (19-2) + 1;
//不能生成在蛇身上
for(int i=0;i
if(snake.x[i]==food.x&&snake.y[i]==food.y)
{
ff=0;
break;
}
}
//生成食物的x坐标必须是偶数
if(ff&&food.x%2==0)
break;
}
//打印食物
gotoxy(food.x,food.y);
printf("★");
snake.len++; //蛇身长度+1
score+=40;//每个食物得10分
snake.speed -=30;//随着吃的食物越来越多,速度会越来越快
flag=1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果
}
}
void sign()
{
color(3); //蓝色
gotoxy(105,5);
printf("得分:%d",score);
gotoxy(105,7);
printf("速度:%d",snake.speed);
gotoxy(105,9);
printf("移动:");
gotoxy(107,10);
printf("w");
gotoxy(105,11);
printf("a s d");
gotoxy(105,13);
printf("暂停/开始:");
gotoxy(107,14);
printf("q");
gotoxy(104,20);
}