贪吃蛇游戏--C语言版

#include
#include
#include //windows编程头文件
#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);
}

贪吃蛇游戏--C语言版_第1张图片

 

你可能感兴趣的:(小游戏,游戏程序)