贪吃蛇游戏--C语言版

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows编程头文件
#include <time.h>
#include <conio.h>//控制台输入输出头文件
#include<string.h>
#include<mmsystem.h>
#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.len;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.len;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.len;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<snake.len;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<snake.len;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<snake.len;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<snake.len;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);
}

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用windows api 做的贪吃蛇 #include #include"resource.h" #include"Node.h" #include #include TCHAR szAppname[] = TEXT("Snack_eat"); #define SIDE (x_Client/80) #define x_Client 800 #define y_Client 800 #define X_MAX 800-20-SIDE //点x的范围 #define Y_MAX 800-60-SIDE //点y的范围 #define TIME_ID 1 #define SECOND 100 #define NUM_POINT 10 //点的总个数 #define ADD_SCORE 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; //窗口句柄 MSG msg; //消息 WNDCLASS wndclass; //窗口类 HACCEL hAccel;//加速键句柄 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口的水平和垂直尺寸被改变时,窗口被重绘 wndclass.lpfnWndProc = WndProc; //窗口过程为WndProc函数 wndclass.cbClsExtra = 0; //预留额外空间 wndclass.cbWndExtra = 0; //预留额外空间 wndclass.hInstance = hInstance; //应用程序的实例句柄,WinMain的第一个参数 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //设置图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //载入预定义的鼠标指针 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置画刷 wndclass.lpszMenuName = szAppname; //设置菜单 wndclass.lpszClassName = szAppname; //设置窗口类的名字 if (!RegisterClass(&wndclass))//注册窗口类 { MessageBox(NULL, TEXT("这个程序需要windows NT!"), szAppname, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppname, TEXT("Snack_eat"),//CreateWindow函数调用时,WndProc将受到WM_CREATE WS_OVERLAPPEDWINDOW&~WS_THICKFRAME& ~WS_MAXIMIZEBOX,//普通的层叠窗口&禁止改变大小&禁止最大化 CW_USEDEFAULT, //初始x坐标(默认) CW_USEDEFAULT, //初始y坐标 x_Client, //初始x方向尺寸 770 y_Client, //初始y方向尺寸 750 NULL, //父窗口句柄 NULL, //窗口菜单句柄 hInstance, //程序实例句柄 WinMain函数中第二个参数 NULL); //创建参数 ShowWindow(hwnd, iCmdShow);//显示窗口,iCmdShow是WinMain的第四个参数,决定窗口在屏幕中的初始化显示形式,例:SW_SHOWNORMAL表示正常显示 UpdateWindow(hwnd);//使窗口客户区重绘,通过向WndProc发送一条WM_PAINT消息而完成的 hAccel = LoadAccelerators(hInstance, szAppname);//加载加速键 while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }/* while (GetMessage(&msg, NULL, 0, 0))//GetMessage函数从消息队列中得到消息,填充msg。如果msg.message等于WM_QUIT,返回0,否则返回非0 { TranslateMessage(&msg);//将msg返回给windows已进行某些键盘消息的转换 DispatchMessage(&msg);//将msg再次返回给windows }*/ return msg.wParam;//msg.wParam是PostQuitMessage函数的参数值,通常是0 } ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值