C語言代碼實(shí)現(xiàn)推箱子小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)推箱子小游戲的具體代碼,供大家參考,具體內(nèi)容如下
本次游戲是個(gè)推箱子第一關(guān)最簡(jiǎn)單的小游戲
有詳細(xì)注釋,下面是做出來的游戲界面
游戲操作說明和功能說明:
1、按wasd控制小人的上下左右移動(dòng)。
2、按 r 重新開始游戲
3、游戲開始有操作介紹
4、游戲結(jié)束有勝利提示
游戲原理分析
1、游戲開始時(shí)的星星個(gè)數(shù) = 箱子在星星上的個(gè)數(shù)時(shí) , 游戲勝利。
2、按 r 鍵重新開始游戲, 我們需要定義一個(gè)量 map_1[8][8] 來保存游戲初始時(shí)的界面, 操作時(shí)我們將其賦值給 map[8][8] 來進(jìn)行操作,以便重新歸位, 這里就用到了memcpy()函數(shù)。
3、wasd 代表上下左右 操作人物移動(dòng), 分別需要為其定義一個(gè)函數(shù)。
4、判斷人物移動(dòng)之前我們需要定位到人物的位置,這里我們用find()函數(shù)來定義。
首先從頭文件開始介紹:
#include<stdio.h> #include<stdlib.h> //malloc()函數(shù) #include<string.h> //memcpy()函數(shù) #include<conio.h> //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)存地址的起始位置開始拷貝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ù)組來保存整張圖,用0,1,2,3,4 來代表游戲界面中的每個(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(); //輸出主界面
接著我們來給每個(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è)開始游戲之前的一個(gè)主界面來提示游戲玩法, 代碼如下:
//制作主界面 int zhujiemian() { printf("*************************\n" "****請(qǐng)按任意鍵游戲開始~*****\n" "****制作:菜學(xué)匠************\n" "****請(qǐng)按wasd 控制上下左右****\n" "****請(qǐng)按r重新開始游戲*******\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; }
再來記錄游戲開始之前星星的個(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; }
接著來給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; } } }
接下來給出整個(gè)完整的程序,經(jīng)過gcc 編譯可以運(yùn)行,代碼如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> int 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)按任意鍵游戲開始~***\n" "*********制作:小菜*******\n" "**請(qǐng)按wasd 控制上下左右**\n" "**請(qǐng)按r重新開始游戲******\n" "*************************\n"); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08C語言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))
魔方陣是指由1,2,3……n2填充的,每一行、每一列、對(duì)角線之和均相等的方陣,階數(shù)n = 3,4,5…。魔方陣也稱為幻方陣,看下面的實(shí)現(xiàn)方法吧2013-11-11C++中STL的優(yōu)先隊(duì)列priority_queue詳解
這篇文章主要介紹了C++中STL的優(yōu)先隊(duì)列priority_queue詳解,今天講一講優(yōu)先隊(duì)列(priority_queue),實(shí)際上,它的本質(zhì)就是一個(gè)heap,我從STL中扒出了它的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-08-08