推箱子游戲C語言實(shí)現(xiàn)代碼
今天我來分享一道對于初學(xué)C語言的同學(xué)非常有啟發(fā)作用的編程例題,是用C語言實(shí)現(xiàn)單張地圖推箱子的小游戲。
這個(gè)游戲是基于Linux環(huán)境下編程的,所用工具為ubuntu、和gcc編譯器。
首先推箱子的地圖,我們根據(jù)經(jīng)典游戲推箱子中的其中一幅地圖來自做,圖片如下。

用圖片形式實(shí)現(xiàn)這張圖片對于初學(xué)編程的同學(xué)來說,難以實(shí)現(xiàn),所以我們選擇用字符代替的形式來實(shí)現(xiàn)這張地圖。
我們采用2為數(shù)組的方式來存儲(chǔ)這張地圖,具體的數(shù)字與字符含義轉(zhuǎn)換如下:
0 printf(" "); 路
2 printf("@"); 人
3 printf("#"); 墻
4 printf("$"); 箱子
5 printf("O"); 目標(biāo)點(diǎn)
7 printf("@"); 人
9 printf("$"); 箱子
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <getch.h>
int mx = 0;
int my = 0;
int step = 0;
char map[8][8] = {
{0,0,3,3,3,3,0,0},
{0,0,3,5,5,3,0,0},
{0,3,3,0,5,3,3,0},
{0,3,0,0,4,5,3,0},
{3,3,0,4,0,0,3,3},
{3,0,0,3,4,4,0,3},
{3,0,0,2,0,0,0,3},
{3,3,3,3,3,3,3,3}
};
void show_map(void)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(0 == map[i][j])
{
printf(" ");
}
else if(2 == map[i][j])
{
printf("@ ");
}
else if(3 == map[i][j])
{
printf("# ");
}
else if(4 == map[i][j])
{
printf("$ ");
}
else if(5 == map[i][j])
{
printf("O ");
}
else if(7 == map[i][j])
{
printf("@ ");
}
else if(9 == map[i][j])
{
printf("$ ");
}
}
printf("\n");
}
}
void up(void)
{
for(int i=0; i<8;i++)
{
for(int j=0; j<8;j++)
{
if(2 == map[i][j] || 7 == map[i][j])
{
mx =i;
my =j;
}
}
}
if(3 == map[mx-1][my])
{
return;
}
else if(0 == map[mx-1][my] || 5 == map[mx-1][my])
{
map[mx-1][my] += 2;
map[mx][my] -= 2;
step++;
}
else if(4 == map[mx-1][my] || 9 == map[mx-1][my])
{
if(0 == map[mx-2][my])
{
map[mx-2][my] += 4;
map[mx-1][my] -= 2;
map[mx][my] -= 2;
step++;
}
else if(5 == map[mx-2][my])
{
map[mx-2][my] += 4;
map[mx-1][my] -= 2;
map[mx][my] -= 2;
step++;
}
else
{
return;
}
}
}
void down(void)
{
for(int i=0; i<8;i++)
{
for(int j=0; j<8;j++)
{
if(2 == map[i][j] || 7 == map[i][j])
{
mx =i;
my =j;
}
}
}
if(3 == map[mx+1][my])
{
return;
}
else if(0 == map[mx+1][my] || 5 == map[mx+1][my])
{
map[mx+1][my] += 2;
map[mx][my] -= 2;
step++;
}
else if(4 == map[mx+1][my] || 9 == map[mx+1][my])
{
if(0 == map[mx+2][my])
{
map[mx+2][my] += 4;
map[mx+1][my] -= 2;
map[mx][my] -= 2;
step++;
}
else if(5 == map[mx+2][my])
{
map[mx+2][my] += 4;
map[mx+1][my] -= 2;
map[mx][my] -= 2;
step++;
}
else
{
return;
}
}
}
void left(void)
{
for(int i=0; i<8;i++)
{
for(int j=0; j<8;j++)
{
if(2 == map[i][j] || 7 == map[i][j])
{
mx =i;
my =j;
}
}
}
if(3 == map[mx][my-1])
{
return;
}
else if(0 == map[mx][my-1] || 5 == map[mx][my-1])
{
map[mx][my-1] += 2;
map[mx][my] -= 2;
step++;
}
else if(4 == map[mx][my-1] || 9 == map[mx][my-1])
{
if(0 == map[mx][my-2])
{
map[mx][my-2] += 4;
map[mx][my-1] -= 2;
map[mx][my] -= 2;
step++;
}
else if(5 == map[mx][my-2])
{
map[mx][my-2] += 4;
map[mx][my-1] -= 2;
map[mx][my] -= 2;
step++;
}
else
{
return;
}
}
}
void right(void)
{
for(int i=0; i<8;i++)
{
for(int j=0; j<8;j++)
{
if(2 == map[i][j] || 7 == map[i][j])
{
mx =i;
my =j;
}
}
}
if(3 == map[mx][my+1])
{
return;
}
else if(0 == map[mx][my+1] || 5 == map[mx][my+1])
{
map[mx][my+1] += 2;
map[mx][my] -= 2;
step++;
}
else if(4 == map[mx][my+1] || 9 == map[mx][my+1])
{
if(0 == map[mx][my+2])
{
map[mx][my+2] += 4;
map[mx][my+1] -= 2;
map[mx][my] -= 2;
step++;
}
else if(5 == map[mx][my+2])
{
map[mx][my+2] += 4;
map[mx][my+1] -= 2;
map[mx][my] -= 2;
step++;
}
else
{
return;
}
}
}
void start_soko(void)
{
FILE* frp = fopen("soko.bin","r");
if(NULL == frp)
{
printf("數(shù)據(jù)加載錯(cuò)誤!\n");
return;
}
fread(map,1,64,frp);
fclose(frp);
}
void exit_soko(void)
{
FILE* fwp = fopen("soko.bin","w");
printf("____");
if(NULL == fwp)
{
printf("數(shù)據(jù)保存錯(cuò)誤!\n");
}
fwrite(map,1,64,fwp);
fclose(fwp);
}
int main()
{
start_soko();
while(true)
{
system("clear");
//顯示地圖
show_map();
//判定是否游戲結(jié)束
int cnt = 0;
for(int i=0; i<8; i++)
{
for(int j=0; j<8;j++)
{
if(9 == map[i][j])
{
cnt++;
}
}
}
if(4 == cnt)
{
printf("游戲結(jié)束,共使用%d步!\n",step);
return 0;
}
printf("%d\n",cnt);
//獲取方向鍵
switch(getch())
{
case 'w':up();break;
case 's':down();break;
case 'a':left();break;
case 'd':right();break;
case 'q':exit_soko();return 0;
default:
puts("輸入指令有誤!");
}
}
exit_soko();
}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言學(xué)生成績管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生成績管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
探討register關(guān)鍵字在c語言和c++中的差異
建議不要用register關(guān)鍵字定義全局變量,因?yàn)槿肿兞康纳芷谑菑膱?zhí)行程序開始,一直到程序結(jié)束才會(huì)終止,而register變量可能會(huì)存放在cpu的寄存器中,如果在程序的整個(gè)生命周期內(nèi)都占用著寄存器的話,這是個(gè)相當(dāng)不好的舉措2013-10-10
VisualStudio類文件的管理(類文件的分離)的實(shí)現(xiàn)
在使用?Visual?Studio?開發(fā)項(xiàng)目的時(shí)候,學(xué)會(huì)進(jìn)行“類文件的分離”十分重要,本文主要介紹了VisualStudio類文件的管理(類文件的分離)的實(shí)現(xiàn),感興趣的可以了解一下2024-03-03
C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問題
這篇文章主要介紹了C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖思考,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

