【C語言項目】貪吃蛇遊戲(下)

00. 目錄

07. 遊戲邏輯

7.5 按下ESC鍵結束遊戲

在moveKeyControl函數中添加以下代碼片斷數據結構

//按下F2減速
        if (GetAsyncKeyState(VK_F2))
        {
            speedDown();
        }

        //按下ESC鍵 結束遊戲
        if (GetAsyncKeyState(VK_ESCAPE))
        {
            endStatus = 3;

            break;
        }

7.6 判斷是否撞到牆

參考代碼:函數

//判斷是否撞牆
int isHitWall(void)
{
    if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
    {
        return 1;
    }
}

在snake.c文件moveKeyControl函數中添加以下代碼設計

Sleep(sleepTime);

        moveSnake();

        //判斷是否撞牆
        if (isHitWall())
        {
            endStatus = 1;

            break;
        }

7.7 判斷是否咬到本身

判斷是否咬到本身3d

//判斷是否咬到本身
int isBitSelf(void)
{
    snake_t *tmp = NULL;

    tmp = head->next;
    while (NULL != tmp)
    {
        if (tmp->x == head->x && tmp->y == head->y)
        {
            return 1;
        }
        
        tmp = tmp->next;
    }

    return 0;
}

在snake.c文件moveKeyControl函數中添加以下代碼code

//判斷是否撞牆
        if (isHitWall())
        {
            endStatus = 1;

            break;
        }

        //判斷是否咬到本身
        if (isBitSelf())
        {
            endStatus = 2;

            break;
        }

08. 遊戲失敗界面設計

8.1 遊戲失敗界面邊框設計

遊戲邊框失敗界面分析blog

參考源代碼遊戲

//遊戲失敗界面邊框
void failGameUi(void)
{
    int i;

    system("cls");

    //顯示遊戲失敗提示
    setColor(12);
    gotoXY(44, 3);
    printf("遊 戲 失 敗!!!");

    setColor(11);
    gotoXY(17, 5);

    //繪製上邊框
    printf("+----------------------------------------------------------------+");

    //繪製下邊框
    gotoXY(17, 20);
    printf("+----------------------------------------------------------------+");

    //繪製左右邊框
    for (i = 6; i < 20; i++)
    {
        gotoXY(17, i);
        printf("|");

        gotoXY(82, i);
        printf("|");
    }
}

在moveKeyControl函數中按下ESC選項中添加以下代碼get

//按下ESC鍵 結束遊戲
        if (GetAsyncKeyState(VK_ESCAPE))
        {
            endStatus = 3;
            failGameUi();
            break;
        }

8.2 撞牆失敗界面

顯示效果以下:
it

界面分析

參考代碼:

//結束遊戲
int endGame(void)
{
    int n;
    int highScore;

    //顯示遊戲失敗邊框
    failGameUi();

    setColor(12);

    //根據不一樣的狀態顯示不一樣的失敗提示
    switch (endStatus)
    {
        //撞到牆
    case 1:
        gotoXY(38, 9);
        printf("您撞到牆了,遊戲結束!!!");
        break;

        //咬到本身
    case 2:
        break;

        //用戶按下ESC退出
    case 3:
        break;

    default:
        ;
    }

    //顯示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //從文件中讀取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已經創記錄了,");
        //寫文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,離最高分還差%d分", highScore - score);
    }

    
    return 0;
}

8.3 咬到蛇身失敗界面

顯示效果以下:

在endGame函數中修改代碼以下

//結束遊戲
int endGame(void)
{
    int n;
    int highScore;

    //顯示遊戲失敗邊框
    failGameUi();

    setColor(12);
    gotoXY(38, 9);

    //根據不一樣的狀態顯示不一樣的失敗提示
    switch (endStatus)
    {
        //撞到牆
    case 1:
        printf("您撞到牆了,遊戲結束!!!");
        break;

        //咬到本身
    case 2:
        printf("您咬到蛇身了,遊戲結束!");
        break;

        //用戶按下ESC退出
    case 3:
        break;

    default:
        ;
    }

    //顯示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //從文件中讀取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已經創記錄了,");
        //寫文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,離最高分還差%d分", highScore - score);
    }

    return 0;
}

8.4 ESC結束遊戲界面

顯示效果:

在endGame函數中修改代碼以下

//結束遊戲
int endGame(void)
{
    int n;
    int highScore;

    //顯示遊戲失敗邊框
    failGameUi();

    setColor(12);
    gotoXY(38, 9);

    //根據不一樣的狀態顯示不一樣的失敗提示
    switch (endStatus)
    {
        //撞到牆
    case 1:
        printf("您撞到牆了,遊戲結束!!!");
        break;

        //咬到本身
    case 2:
        printf("您咬到蛇身了,遊戲結束!");
        break;

        //用戶按下ESC退出
    case 3:
        printf("您已經結束了遊戲,遊戲結束");
        break;

    default:
        ;
    }

    //顯示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //從文件中讀取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已經創記錄了,");
        //寫文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,離最高分還差%d分", highScore - score);
    }

    return 0;
}

8.5 界面添加選擇

顯示效果以下:

界面分析

代碼實現

//結束遊戲
int endGame(void)
{
    int n;
    int highScore;

    while (1)
    {
        //顯示遊戲失敗邊框
        failGameUi();

        setColor(12);
        gotoXY(38, 9);

        //根據不一樣的狀態顯示不一樣的失敗提示
        switch (endStatus)
        {
            //撞到牆
        case 1:
            printf("您撞到牆了,遊戲結束!!!");
            break;

            //咬到本身
        case 2:
            printf("您咬到蛇身了,遊戲結束!");
            break;

            //用戶按下ESC退出
        case 3:
            printf("您已經結束了遊戲,遊戲結束");
            break;

        default:
            ;
        }

        //顯示您的得分
        gotoXY(43, 12);
        setColor(13);
        printf("您的得分: %d", score);


        //從文件中讀取最高分
        highScore = readFile();

        if (score > highScore)
        {
            setColor(10);
            gotoXY(38, 16);
            printf("恭喜你, 你已經創記錄了,");
            //寫文件
            //writeFile(score);
        }
        else
        {
            setColor(10);
            gotoXY(38, 16);
            printf("加油哦,離最高分還差%d分", highScore - score);
        }

        //輸出用戶選擇信息
        gotoXY(25, 23);
        setColor(12);
        printf("在玩一局請輸入: 1");

        gotoXY(52, 23);
        printf("直接退出請輸入:2");

        gotoXY(46, 25);
        setColor(11);
        printf("請選擇:");

        scanf("%d", &n);
        getchar();

        if (1 == n)
        {
            score = 0;
            sleepTime = 350;
            add = 1;
            break;
        }
        else if (2 == n)
        {
            exit(0);
        }
        else
        {
            gotoXY(30, 27);
            setColor(12);
            printf("您的輸入有誤, 請從新輸入, 按下任意鍵繼續");
            getchar();
        }
    }
    return 0;
}

8.6 寫文件實現

//寫文件
int writeFile(int score)
{
    FILE *fp = NULL;

    fp = fopen("save.txt", "w+");

    fprintf(fp, "%d", score);

    fclose(fp);

    return 0;
}

在endGame函數中,若是破紀錄了就寫文件

if (score > highScore)
        {
            setColor(10);
            gotoXY(38, 16);
            printf("恭喜你, 你已經創記錄了,");
            //寫文件
            writeFile(score);
        }

09. 一塊兒來找茬

//銷燬蛇
int destroySnake(void)
{
    snake_t *tmp = NULL;
    snake_t *save = NULL;

    tmp = head;
    while (NULL != tmp)
    {
        save = tmp->next;
        free(tmp);
        tmp = save;
    }

    head = NULL;

    return 0;
}

10. 項目擴展

  • 設置關卡

    蛇移動速度

  • 保存每個用戶的得分信息

  • 排名榜

11. 項目總結

基礎知識: C語言 數據結構中簡單單向鏈表

大學生C/C++交流羣

相關文章
相關標籤/搜索