新聞中心
推箱子地圖編輯器,供大家參考,具體內(nèi)容如下
10年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁(yè)制作,對(duì)成都塑料袋等多個(gè)方面,擁有多年的網(wǎng)站營(yíng)銷經(jīng)驗(yàn)。
由于我在寫推箱子的時(shí)候苦于沒(méi)有地圖可以試驗(yàn)程序運(yùn)行效果,而且去搜了好長(zhǎng)時(shí)間都沒(méi)有找到一個(gè)儲(chǔ)存16*16地圖版本的推箱子關(guān)卡數(shù)據(jù)信息的文件。
于是想到了寫了一個(gè)地圖編輯器用來(lái)自己設(shè)計(jì)地圖的想法。
原本以為這個(gè)偉大的創(chuàng)意只有我才想的出來(lái),結(jié)果搜索后才發(fā)現(xiàn)還有很多人有著與我相同的想法。
但,其他人寫的編輯器大部分都不是C語(yǔ)言版本的,而這一個(gè)是C語(yǔ)言版本的。
另外說(shuō)明一下,該編輯器的想法完全是我個(gè)人想法寫出來(lái)的,不敢保證編輯習(xí)慣符合別人的習(xí)慣。
但本著,能夠?qū)崿F(xiàn)需求,程序就是正確的原則,我自己對(duì)這個(gè)程序還是比較有信心的。
運(yùn)行使用代碼前,請(qǐng)查看代碼最前面的詳細(xì)使用說(shuō)明注釋,以免對(duì)您造成不便
如果您喜歡我的文章可以點(diǎn)贊支持一下。
如果您對(duì)我的程序有什么意見(jiàn)和建議歡迎在評(píng)論區(qū)發(fā)表評(píng)論。
另外附上作者自寫的推箱子游戲代碼 可以適配該編輯器:
推箱子游戲運(yùn)行程序
下面進(jìn)入技術(shù)環(huán)節(jié):
使用C語(yǔ)言實(shí)現(xiàn) 16*16推箱子 地圖編輯器
編譯環(huán)境: Windows VS2019
其他大部分編譯環(huán)境,可通過(guò)查看下文的“注意事項(xiàng)”將代碼更正為其他平臺(tái)可正常編譯運(yùn)行版本
需求:
通過(guò)移動(dòng)光標(biāo)在對(duì)應(yīng)位置輸出方塊實(shí)現(xiàn)編輯地圖功能,編輯完成后按下z鍵將地圖保存進(jìn)txt中。
思路:
將屏幕上的光標(biāo)坐標(biāo)*2與地圖數(shù)組下標(biāo)對(duì)應(yīng)起來(lái),在屏幕上進(jìn)行輸出操作就是對(duì)對(duì)應(yīng)數(shù)組下標(biāo)進(jìn)行賦值操作,編輯完成后按下z鍵即可將地圖信息保存進(jìn)文本文件中。
做法:
首先輸出16*16的空地,getch函數(shù)即時(shí)接收鍵盤輸入信息,wasd控制光標(biāo)移動(dòng),輸入1-5可放置不同的地圖元素,z鍵將地圖信息保存進(jìn)文本文件并退出程序。
具體詳細(xì)做法請(qǐng)查看代碼。
使用到知識(shí)點(diǎn):
循環(huán)、二維數(shù)組、寫入文件
難點(diǎn):
無(wú)
說(shuō)明:
1 ■ 代表墻,2 ★ 代表目標(biāo),3 ● 代箱子,4 ♀ 代表人物,else □ 代表空地
地圖大小為16*16。
數(shù)字代表的事物必須和游戲中相匹配,也可以通過(guò)更改程序來(lái)代表其他事物,以適配游戲程序。
使用編輯器之前應(yīng)先將代碼中的FLMOP宏所代表的文件路徑更改正確。
注意:
由于編譯器原因程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會(huì)出現(xiàn)錯(cuò)誤,解決辦法是去掉函數(shù)前面的“_”。
同時(shí),要將 文件打開(kāi)函數(shù)fopen_s(&fp, FLPA, “r”);更改為fp = fopen(FLPA, “r”);
fcanf_s更改為fcanf scanf_s()更改為scanf
運(yùn)行效果:
代碼實(shí)現(xiàn):
//C語(yǔ)言推箱子地圖編輯器 詳細(xì)使用說(shuō)明: //1 ■ 代表墻,2 ★ 代表目標(biāo),3 ● 代箱子,4 ♀ 代表人物,else □ 代表空地 //推箱子exe文件程序 使用本編輯器的前提條件是:使用二維數(shù)組寫出整個(gè)游戲結(jié)構(gòu)、地圖大小為16*16、 \ 、數(shù)字與之所代表的事物相匹配。 //使用該編輯器之前必須先確定文件路徑FLMOP宏所替代的字符串路徑在自己的電腦上準(zhǔn)確無(wú)誤并可以訪問(wèn)。 \ 否則會(huì)造成地圖編輯完成后無(wú)法保存?。?! //該編輯器在絕大多數(shù)情況下都可以正常使用并保存。但如在游戲程序中出現(xiàn)地圖位置錯(cuò)亂的情況,在檢查游戲程序 \ 問(wèn)題無(wú)誤后請(qǐng)檢查編輯器所使用的地圖文件內(nèi)地圖信息是否異常。 //如過(guò)您使用的是作者所配套使用的游戲程序,且游戲程序和地圖信息都無(wú)異常,請(qǐng)嘗試調(diào)整游戲程序內(nèi) \ BYT宏(一關(guān)卡字?jǐn)?shù))所代表的字?jǐn)?shù)信息。該異常可能是文件隨機(jī)讀寫函數(shù)錯(cuò)誤的二進(jìn)制轉(zhuǎn)換導(dǎo)致的。 //以上錯(cuò)誤情況頻率僅代表極少數(shù)情況,可放心使用 //作者:白家名 #include#include #include //使用推箱子地圖編輯器,輕松編輯出多種多樣的復(fù)雜關(guān)卡 //wasd鍵控制光標(biāo),z鍵將地圖信息保存進(jìn)文件并結(jié)束程序 //1 ■ 代表墻,2 ★ 代表目標(biāo),3 ● 代箱子,4 ♀ 代表人物、else □ 代表空地 //注意:如使用作者的配套游戲運(yùn)行程序使用地圖,不可以地圖邊界作為限制人物活動(dòng)的墻壁使用 #define N 16 //地圖寬高 #define FLMOP "C:\\Users\\ASUS\\Desktop\\編輯器地圖.txt" void gotoxy(int x, int y); //光標(biāo)定位 void fxscdt(); //翻譯輸出地圖 void ckydgbhs(); //控制移動(dòng)和設(shè)置元素函數(shù) int map[N][N]; //地圖數(shù)組 char ck; //讀方向鍵 int x, y; //光標(biāo)坐標(biāo)(x*2) int main() //主函數(shù)控制所有 { system("title 推箱子地圖編譯器1.0"); system("mode con cols=78 lines=31"); fxscdt(); //輸出地圖和使用說(shuō)明 while (1) { ckydgbhs(); //控制光標(biāo)移動(dòng) gotoxy(42, 2); //輸出光標(biāo)位置信息 printf(" "); gotoxy(42, 2); printf("%d %d", x, y); //光標(biāo) gotoxy(x << 1, y); //i橫軸,j縱軸,橫坐標(biāo)乘2和數(shù)組的下標(biāo)相對(duì)應(yīng) Sleep(60); } gotoxy(0, 40); return 0; } void dszcz() //編輯結(jié)束后輸出數(shù)組 { gotoxy(0, 21); printf("是否確認(rèn)保存并退出地圖編輯器?! z 確認(rèn)"); char tch= _getch(); if (tch != 'z') return; //輸入z確認(rèn)繼續(xù) FILE* fp = NULL; //將地圖數(shù)組保存進(jìn)所選文件路徑中 fopen_s(&fp, FLMOP, "a+"); //追加方式打開(kāi)文件 for (int i = 0; i < N; i++) //將地圖信息寫入文件 { for (int j = 0; j < N; j++) fprintf(fp, "%d ", map[i][j]); fprintf(fp, "\n"); } fprintf(fp, "\n"); fclose(fp); gotoxy(0, 24); printf("恭喜!地圖信息添加成功! %s",FLMOP); gotoxy(0, 26); exit(0); } void ckydgbhs() //方向和設(shè)置元素 { ck = _getch(); //接收 switch (ck) { case 'w': y--; //光標(biāo)移動(dòng) if (y < 0) //對(duì)光標(biāo)的移動(dòng)位置加以限制 { y = 0; return; } break; case 'a': x--; if (x < 0) { x = 0; return; } break; case 's': y++; if (y > 15) { y = 15; return; } break; case 'd': x++; if (x > 15) { x = 15; return; } break; case '1': printf("■"); break; case '2': printf("★"); break; case '3': printf("●"); break; case '4': printf("♀"); break; default: printf("□"); ck = '0'; //輸入其他ch為0空格 break; case 'z': dszcz(); //z結(jié)束編輯地圖 } if (ck != 'w' && ck != 'a' && ck != 's' && ck != 'd' && ck != 'z') //不是移動(dòng)和保存時(shí),將ck值存儲(chǔ)進(jìn)數(shù)組中 map[y][x] = ck - '0'; } void fxscdt() //輸出初始地圖 { int i, j; //循環(huán)用變量 gotoxy(0, 0); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { switch (map[i][j]) { case 1: printf("■"); case 2: printf("★"); case 3: printf("●"); case 4: printf("♀"); default: printf("□"); } } printf("\n"); } gotoxy(42, 0); printf("光標(biāo) 現(xiàn)在的 x y 坐標(biāo):"); gotoxy(42, 5); printf("16 * 16 推箱子 地圖編輯器"); gotoxy(42, 8); printf("wsad 鍵控制光標(biāo)上下左右移動(dòng)"); gotoxy(42, 10); printf("按下 e 鍵可放置方塊,輸入1-5的數(shù)字"); gotoxy(42, 12); printf("1 ■ 墻壁 \t2 ★ 目標(biāo)"); gotoxy(42, 14); printf("3 ● 箱子 \t4 ♀ 人"); gotoxy(42, 16); printf("其他 □ 空地"); gotoxy(0, 19); printf("確認(rèn)路徑后無(wú)誤后 按下 z 鍵享受一鍵無(wú)憂保存地圖!(a+)"); gotoxy(0, 0); } void gotoxy(int x, int y) { COORD pos = { x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); }
如果對(duì)于程序代碼注釋有我沒(méi)寫明白的地方,歡迎在評(píng)論區(qū)下方留言詢問(wèn),如果我看到會(huì)盡最大的努力為您解惑。
不足之處:
暫不明確,歡迎提出建議。
最后,感謝所有愿意對(duì)我提出批評(píng)和建議的人,你們的支持是我堅(jiān)持下去的強(qiáng)大動(dòng)力。
網(wǎng)頁(yè)名稱:C語(yǔ)言實(shí)現(xiàn)推箱子游戲的地圖編輯器
分享鏈接:http://www.dlmjj.cn/article/gpesjh.html