欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.前言

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

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

注意:每次打印地圖的時(shí)候要在前面加入system("cls")語(yǔ)句來清除刷新地圖,該方法需要用到#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ù)體外面來進(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è)是來控制角色移動(dòng)的函數(shù),另一個(gè)則是來尋找角色所在位置的坐標(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ù)來一次性對(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é)

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

相關(guān)文章

  • 詳解C++中賦值和輸入輸出語(yǔ)句的用法

    詳解C++中賦值和輸入輸出語(yǔ)句的用法

    這篇文章主要介紹了詳解C++中賦值和輸入輸出語(yǔ)句的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • visual studio 2022中的scanf問題解決

    visual studio 2022中的scanf問題解決

    昨天在使用Visual Studio 2022編寫C語(yǔ)言程序時(shí)遇到了scanf問題,對(duì)于vs的編譯器來說scanf是不安全的,編譯器通過不了scanf,本文就來介紹一下解決方法,感興趣的可以了解一下
    2023-12-12
  • C++ 中構(gòu)造函數(shù)的實(shí)例詳解

    C++ 中構(gòu)造函數(shù)的實(shí)例詳解

    這篇文章主要介紹了C++ 中構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++面試常見問題整理匯總

    C++面試常見問題整理匯總

    這篇文章主要介紹了C++面試常見問題整理,匯總了C++基本語(yǔ)法、面向?qū)ο蟾鞣N概念與易錯(cuò)點(diǎn),需要的朋友可以參考下
    2017-05-05
  • 詳解C語(yǔ)言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)

    詳解C語(yǔ)言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)

    這篇文章主要介紹了C語(yǔ)言中字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)(memcpy)的不同及內(nèi)存拷貝函數(shù)的模擬實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例

    c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例

    enum是C語(yǔ)言中的一個(gè)關(guān)鍵字,enum叫枚舉數(shù)據(jù)類型,枚舉數(shù)據(jù)類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關(guān)于c語(yǔ)言枚舉類型enum用法及應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言中結(jié)構(gòu)體與內(nèi)存對(duì)齊實(shí)例解析

    C語(yǔ)言中結(jié)構(gòu)體與內(nèi)存對(duì)齊實(shí)例解析

    C語(yǔ)言結(jié)構(gòu)體對(duì)齊也是老生常談的話題了,基本上是面試題的必考題,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中結(jié)構(gòu)體與內(nèi)存對(duì)齊的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 五個(gè)經(jīng)典鏈表OJ題帶你進(jìn)階C++鏈表篇

    五個(gè)經(jīng)典鏈表OJ題帶你進(jìn)階C++鏈表篇

    做題之前呢,小編想提醒下大家,要三思而后行,不要一上來就嘎嘎敲代碼,要先學(xué)會(huì)自己畫圖分析,把自己的思路捋清楚,不要到時(shí)候?qū)懘a五分鐘,調(diào)試兩小時(shí),記住,編程思路很重要
    2022-03-03
  • 最新評(píng)論