C语言贪吃蛇(备注,源码都有)

贪吃蛇小游戏
实现的功能:
1、有背景音乐
2、可随机生成障碍物
3、随机生成食物
4、能够绘制地图
5、有多种游戏难度(蛇移动的速度不同)
6、可绘制地图
7、有特殊食物(吃了以后会加分,蛇身子不会变长)
8、双蛇作战(由于用的是单线程,操作会有很大延迟)
9、有草地(可隐身)

// 贪吃蛇.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include "iostream"
#pragma  comment(lib,"winmm.lib")

typedef struct COORDS {
    int xx;
    int yy;
} COORDS, *PCOORDS;

#define 上 1
#define 下 2
#define 左 3
#define 右 4
#define 保存 5
#define 退出 6
#define 草丛 -2

#define UP    10
#define DOWN  11
#define LEFT  12
#define RIGHT 13

#define MAP_X 30
#define MAP_Y 30

#define 空地   0
#define 食物   1
#define 障碍物 2 
#define  P1   3 
#define  P2   4
#define  奖品  5    // 特殊食物

COORD g_Snake[100]; //第一条蛇的长度数组
COORDS g2_Snake[100];  //第二条蛇的长度数组
int g_nlenth = 4;    //第一条蛇的长度
int g2_nlenth = 4;   //第二条蛇的长度
int g_Dir = 右;    //第一条蛇初始方向  右
int g2_Dir ;   //第二条蛇的初始方向 左
int g_Map[MAP_X][MAP_Y] = {};
int g_FoodExist = 0;   //基本食物
int g_Food = -1;   // 加分不加身子
int g_SFood = -2;    //对方加长度
int len = 0;
int len2 = 0;
int a = 200// 初始速度
int n = 1;   // 为下面做暂停定义的
int mem = 1;
#define KEY_DOWN(key) GetAsyncKeyState(key)==(SHORT)0x8001?1:0
#define MP mer.dwMousePosition

char ch;
int hp = 10;    //第一个蛇的生命
int hp2 = 10;   //第二个蛇的生命
using namespace std;
int waitKey(){
    if (_kbhit())                     //判断此用户是否按键,
        return _getch();                  //接受用户按键,并将按键返回
    return 0;                     //没有按键,返回0
}
int waitKey2(){
    if (_kbhit())                     //判断此用户是否按键,
        return _getch();                  //接受用户按键,并将按键返回
    return 0;                     //没有按键,返回0
}
/**********蛇的初始位置**************/
void InitGame()
{
    g_Snake[0].X = 10;
    g_Snake[0].Y = 3;
    g_Snake[1].X = 10;
    g_Snake[1].Y = 4;
    g_Snake[2].X = 10;
    g_Snake[2].Y = 5;
    g_Snake[3].X = 10;
    g_Snake[3].Y = 6;

    for (int i = 0; i < MAP_X; i++)
    {
        for (int j = 0; j < MAP_Y; j++)
        {
            if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1)       //定义的障碍物
            {
                g_Map[i][j] = 障碍物;
            }
            else
            {
                g_Map[i][j] = 空地;
            }
        }
    }
}
void InitGame2()
{
    g2_Snake[0].xx = 24;
    g2_Snake[0].yy = 23;
    g2_Snake[1].xx = 24;
    g2_Snake[1].yy = 24;
    g2_Snake[2].xx = 24;
    g2_Snake[2].yy = 25;
    g2_Snake[3].xx = 24;
    g2_Snake[3].yy = 26;

    for (int i = 0; i < MAP_X; i++)
    {
        for (int j = 0; j < MAP_Y; j++)
        {
            if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1)       //定义的障碍物
            {
                g_Map[i][j] = 障碍物;
            }
            else
            {
                g_Map[i][j] = 空地;
            }
        }
    }

}


/************************************************************************/
void WriteChar(int x, int y, const char* szStr, int color = 10 | 8)

{
    // 1句柄代表的就是某一个实体

    // 输出句柄代表的就是控制台输出相关的东西

    // 使用控制台函数,需要先获得句柄
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = { x * 2, y };
    SetConsoleTextAttribute(hOut, color);
    SetConsoleCursorPosition(hOut, pos);
    printf(szStr);
}
#define KEY_DOWN(key) GetAsyncKeyState(key)==(SHORT)0x8001?1:0
#define MP mer.dwMousePosition
void KeyEventProc(KEY_EVENT_RECORD ker)
{
    COORD m = { 0, 0 };
    if (ker.bKeyDown)
    {
        ch = ker.uChar.AsciiChar;
    }
    /*else
    Draw_postion(m, "键盘弹起", 0x50);*/
}
void MouseEventProc(MOUSE_EVENT_RECORD mer, int c)
{
    if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
    {
        if (MP.X > 1 && MP.X < 60 && MP.Y>0 && MP.Y < 30)
        {
            switch (c)
            {
            case 1:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "□", 15);
                g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = 2; break;
            case 2:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "※", 10);
                g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = -2; break;
            case 3:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "■", 15);
                g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = 0; break;
            }
        }
    }
}
int flag = 1;
int MessageLoop()
{
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    INPUT_RECORD stcRecord = { 0 };
    DWORD dwRead;

    SetConsoleMode(hStdin, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
    while (flag)
    {
        //等待事件

        ReadConsoleInput(hStdin, &stcRecord, 1, &dwRead);
        /*char flag = waitkey();*/
        int c = 1;
        switch (ch)
        {
        case '1':
            c = 1; break;
        case '2':
            c = 2; break;
        case '3':
            c = 3; break;
        case '4':
            flag = 0; break;
        default:
            break;
        }
        /*MouseEventProc(stcRecord.Event.MouseEvent, c);*/
        处理事件
        if (stcRecord.EventType == KEY_EVENT)
        {
            KeyEventProc(stcRecord.Event.KeyEvent);
        }

        else
        {
            MouseEventProc(stcRecord.Event.MouseEvent, c);
        }
        if (flag == 0)
        {
            //system("cls");
            cout << "保存成功" << endl;
        }

    }
    return 0;
}




/************************欢迎结束界面***********/
void welcome()
{
    PlaySoundA("lalala.wav", NULL, SND_ASYNC | SND_NODEFAULT);
    WriteChar(15, 10, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(15, 20, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(17, 13, "", 3 | 10);
    printf("WELCOME TO THE GAME OF RETRO SNAKE");
    WriteChar(17, 16, "", 3 | 10);
    printf("*请在英文输入法中操作*,wasd控制p暂停\n");
    WriteChar(20, 19, "", 3 | 10);
    system("pause");
    system("cls");

}
void Finish()
{
    system("cls");
    WriteChar(15, 10, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(15, 20, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(18, 14, "", 3 | 10);
    printf("GAME   OVER      o(* ̄▽ ̄*)o");
    WriteChar(20, 16, " ", 3 | 10);
    WriteChar(18, 18, " ", 3 | 10);
    printf("游戏结束,下次努力");
    WriteChar(0, 27, "", 3 | 10);
    system("pause");
}
void Finish2()
{
    system("cls");
    WriteChar(15, 10, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(15, 20, "", 3 | 10);
    printf("/**********************************************/");
    WriteChar(18, 14, "", 3 | 10);
    printf("GAME   OVER      o(* ̄▽ ̄*)o");
    WriteChar(20, 16, " ", 3 | 10);
    WriteChar(18, 18, " ", 3 | 10);
    printf("玩家1胜利!!!!");
    WriteChar(0, 27, "", 3 | 10);
    system("pause");
}




/************地图的绘制*********/
void DrwsMap()
{
    int XX = rand() % 28 + 1;
    int YY = rand() % 28 + 1;
    for (int i = 0; i < MAP_X; i++)
    {
        for (int j = 0; j < MAP_Y; j++)
        {
            if (g_Map[i][j] == 障碍物)
            {
                WriteChar(i, j, "□", 15);
            }
            else
            {
                WriteChar(i, j, "■", 14);
            }
        }

    }


    for (int i = 0; i < 20; i++)
    {
        XX = rand() % 28 + 1;
        YY = rand() % 28 + 1;
        if (g_Map[XX][YY] == 空地)  //地图上的这一点是不是空地,如果是空地就附为障碍物,画出来
        {
            g_Map[XX][YY] = 障碍物;
            WriteChar(XX, YY, "□", 15);
        }
    }
}
/*****************草丛********************/
void Thick()//草丛
{
    WriteChar(25, 26, "※", 10);
    g_Map[12][14] = 草丛;
    WriteChar(12, 14, "※", 10);
    g_Map[12][15] = 草丛;
    WriteChar(12, 15, "※", 10);
    g_Map[12][16] = 草丛;
    WriteChar(12, 16, "※", 10);
    WriteChar(25, 26, "※", 10);
    g_Map[12][17] = 草丛;
    WriteChar(12, 17, "※", 10);
    g_Map[12][18] = 草丛;
    WriteChar(12, 18, "※", 10);
    g_Map[12][19] = 草丛;
    WriteChar(12, 19, "※", 10);


    WriteChar(15, 26, "※", 10);
    g_Map[26][14] = 草丛;
    WriteChar(26, 14, "※", 10);
    g_Map[26][15] = 草丛;
    WriteChar(26, 15, "※", 10);
    g_Map[26][16] = 草丛;
    WriteChar(26, 16, "※", 10);
    g_Map[26][17] = 草丛;
    WriteChar(26, 17, "※", 10);
    g_Map[26][18] = 草丛;
    WriteChar(26, 18, "※", 10);
    g_Map[26][19] = 草丛;
    WriteChar(26, 19, "※", 10);

}
/****************手工绘制地图***********/
int DrewMap()
{
    DrwsMap();
    Thick();
    WriteChar(36, 17, "按1:绘制障碍物", 3 | 0);
    WriteChar(36, 18, "按2:绘制草地", 9 | 0);
    WriteChar(36, 19, "按3:清除", 4 | 2);
    WriteChar(36, 20, "按4:保存", 4 | 2);
    MessageLoop();
    getchar();
    return 0;
}




/***********信息显示***********/
void Tips()
{
    WriteChar(MAP_X + 3, 1, "", 10);//显示信息
    printf("hello Welcome To Play");
    WriteChar(MAP_X + 3, 2, "", 10);
    printf("按 W S A D 移动方向\n");
    WriteChar(MAP_X + 3, 3, " ", 10);
    printf("按P暂停\n");
}
void P1State()
{
    WriteChar(MAP_X + 3, 4, " ", 10);
    printf("得分:", &len);
    WriteChar(MAP_X + 3, 5, " ", 10);
    printf_s("我的生命:", &hp);
}
void P2State()
{
    WriteChar(MAP_X + 3, 9, " ", 10);
    printf("得分:", &len2);
    WriteChar(MAP_X + 3, 10, " ", 10);
    printf_s("我的生命:", &hp2);
}


/************游戏保和读取*************/
void Save()
{
    FILE * PFile = NULL;
    //打开存档文件
    if (fopen_s(&PFile, "G:\\123.txt", "w+") != 0)
    {
        fprintf(stderr, "Can't open memory.txt!\n");
        exit(1);
    }
    //保存地图
    fwrite(g_Map, sizeof(g_Map), 1, PFile);
    //保存蛇长度 
    fwrite(&g_nlenth, sizeof(int), 1, PFile);
    //保存方向 
    fwrite(&g_Dir, sizeof(g_Dir), 1, PFile);
    //保存食物坐标(结构体是值类型)
    fwrite(&g_FoodExist, sizeof(g_FoodExist), 1, PFile);
    //保存积分
    fwrite(&len, sizeof(int), 1, PFile);
    //保存生命
    fwrite(&hp, sizeof(int), 1, PFile);
    //保存蛇坐标
    fwrite(g_Snake, sizeof(g_Snake), 1, PFile);

    fclose(PFile);
    WriteChar(MAP_X + 6, 15, " ", 11);

    printf("保存成功");
    fclose(PFile);
}
void Read()
{
    FILE * PFile = NULL;
    //打开存档文件
    if (fopen_s(&PFile, "G:\\123.txt", "r+") != 0)
    {
        fprintf(stderr, "Can't open memory.txt!\n");
        exit(1);
    }

    fread(g_Map, sizeof(g_Map), 1, PFile);
    //保存蛇长度 
    fread(&g_nlenth, sizeof(int), 1, PFile);
    //保存方向 
    fread(&g_Dir, sizeof(g_Dir), 1, PFile);
    //保存食物坐标(结构体是值类型)
    fread(&g_FoodExist, sizeof(g_FoodExist), 1, PFile);
    //保存积分
    fread(&len, sizeof(int), 1, PFile);
    //保存生命
    fread(&hp, sizeof(int), 1, PFile);
    //保存蛇坐标
    fread(g_Snake, sizeof(g_Snake), 1, PFile);
    fclose(PFile);
}



/***********用户操作输入*****************/
void GetPlayerInput()
{
    int Oper = 0;
    //接收用户的输入,修改蛇的方向
    Oper = waitKey();
    //根据蛇的方向去移动蛇
    switch (Oper)
    {
    case 'w':case'W':
        if (g_Dir != 下)
        {
            g_Dir = 上;
        }
        break;
    case 's':case 'S':
        if (g_Dir != 上)
        {
            g_Dir = 下;
        }
        break;
    case 'a':case 'A':
        if (g_Dir != 右)
        {
            g_Dir = 左;
        }
        break;
    case 'd':case'D':
        if (g_Dir != 左)
        {
            g_Dir = 右;
        }
        break;
    case 'p':case 'P':
        n = -n;
        break;
    case 'b':case 'B':
        Save();
        break;
    case 'e':case 'E':
        g_Dir = 退出;
        break;
    }

}
void GetPlayerInput2()   //P2控制
{
    int Oper = 0;
    //接收用户的输入,修改蛇的方向
    Oper = waitKey2();
    //根据蛇的方向去移动蛇
    switch (Oper)
    {
    case 'i':case'I':
        if (g_Dir != DOWN)
        {
            g_Dir = UP;
        }
        break;
    case 'k':case 'K':
        if (g_Dir != UP)
        {
            g_Dir = DOWN;
        }
        break;
    case 'j':case 'J':
        if (g_Dir != RIGHT)
        {
            g_Dir = LEFT;
        }
        break;
    case 'l':case'L':
        if (g_Dir != LEFT)
        {
            g_Dir = RIGHT;
        }
        break;
    }
}




/***************双蛇的清理*************/
void ClearSnake()
{
    //根据蛇现在的坐标,将其在屏幕上清除
    for (int i = 0; i < g_nlenth; i++)
    {
        WriteChar(g_Snake[i].X, g_Snake[i].Y, "■", 14);   //清除蛇尾巴的点
        g_Map[g_Snake[i].X][g_Snake[i].Y] = 空地;   //清除蛇尾巴的点,取消自己的点
    }
}
void ClearSnake2()
{
    //根据蛇现在的坐标,将其在屏幕上清除
    for (int i = 0; i < g2_nlenth; i++)
    {
        WriteChar(g2_Snake[i].xx, g2_Snake[i].yy, "■", 14);   //清除蛇尾巴的点
        g_Map[g2_Snake[i].xx][g2_Snake[i].yy] = 空地;   //清除蛇尾巴的点,取消自己的点
    }
}





/***************画蛇*************/
void DrawSnake()
{
    for (int i = 0; i < g_nlenth; i++)
    {
        WriteChar(g_Snake[i].X, g_Snake[i].Y, "", 15);      //描绘蛇身
        g_Map[g_Snake[i].X][g_Snake[i].Y] = P1;    //将整个蛇身,定义给自己,确定位置
        if (i == 0)
        {
            printf("○");
        }
        else if (i == g_nlenth - 1)
        {
            printf("¤");
        }
        else
        {
            printf("⊙");
        }
    }
}
void DrawSnake2()
{
    for (int i = 0; i < g2_nlenth; i++)
    {
        WriteChar(g2_Snake[i].xx, g2_Snake[i].yy, "", 2);      //描绘蛇身
        g_Map[g2_Snake[i].xx][g2_Snake[i].yy] = P2;    //将整个蛇身,定义给自己,确定位置
        if (i == 0)
        {
            printf("○");
        }
        else if (i == g2_nlenth - 1)
        {
            printf("¤");
        }
        else
        {
            printf("⊙");
        }
    }
}





/*******双蛇的移和吃东西********************/
int MoveSnake()
{
    int nTempX = g_Snake[0].X;
    int nTempY = g_Snake[0].Y;
    switch (g_Dir)
    {
    case  上:
        nTempY--;
        break;
    case 下:
        nTempY++;
        break;
    case 左:
        nTempX--;
        break;
    case 右:
        nTempX++;
        break;
    }

    if (g_Map[nTempX][nTempY] == 空地)
    {
    }
    else if (g_Map[nTempX][nTempY] == 食物)
    {
        g_nlenth++;
        len++;
        g_Map[nTempX][nTempY] = 空地;
        g_FoodExist = 0;
        WriteChar(MAP_X + 6, 4, "", 15);
        printf("%d", len);
    }
    else if (g_Map[nTempX][nTempY] == 奖品)
    {
        g_nlenth;
        len++;
        if (g_nlenth <= 0)
        {
            return 0;
        }
        g_Map[nTempX][nTempY] = 空地;
        g_Food = -1;
        WriteChar(MAP_X + 6, 4, "", 15);
        printf("%d", len);
    }
    else if (g_Map[nTempX][nTempY] == 障碍物)
    {
        //g_Map[nTempX][nTempY] = 障碍物;
        --hp;
        if (hp <= 0)
        {
            return 0;
        }
        WriteChar(MAP_X + 8, 5, "", 7);
        printf("%d", hp);
        return true;
    }
    else
    {
        if (g_Map[nTempX][nTempY] == P1)
        {
            return 0;
        }
    }
    ClearSnake(); //根据蛇现在的坐标,将其在屏幕上清除掉
    for (int i = g_nlenth - 1; i >= 0; i--)
    {
        g_Snake[i + 1].X = g_Snake[i].X;
        g_Snake[i + 1].Y = g_Snake[i].Y;
    }
    g_Snake[0].X = nTempX;
    g_Snake[0].Y = nTempY;
    DrawSnake();    //根据新坐标将蛇绘制出来
    Thick();
    return 1;
}
int MoveSnake2()   //2p移动
{
    int nTempX = g2_Snake[0].xx;
    int nTempY = g2_Snake[0].yy;
    switch (g2_Dir)
    {
    case  UP:
        nTempY--;
        break;
    case DOWN:
        nTempY++;
        break;
    case LEFT:
        nTempX--;
        break;
    case RIGHT:
        nTempX++;
        break;
    }

    if (g_Map[nTempX][nTempY] == 空地)
    {
    }
    else if (g_Map[nTempX][nTempY] == 食物)
    {
        g2_nlenth++;
        len2++;
        g_Map[nTempX][nTempY] = 空地;
        g_FoodExist = 0;
        WriteChar(MAP_X + 6, 4, "", 15);
        printf("%d", len2);
    }
    else if (g_Map[nTempX][nTempY] == 奖品)
    {
        g2_nlenth--;
        len2++;
        if (g2_nlenth <= 0)
        {
            return 0;
        }
        g_Map[nTempX][nTempY] = 空地;
        g_Food = -1;
        WriteChar(MAP_X + 6, 4, "", 15);
        printf("%d", len2);
    }
    else if (g_Map[nTempX][nTempY] == 障碍物)
    {
        --hp2;
        if (hp2 <= 0)
        {
            return 0;
        }
        WriteChar(MAP_X + 8, 5, "", 7);
        printf("%d", hp2);
        return true;
    }
    else
    {
        if (g_Map[nTempX][nTempY] == P1)
        {
            return 0;
        }
    }
    ClearSnake2(); //根据蛇现在的坐标,将其在屏幕上清除掉
    for (int i = g2_nlenth - 1; i >= 0; i--)
    {
        g2_Snake[i + 1].xx = g2_Snake[i].xx;
        g2_Snake[i + 1].yy = g2_Snake[i].yy;
    }
    g2_Snake[0].xx = nTempX;
    g2_Snake[0].yy = nTempY;
    DrawSnake2();   //根据新坐标将蛇绘制出来

    return 1;
}




/*******两种食物******************/
void Food()
{
    while (true)
    {
        int FoodX = rand() % 28 + 1;
        int FoodY = rand() % 28 + 1;
        if (g_Map[FoodX][FoodY] == 空地)  //地图上的这一点是不是空地,如果是空地就附为食物,画出来
        {
            g_Map[FoodX][FoodY] = 食物;
            WriteChar(FoodX, FoodY, "●", 12);
            g_FoodExist = 1;
            break;
        }
    }

}
void SuperFood()
{
    while (true)
    {
        int FoodX = rand() % 28 + 1;
        int FoodY = rand() % 28 + 1;
        if (g_Map[FoodX][FoodY] == 空地)  //地图上的这一点是不是空地,如果是空地就附为食物,画出来
        {
            g_Map[FoodX][FoodY] = 奖品;
            WriteChar(FoodX, FoodY, "*", 12);
            g_Food = 1;
            break;
        }

    }
}

/**********简单模式*************/
void Easy()
{
    if (flag)
    {
        InitGame();//根据蛇现在的坐标
    }

    DrwsMap(); //画地图
    Tips();
    P1State();
    int nLive = 1;

    while (nLive)
    {
        GetPlayerInput();//获取用户输入
        if (n < 0)
        {
            continue;
        }
        nLive = MoveSnake();   //根据蛇的方向去移动蛇

        if (g_FoodExist == 0)
        {
            Food();
        }
        else if (g_Food == -1)
        {
            SuperFood();
        }
        Sleep(abs(200 - 5 * len));
        //Thick();
    }
    Save();
    Finish();
}
/**********有难度的模式************/
void Difficult()
{
    if (flag)
    {
        InitGame();//根据蛇现在的坐标
    }

    DrwsMap(); //画地图
    Tips();
    P1State();
    int nLive = 1;

    while (nLive)
    {
        GetPlayerInput();//获取用户输入
        if (n < 0)
        {
            continue;
        }
        nLive = MoveSnake();   //根据蛇的方向去移动蛇

        if (g_FoodExist == 0)
        {
            Food();
        }
        else if (g_Food == -1)
        {
            SuperFood();
        }
        Sleep(abs(100 - 5 * len));
        //Thick();
    }
    Save();
    Finish();
}
/**********双蛇大战****************/
void Double()
{
    InitGame();
    InitGame2();//根据蛇现在的坐标
    DrwsMap(); //画地图
    Tips();
    P1State();
    P2State();
    int nLive = 1;
    while (nLive)
    {
        Thick();
        GetPlayerInput();
        GetPlayerInput2();//获取用户输入
        if (n < 0)
        {
            continue;
        }
        nLive = MoveSnake();   //根据蛇的方向去移动蛇
        nLive = MoveSnake2();
        if (g_FoodExist == 0)
        {
            Food();
        }
        else if (g_Food == -1)
        {
            SuperFood();
        }
        Sleep(abs(200 - 1 * len));
    }
    Finish2();
    Save();
}

/**********游戏结束窗口******************/
void First()
{
    int i = 0;
    printf("  \n");
    printf("  \n");
    printf("  \n");
    printf("  \n");
    printf("  \n");
    printf("  \n");
    printf("                 ■                ■          ■          ■\n");
    printf("               ■  ■     ■■■  ■■■■   ■ ■ ■     ■■■■■  \n");
    printf("             ■  ■  ■   ■  ■ ■          ■ ■ ■     ■      ■\n");
    printf("            ■     ■   ■ ■  ■  ■■■     ■ ■ ■      ■   ■\n");
    printf("             ■■■■■   ■  ■     ■      ■ ■ ■      ■  ■\n");
    printf("             ■  ■  ■   ■■■    ■       ■ ■ ■      ■ ■    \n");
    printf("             ■  ■  ■   ■   ■  ■           ■  ■     ■    \n");
    printf("               ■  ■             ■      ■    ■   ■    ■    ■\n");
    printf("              ■    ■           ■      ■     ■    ■   ■    ■\n");
    printf("             ■      ■           ■■■■     ■■■■■  ■■■■\n");
    WriteChar(20, 20, "1 简单\n", 3 | 10);
    WriteChar(20, 21, "2 困难\n", 3 | 10);
    WriteChar(20, 22, "", 3 | 10);
    printf("请输入你的选择:\n");
    WriteChar(28, 22, "", 3 | 10);
    scanf_s("%d", &i);
    switch (i)
    {
    case 1:
        system("cls");
        Easy();
        break;
    case 2:
        system("cls");
        Difficult();
        break;
    }
}
/*********游戏退出*****************/
void QUIT()
{
    mem = 0;
}


/*********  选择模式*****************/
void Choince()
{
    while (mem)
    {
        system("cls");
        int ch = 0;
        WriteChar(15, 10, "*", 3 | 10);
        printf("/**********************************************/");
        WriteChar(15, 20, "*", 3 | 10);
        printf("/**********************************************/");
        WriteChar(20, 12, "*", 3 | 10);
        printf("请选择你的游戏\n");
        WriteChar(20, 14, "", 3 | 10);
        printf("1、新游戏\n");
        WriteChar(20, 15, "", 3 | 10);
        printf("2、保存的游戏\n");
        WriteChar(20, 16, "", 3 | 10);
        printf("3、自定义游戏\n");
        WriteChar(20, 17, "", 3 | 10);
        printf("4、双蛇对战\n");
        WriteChar(20, 18, "", 3 | 10);
        printf("5、退出游戏\n");
        WriteChar(20, 19, "", 3 | 10);
        printf("请输入你的选择:");
        scanf_s("%d", &ch);
        WriteChar(20, 30, "", 3 | 10);

        switch (ch)
        {
        case 1:
        {
            system("cls");
            First();
        }
        break;
        case 2:
        {
            system("cls");
            Read();
        }
        break;
        case 3:
        {
            system("cls");
            DrewMap();
        }
        break;

        case 4:
        {
            system("cls");
            Double();
        }
        break;
        case 5:
        {
            QUIT();
        }
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    welcome();
    Choince();
    return 0;
}
//主函数
  • 21
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值