最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能(2)

 更新時(shí)間:2022年02月18日 15:28:47   作者:D_eretay  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1.前言

本文章將承接著上面的文章(上篇文章的地址),繼續(xù)對(duì)推箱子的代碼進(jìn)行修改和完善,對(duì)上面雜亂的代碼進(jìn)行修改成函數(shù)。

2.地圖代碼修改成函數(shù)

注意:每次打印地圖的時(shí)候要在前面加入system("cls")語(yǔ)句來(lái)清除刷新地圖,該方法需要用到#include <Windows.h>的頭文件。

對(duì)上篇文章的推箱子的地圖代碼進(jìn)行函數(shù)封裝,成果如下:

void drawMap() 
{ 
    system("CLS"); 
    // 使用循環(huán),遍歷數(shù)組(將游戲數(shù)據(jù)圖形化) 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            /*printf("%2d", map[i][j]);*/ 
            switch (map[i][j]) 
            {
                case 0: 
                    printf(" "); // 兩個(gè)空格 
                    break; 
                case 1: 
                    printf("█"); 
                    break; 
                case 2: 
                    printf("♀"); 
                    break; 
                case 3: 
                    printf("●"); 
                    break; 
                case 4: 
                    printf("☆"); 
                    break; 
                default: 
                    break; 
                } 
        }
        printf("\n"); 
    } 
}

而存儲(chǔ)地圖的地方可以放在主函數(shù)體外面來(lái)進(jìn)行聲明。

在這之后如果推到成功點(diǎn)和人走到成功點(diǎn)上僅需要加上case 2+4和case 3+4兩個(gè)條件即可,具體代碼如最后源碼所示。

3.角色移動(dòng)修改成函數(shù)

對(duì)角色移動(dòng)的函數(shù)我們需要分為2個(gè)函數(shù),一個(gè)是來(lái)控制角色移動(dòng)的函數(shù),另一個(gè)則是來(lái)尋找角色所在位置的坐標(biāo)。

3.1尋找角色函數(shù)

在該函數(shù)中,我們需要對(duì)尋找角色,以及判斷箱子能否推動(dòng)做兩個(gè)功能封裝為一個(gè)函數(shù),在該函數(shù)中,我們要先找到角色的位置,然后對(duì)移動(dòng)的位置進(jìn)行判斷。

// 移動(dòng)邏輯 參數(shù):int X,int Y X和Y方向的偏移量 
void move(int X,int Y) 
{ 
    // 1 找人 
    int posX = 0, posY = 0; 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            if (2 == map[i][j] || 2 + 4 == map[i][j]) 
            { 
                posX = i; 
                posY = j; 
                break; 
            }
        } 
    }
    // 空地或成功點(diǎn) map[posX][posY]:主角所在的位置 
    if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) 
    { 
    map[posX][posY] -= 2; 
    map[posX + X][posY + Y] += 2; 
    }
    // 箱子(將箱子從點(diǎn)上推走) 
    else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) 
    { 
        // 箱子上面是空地或成功點(diǎn) map[posX - 1][posY]: 箱子位置 
        if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) 
        { 
            // 當(dāng)前位置人離開 
            map[posX][posY] -= 2; 
            map[posX + X][posY + Y] += 2; 
            map[posX + X][posY + Y] -= 3; 
            map[posX + (X * 2)][posY + (Y * 2)] += 3; 
        } 
    } 
}

3.2角色移動(dòng)函數(shù)

該函數(shù)對(duì)鍵盤輸入進(jìn)行處理,并且通過傳入2個(gè)參數(shù)來(lái)一次性對(duì)移動(dòng)進(jìn)行操作,不需要四個(gè)方向都需要在寫一遍函數(shù),以下寫法可以防止用戶開大寫而移動(dòng)不了角色。

void heroMove() 
{ 
    // 控制人物移動(dòng) 
    // 2 控制(鍵盤:WSAD(上下左右)) 
    // 需要從鍵盤獲取按鍵(字符) 
    switch (getch())
    {
        case 'w': 
        case 'W': 
            move(-1, 0); 
            break; 
        case 's': 
        case 'S': 
            move(1, 0); 
            break; 
        case 'a': 
        case 'A': 
            move(0, -1); 
            break; 
        case 'd': 
        case 'D': 
            move(0, 1); 
            break; 
        default: 
            break; 
    } 
}

4.判斷勝利修改成函數(shù)

這里用到了C++的bool類型,c語(yǔ)言也是可以使用,如果不想用這種函數(shù),改成int也是可以使用的。

bool isWin() 
{ 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            if (map[i][j] == 3) 
            { 
                return false; 
            } 
        } 
    }
    return true;
}

5.主體函數(shù)的實(shí)現(xiàn)

這里的思想是,先繪制地圖,然后對(duì)移動(dòng)進(jìn)行判斷,直到判斷所有的箱子沒有后,判定玩家勝利。

int main() 
{ 
    while (!isWin()) // 游戲主循環(huán) 
    { 
        drawMap(); 
        heroMove(); 
    }
    drawMap(); 
    return 0; 
}

6.推箱子能實(shí)現(xiàn)基本功能的源碼

#include <stdio.h> 
#include <conio.h> 
#include <Windows.h> 
char map[10][10] = 
{ 
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 
    { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 }, 
    { 1, 0, 0, 4, 0, 1, 1, 0, 0, 1 }, 
    { 1, 0, 0, 3, 0, 1, 0, 0, 0, 1 }, 
    { 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 },
    { 1, 1, 1, 1, 0, 0, 3, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
};
/* 函數(shù)聲明 */ 
void drawMap(); 
void heroMove(); 
void move(int X, int Y); 
bool isWin();
int main() 
{ 
    while (!isWin()) // 游戲主循環(huán) 
    { 
        drawMap(); 
        heroMove(); 
    }
    drawMap(); 
    return 0; 
}
/* 函數(shù)定義 */ 
// 繪制地圖 
void drawMap() 
{ 
    system("CLS"); 
    // 使用循環(huán),遍歷數(shù)組(將游戲數(shù)據(jù)圖形化) 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            /*printf("%2d", map[i][j]);*/ 
            switch (map[i][j]) 
            {
                case 0: 
                    printf(" "); // 兩個(gè)空格 
                    break; 
                case 1: 
                    printf("█"); 
                    break; 
                case 2: 
                    printf("♀"); 
                    break; 
                case 3: 
                    printf("●"); 
                    break; 
                case 4: 
                    printf("☆"); 
                    break; 
                case 2 + 4: 
                    printf("♀");
                    break; 
                case 3 + 4: 
                    printf("★"); 
                    break; 
                default: 
                    break; 
                } 
        }
        printf("\n"); 
    } 
}
void heroMove() 
{ 
    // 控制人物移動(dòng) 
    // 2 控制(鍵盤:WSAD(上下左右)) 
    // 需要從鍵盤獲取按鍵(字符) 
    switch (getch())
    {
        case 'w': 
        case 'W': 
            move(-1, 0); 
            break; 
        case 's': 
        case 'S': 
            move(1, 0); 
            break; 
        case 'a': 
        case 'A': 
            move(0, -1); 
            break; 
        case 'd': 
        case 'D': 
            move(0, 1); 
            break; 
        default: 
            break; 
    } 
}
// 移動(dòng)邏輯 參數(shù):int X,int Y X和Y方向的偏移量 
void move(int X,int Y) 
{ 
    // 1 找人 
    int posX = 0, posY = 0; 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            if (2 == map[i][j] || 2 + 4 == map[i][j]) 
            { 
                posX = i; 
                posY = j; 
                break; 
            }
        } 
    }
    // 空地或成功點(diǎn) map[posX][posY]:主角所在的位置 
    if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) 
    { 
    map[posX][posY] -= 2; 
    map[posX + X][posY + Y] += 2; 
    }
    // 箱子(將箱子從點(diǎn)上推走) 
    else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) 
    { 
        // 箱子上面是空地或成功點(diǎn) map[posX - 1][posY]: 箱子位置 
        if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) 
        { 
            // 當(dāng)前位置人離開 
            map[posX][posY] -= 2; 
            map[posX + X][posY + Y] += 2; 
            map[posX + X][posY + Y] -= 3; 
            map[posX + (X * 2)][posY + (Y * 2)] += 3; 
        } 
    } 
}
//判斷勝利
bool isWin() 
{ 
    for (size_t i = 0; i < 10; i++) 
    { 
        for (size_t j = 0; j < 10; j++) 
        { 
            if (map[i][j] == 3) 
            { 
                return false; 
            } 
        } 
    }
    return true;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題

    c++基礎(chǔ)算法動(dòng)態(tài)DP解決CoinChange問題

    這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動(dòng)態(tài)DP來(lái)解決Coin Change的問題示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉

    C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉

    C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它
    2022-04-04
  • C++超詳細(xì)講解字符串類

    C++超詳細(xì)講解字符串類

    在C++中只有一個(gè)字符串類,即basic_string,其管理著一個(gè) '\0' 結(jié)尾的字符數(shù)組。頭文件:#include <string>,string類支持兩種輸入方式:cin方式和getline()方式
    2022-06-06
  • Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條

    Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++實(shí)現(xiàn)LeetCode(97.交織相錯(cuò)的字符串)

    C++實(shí)現(xiàn)LeetCode(97.交織相錯(cuò)的字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(97.交織相錯(cuò)的字符串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ auto類型說明符

    C++ auto類型說明符

    在C++11中引入了auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。當(dāng)然,auto變量必須有初始值,這樣編譯器才能推斷其類型
    2016-03-03
  • C語(yǔ)言實(shí)現(xiàn)反彈球消磚塊游戲

    C語(yǔ)言實(shí)現(xiàn)反彈球消磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)反彈球消磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    這篇文章主要為大家詳細(xì)介紹C語(yǔ)言的指針,本文進(jìn)行了深度解析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C語(yǔ)言打印楊輝三角示例匯總

    C語(yǔ)言打印楊輝三角示例匯總

    本文給大家匯總了2種使用C語(yǔ)言實(shí)現(xiàn)楊輝三角的方法,不過還是給大家推薦第一種,希望大家能夠喜歡。
    2016-02-02
  • C語(yǔ)言實(shí)現(xiàn)關(guān)機(jī)小程序

    C語(yǔ)言實(shí)現(xiàn)關(guān)機(jī)小程序

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)關(guān)機(jī)小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論

运城市| 蒲城县| 东阿县| 治县。| 东乡族自治县| 无棣县| 新竹县| 平远县| 高雄市| 通城县| 游戏| 都昌县| 北流市| 怀来县| 武陟县| 昌吉市| 黄大仙区| 湘潭县| 保靖县| 浦北县| 海丰县| 大庆市| 固镇县| 新巴尔虎左旗| 富宁县| 平远县| 手机| 阳东县| 广丰县| 宁国市| 吉木萨尔县| 泌阳县| 于田县| 平邑县| 濮阳市| 林周县| 桐梓县| 哈尔滨市| 和龙市| 甘孜| 孝昌县|