基于C++寫一個推箱子小游戲
上代碼:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int map[2][7][8] =
{
//0:空的 1:■ :墻
//3:☆ 4:★ //目的地和箱子
//5:※ //人
//7:⊙ //目的(3)和箱子(4)在一起
//8:※ //人(5)和目的(3)在一起
//為讓多種情況使用一種算法
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 3, 1, 0, 1, 1, 3, 1,
1, 4, 0, 0, 4, 0, 3, 1,
1, 0, 1, 0, 1, 1, 4, 1,
1, 0, 0, 5, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 3, 1, 0, 1, 1, 3, 1,
1, 3, 4, 5, 4, 0, 3, 1,
1, 4, 1, 0, 1, 1, 4, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
}
};
int cas = 0; //為0表示第一關(guān)
//記錄每一關(guān)的箱子數(shù) 或者是項(xiàng)目和目的在一起的總數(shù)
int boxSum[2] = {3,4};
//地圖繪圖
void drawMap()
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (j == 0)
printf("\t\t");
switch (map[cas][i][j])
{
// //0:空的 1:■ :墻
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
//3:☆ 4:★ //目的地和箱子
case 3:
printf("☆");
break;
case 4:
printf("★");
break;
//5:※ //人
case 5:
case 8:
printf("※");
break;
case 7:
printf("⊙");
break;
//7:⊙ //目的(3)和箱子(4)在一起
//8:※ //人(5)和目的(3)在一起
}
}
printf("\n");
}
}
//按鍵處理
void keyDown()
{
//分析按鍵過程
//定位人在哪里
//人有兩種情況:第一個是:人,第二個:人站在目的上
int i, j;
for (i = 0; i < 7; i++)
{
for (j = 0; j < 8; j++)
{
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;
}
}
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;
}
}
char ch = _getch(); //看不見的字符輸入,+頭文件 conio.h
switch (ch)
{
//72 80 75 77
case 'w':
case 'W':
case 72:
//下一個地方等于空地或者是目的 能走
if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)來了
map[cas][i - 1][j] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
//如果下一個是箱子,要進(jìn)一步判斷能走
//注意點(diǎn):箱子兩種狀態(tài):箱子,箱子和目的在一起
else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
{
//做箱子的下一個地方判斷能不能走
if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
{
//新的地方箱子來了
map[cas][i - 2][j] += 4;
//箱子的位置:箱子(-4)走了 人來(+5)
map[cas][i - 1][j] += 1;
//原來的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 's':
case 'S':
case 80:
//下一個地方等于空地或者是目的 能走
if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)來了
map[cas][i + 1][j] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
{
//做箱子的下一個地方判斷能不能走
if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
{
//新的地方箱子來了
map[cas][i + 2][j] += 4;
//箱子的位置:箱子(-4)走了 人來(+5)
map[cas][i + 1][j] += 1;
//原來的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 'a':
case 'A':
case 75:
//下一個地方等于空地或者是目的 能走
if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)來了
map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] = map[cas][i][j] - 5;
//j+=5 j=j+5
}
else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
{
//做箱子的下一個地方判斷能不能走
if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
{
//新的地方箱子來了
map[cas][i][j - 2] += 4;
//箱子的位置:箱子(-4)走了 人來(+5)
map[cas][i][j - 1] += 1;
//原來的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 'D':
case 'd':
case 77:
//下一個地方等于空地或者是目的 能走
if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)來了
map[cas][i][j + 1] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
//下一個地方是箱子,判斷箱子的下一個地方是不是目的和空地
else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
{
//做箱子的下一個地方判斷能不能走
if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
{
//新的地方箱子來了
map[cas][i][j + 2] += 4;
//箱子的位置:箱子(-4)走了 人來(+5)
map[cas][i][j + 1] += 1;
//原來的地方人走了
map[cas][i][j] -= 5;
}
}
break;
}
}
//勝負(fù)判斷
//用什么判斷勝負(fù): 箱子到達(dá)目的的個數(shù)
int gameOver()
{
int count = 0;
//所有的地方找一遍
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 7)
count++;
}
}
return count;
}
//箱子數(shù)是零的時候也是勝利
int gameOver2()
{
int count = 3;
//所有的地方找一遍
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 3)
count--;
}
}
return count;
}
int main()
{
while (1)
{
printf("\n\t用方向鍵或w a s d鍵移動※推動★進(jìn)入☆\n",cas+1);
printf("\n\t\t 共兩關(guān) 第 %d 關(guān)\n",cas+1);
drawMap();
if (gameOver() == boxSum[cas])
{
cas++;
if (cas == 2)
break;
else
printf("\n\t\t 該關(guān) OK!按任一鍵進(jìn)繼續(xù)\n");
}
keyDown();
system("cls");
}
printf("游戲結(jié)束!");
printf("\n");
system("pause");
return 0;
}到此這篇關(guān)于基于C++寫一個推箱子小游戲的文章就介紹到這了,更多相關(guān)C++推箱子游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VisualStudio?制作Dynamic?Link?Library動態(tài)鏈接庫文件的詳細(xì)過程
這篇文章主要介紹了VisualStudio?制作Dynamic?Link?Library動態(tài)鏈接庫文件的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于C++基于消息隊(duì)列的多線程實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
C語言實(shí)現(xiàn)修改文本文件中特定行的實(shí)現(xiàn)代碼
最近由于項(xiàng)目需要實(shí)現(xiàn)修改文件的功能,所以,博主認(rèn)真查閱了一些資料,但是,很遺憾,并沒有太多的收獲2013-06-06
C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用
為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-08-08
C++數(shù)據(jù)精度問題(對浮點(diǎn)數(shù)保存指定位小數(shù))
這篇文章主要介紹了對浮點(diǎn)數(shù)保存指定位小數(shù)。比如, 1.123456. 要保存1位小數(shù),,調(diào)用方法后, 保存的結(jié)果為: 1.1。 再比如,1.98765, 保存2位小數(shù)的結(jié)果為: 2.00,需要的朋友可以參考下2017-08-08
C++ 中CloseHandle 函數(shù)--關(guān)閉一個句柄
這篇文章主要介紹了C++ 中CloseHandle 函數(shù)--關(guān)閉一個句柄的相關(guān)資料,需要的朋友可以參考下2017-05-05

