這篇文章主要介紹“怎么用C語言實現推箱子”,在日常操作中,相信很多人在怎么用C語言實現推箱子問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用C語言實現推箱子”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
注意:每次打印地圖的時候要在前面加入system("cls")語句來清除刷新地圖,該方法需要用到#include <Windows.h>的頭文件。
對上篇文章的推箱子的地圖代碼進行函數封裝,成果如下:
void drawMap()
{
system("CLS");
// 使用循環,遍歷數組(將游戲數據圖形化)
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(" "); // 兩個空格
break;
case 1:
printf("█");
break;
case 2:
printf("♀");
break;
case 3:
printf("●");
break;
case 4:
printf("☆");
break;
default:
break;
}
}
printf("\n");
}
}而存儲地圖的地方可以放在主函數體外面來進行聲明。
在這之后如果推到成功點和人走到成功點上僅需要加上case 2+4和case 3+4兩個條件即可,具體代碼如最后源碼所示。
對角色移動的函數我們需要分為2個函數,一個是來控制角色移動的函數,另一個則是來尋找角色所在位置的坐標。
在該函數中,我們需要對尋找角色,以及判斷箱子能否推動做兩個功能封裝為一個函數,在該函數中,我們要先找到角色的位置,然后對移動的位置進行判斷。
// 移動邏輯 參數: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;
}
}
}
// 空地或成功點 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;
}
// 箱子(將箱子從點上推走)
else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])
{
// 箱子上面是空地或成功點 map[posX - 1][posY]: 箱子位置
if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])
{
// 當前位置人離開
map[posX][posY] -= 2;
map[posX + X][posY + Y] += 2;
map[posX + X][posY + Y] -= 3;
map[posX + (X * 2)][posY + (Y * 2)] += 3;
}
}
}該函數對鍵盤輸入進行處理,并且通過傳入2個參數來一次性對移動進行操作,不需要四個方向都需要在寫一遍函數,以下寫法可以防止用戶開大寫而移動不了角色。
void heroMove()
{
// 控制人物移動
// 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;
}
}這里用到了C++的bool類型,c語言也是可以使用,如果不想用這種函數,改成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;
}這里的思想是,先繪制地圖,然后對移動進行判斷,直到判斷所有的箱子沒有后,判定玩家勝利。
int main()
{
while (!isWin()) // 游戲主循環
{
drawMap();
heroMove();
}
drawMap();
return 0;
}#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 }
};
/* 函數聲明 */
void drawMap();
void heroMove();
void move(int X, int Y);
bool isWin();
int main()
{
while (!isWin()) // 游戲主循環
{
drawMap();
heroMove();
}
drawMap();
return 0;
}
/* 函數定義 */
// 繪制地圖
void drawMap()
{
system("CLS");
// 使用循環,遍歷數組(將游戲數據圖形化)
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(" "); // 兩個空格
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()
{
// 控制人物移動
// 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;
}
}
// 移動邏輯 參數: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;
}
}
}
// 空地或成功點 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;
}
// 箱子(將箱子從點上推走)
else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])
{
// 箱子上面是空地或成功點 map[posX - 1][posY]: 箱子位置
if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])
{
// 當前位置人離開
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;
}到此,關于“怎么用C語言實現推箱子”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。