C語(yǔ)言編程實(shí)現(xiàn)的推箱子小游戲

本次游戲是個(gè)推箱子第一關(guān)最簡(jiǎn)單的小游戲

游戲操作說(shuō)明和功能說(shuō)明:

按wasd控制小人的上下左右移動(dòng)。 按 r 重新開(kāi)始游戲 游戲開(kāi)始有操作介紹 游戲結(jié)束有勝利提示

游戲原理分析

游戲開(kāi)始時(shí)的星星個(gè)數(shù) = 箱子在星星上的個(gè)數(shù)時(shí) , 游戲勝利。 按 r 鍵重新開(kāi)始游戲, 我們需要定義一個(gè)量 map_1[8][8] 來(lái)保存游戲初始時(shí)的界面, 操作時(shí)我們將其賦值給 map[8][8] 來(lái)進(jìn)行操作,以便重新歸位, 這里就用到了memcpy()函數(shù)。 wasd 代表上下左右 操作人物移動(dòng), 分別需要為其定義一個(gè)函數(shù)。 判斷人物移動(dòng)之前我們需要定位到人物的位置,這里我們用find()函數(shù)來(lái)定義。

首先從頭文件開(kāi)始介紹:

#include#include//malloc()函數(shù)

#include//memcpy()函數(shù)

#include//getch()函數(shù)

函數(shù)名稱:malloc

函數(shù)原型: void * malloc(unsigned size);

函數(shù)功能: 分配size字節(jié)的存儲(chǔ)區(qū)

函數(shù)返回: 所分配的內(nèi)存區(qū)地址,如果內(nèi)存不夠,返回0

函數(shù)函數(shù):memcpy

函數(shù)原型:void *memcpy(void *dest, const void *src, size_t n);

函數(shù)功能:從源src所指的內(nèi)存地址的起始位置開(kāi)始拷貝n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中

函數(shù)返回:函數(shù)返回指向dest的指針。

函數(shù)名稱:getch

函數(shù)原型: int getch(void);

函數(shù)功能: 從控制臺(tái)讀取一個(gè)字符,但不顯示在屏幕上

函數(shù)返回: 讀取的字符

上圖是簡(jiǎn)單的8*8的圖,我們定義一個(gè)二維數(shù)組來(lái)保存整張圖,用0,1,2,3,4 來(lái)代表游戲界面中的每個(gè)符號(hào)。代碼如下:

int?map_1[8][8]={

{0,0,1,1,1,0,0,0},

{0,0,1,4,1,0,0,0},

{0,0,1,2,1,1,1,1},

{1,1,1,0,0,2,4,1},

{1,4,0,2,3,1,1,1},

{1,1,1,1,2,1,0,0},

{0,0,0,1,4,1,0,0},

{0,0,0,1,1,1,0,0}

};

定義全局變量:

int?x,?y;

int?map[8][8]?=?{0};

聲明函數(shù)原型:

int?count1();?????//?星星的個(gè)數(shù)

int?count2();????//?箱子到了星星的位置的個(gè)數(shù)

int?up();

int?down();

int?left();

int?right();

int?shuchu();

int?find();??????????//找到自己

int?zhujiemian();????//輸出主界面

接著我們來(lái)給每個(gè)數(shù)字賦值他們所代表的符號(hào), 代碼如下:

int?shuchu()

{

for(x=0;?x<8;?x++)

{

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?1)

printf("■");?//輸出磚塊的樣子

if(map[x][y]?==?3)

printf("⊙");?//輸出自己的位置

if(map[x][y]?==?2)

printf("□");?//輸出箱子

if(map[x][y]?==?4)

printf("☆");?//輸出箱子要到的位置

if(map[x][y]?==?0)

printf("??");?//輸出空白

if(map[x][y]?==?5)

printf("★");?//輸出箱子到了該到的位置

}

printf("\n");

}

return?0;

}

接著我們需要一個(gè)開(kāi)始游戲之前的一個(gè)主界面來(lái)提示游戲玩法, 代碼如下:

//制作主界面

int?zhujiemian()

{

printf("*************************\n"

"****請(qǐng)按任意鍵游戲開(kāi)始~*****\n"

"****制作:菜學(xué)匠************\n"

"****請(qǐng)按wasd?控制上下左右****\n"

"****請(qǐng)按r重新開(kāi)始游戲*******\n"

"*************************\n");

}

接著要想操作人物移動(dòng)首先要找到界面中人物的位置:

//找到自己的位置

int?find()

{

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?3)

return?0;

}

return?0;

}

再來(lái)記錄游戲開(kāi)始之前星星的個(gè)數(shù), 和箱子到了星星位置的個(gè)數(shù):

//星星的個(gè)數(shù)

int?count1()

{

int?n=0;

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?4)

n++;

}

return?n;

}

//箱子到了位置的個(gè)數(shù)

int?count2()

{

int?m=0;

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?5)

m++;

}

return?m;

}

接著來(lái)給wasd 四個(gè)方向上的人物移動(dòng)做判斷, 確定人物的移動(dòng):

//?按w的時(shí)候的輸出結(jié)果

int?up()

{

if(map[x][y]?==?3)?//找到自己的位置

{

if(map[x-1][y]?==?0)?//判斷下一格子是不是空

{

map[x-1][y]?=?3;

map[x][y]?=?0;

}

if(map[x-1][y]?==?2?&&?map[x-2][y]?==?4)?/*判斷下一格子是不是箱子,下下個(gè)格子是不是箱子要到的地方*/

{

map[x][y]?=?0;

map[x-1][y]?=?3;

map[x-2][y]?=?5;

}

}

return?0;

}

//按d的時(shí)候的輸出結(jié)果

int?down()

{

if(map[x][y]?==?3)?????????????//找到自己

{

if(map[x+1][y]?==?0)???????//判斷下個(gè)格子是否空格

{

map[x+1][y]?=?3;

map[x][y]?=?0;

}

if(map[x+1][y]?==?2?&&?map[x+2][y]?==?4)??/*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/

{

map[x][y]?=?0;

map[x+1][y]?=?3;

map[x+2][y]?=?5;

}

}

return?0;

}

//按a的時(shí)候的輸出結(jié)果

int?left()

{

if(map[x][y]?==?3)

{

if(map[x][y-1]?==?0)?????//判斷下個(gè)格子是否空格

{

map[x][y-1]?=?3;

map[x][y]?=?0;

}

if(map[x][y-1]?==?2?&&?map[x][y-2]?==?4)????/*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/

{

map[x][y]?=?0;

map[x][y-1]?=?3;

map[x][y-2]?=?5;

}

if(map[x][y-2]?==?0?&&?map[x][y-1]?==?2)?/*判斷下個(gè)格子是不是箱子且箱子后面的格子是不是空格*/

{

map[x][y]?=?0;

map[x][y-1]?=?3;

map[x][y-2]?=?2;

}

}

return?0;

}

//按d的時(shí)候的輸出結(jié)果

int?right()

{

if(map[x][y]?==?3)

{

if(map[x][y+1]?==?0)?????//判斷下個(gè)格子是否空格

{

map[x][y+1]?=3;

map[x][y]?=?0;

}

if(map[x][y+1]?==?2?&&?map[x][y+2]?==?4)/*判斷下個(gè)格子是不是箱子且箱子后面的是不是星星*/

{

map[x][y]?=?0;

map[x][y+1]?=?3;

map[x][y+2]?=?5;

}

}

return?0;

}

最后就是最重要的主函數(shù)了:

int?main()

{

int?n,m;

system("title?推箱子游戲~");????//給一個(gè)標(biāo)題

memcpy(map,?map_1,?sizeof(map_1));

zhujiemian();

getch();

system("cls");???????????????//清屏

n=count1();

while(1)

{

system("cls");

shuchu();

m=?count2();

find();

switch(getch())

{

case?'w':up();?break;

case?'s':down();?break;

case?'a':left();?break;

case?'d':right();?break;

case?'r':memcpy(map,?map_1,?sizeof(map_1));?break;

}

if(n==m)

{

system("cls");

printf("游戲勝利~\n");

getch();

return?0;

}

}

}

接下來(lái)給出整個(gè)完整的程序,經(jīng)過(guò)gcc 編譯可以運(yùn)行,代碼如下:

#include#include#include#includeint?x=0,y=0;

int?map[8][8]={0};

//?定義的游戲界面模型

int?map_1[8][8]={

{0,0,1,1,1,0,0,0},

{0,0,1,4,1,0,0,0},

{0,0,1,2,1,1,1,1},

{1,1,1,0,0,2,4,1},

{1,4,0,2,3,1,1,1},

{1,1,1,1,2,1,0,0},

{0,0,0,1,4,1,0,0},

{0,0,0,1,1,1,0,0}

};

int?count1();

int?count2();

int?();

up();

int?down();

int?left();

int?right

int?shuchu();

int?find();

int?zhujiemian();

int?main()

{

int?n,m;

system("title?推箱子游戲~");

memcpy(map,?map_1,?sizeof(map_1));

zhujiemian();

getch();

system("cls");

n=count1();

while(1)

{

system("cls");

shuchu();

m=?count2();

find();

switch(getch())

{

case?'w':up();?break;

case?'s':down();?break;

case?'a':left();?break;

case?'d':right();?break;

case?'r':memcpy(map,?map_1,?sizeof(map_1));?break;

}

if(n==m)

{

system("cls");

printf("游戲勝利~\n");

getch();

return?0;

}

}

}

//?按w的時(shí)候的輸出結(jié)果

int?up()

{

if(map[x][y]?==?3)?//找到自己的位置

{

if(map[x-1][y]?==?0)?//判斷下一格子是不是空

{

map[x-1][y]?=?3;

map[x][y]?=?0;

}

if(map[x-1][y]?==?2?&&?map[x-2][y]?==?4)?//判斷下一格子是不是箱子,下下個(gè)格子是不是箱子要到的地方

{

map[x][y]?=?0;

map[x-1][y]?=?3;

map[x-2][y]?=?5;

}

}

return?0;

}

//按d的時(shí)候的輸出結(jié)果

int?down()

{

if(map[x][y]?==?3)

{

if(map[x+1][y]?==?0)

{

map[x+1][y]?=?3;

map[x][y]?=?0;

}

if(map[x+1][y]?==?2?&&?map[x+2][y]?==?4)

{

map[x][y]?=?0;

map[x+1][y]?=?3;

map[x+2][y]?=?5;

}

}

return?0;

}

//按a的時(shí)候的輸出結(jié)果

int?left()

{

if(map[x][y]?==?3)

{

if(map[x][y-1]?==?0)

{

map[x][y-1]?=?3;

map[x][y]?=?0;

}

if(map[x][y-1]?==?2?&&?map[x][y-2]?==?4)

{

map[x][y]?=?0;

map[x][y-1]?=?3;

map[x][y-2]?=?5;

}

if(map[x][y-2]?==?0?&&?map[x][y-1]?==?2)

{

map[x][y]?=?0;

map[x][y-1]?=?3;

map[x][y-2]?=?2;

}

}

return?0;

}

//按d的時(shí)候的輸出結(jié)果

int?right()

{

if(map[x][y]?==?3)

{

if(map[x][y+1]?==?0)

{

map[x][y+1]?=3;

map[x][y]?=?0;

}

if(map[x][y+1]?==?2?&&?map[x][y+2]?==?4)

{

map[x][y]?=?0;

map[x][y+1]?=?3;

map[x][y+2]?=?5;

}

}

return?0;

}

int?shuchu()

{

for(x=0;?x<8;?x++)

{

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?1)

printf("■");?//輸出磚塊的樣子

if(map[x][y]?==?3)

printf("⊙");?//輸出自己的位置

if(map[x][y]?==?2)

printf("□");?//輸出箱子

if(map[x][y]?==?4)

printf("☆");?//輸出箱子要到的位置

if(map[x][y]?==?0)

printf("??");?//輸出空白

if(map[x][y]?==?5)

printf("★");?//輸出箱子到了該到的位置

}

printf("\n");

}

return?0;

}

//找到自己的位置

int?find()

{

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?3)

return?0;

}

return?0;

}

//箱子要到的位置的個(gè)數(shù)

int?count1()

{

int?n=0;

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?4)

n++;

}

return?n;

}

//箱子到了位置的個(gè)數(shù)

int?count2()

{

int?m=0;

for(x=0;?x<8;?x++)

for(y=0;?y<8;?y++)

{

if(map[x][y]?==?5)

m++;

}

return?m;

}

//制作主界面

int?zhujiemian()

{

printf("*************************\n"

"***請(qǐng)按任意鍵游戲開(kāi)始~***\n"

"*********制作:小菜*******\n"

"**請(qǐng)按wasd?控制上下左右**\n"

"**請(qǐng)按r重新開(kāi)始游戲******\n"

"*************************\n");

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容