欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)推箱子游戲的地圖編輯器

 更新時間:2020年02月24日 08:00:13   作者:白家名  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)推箱子游戲的地圖編輯器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

推箱子地圖編輯器,供大家參考,具體內(nèi)容如下

由于我在寫推箱子的時候苦于沒有地圖可以試驗程序運行效果,而且去搜了好長時間都沒有找到一個儲存16*16地圖版本的推箱子關卡數(shù)據(jù)信息的文件。
于是想到了寫了一個地圖編輯器用來自己設計地圖的想法。

原本以為這個偉大的創(chuàng)意只有我才想的出來,結果搜索后才發(fā)現(xiàn)還有很多人有著與我相同的想法。
但,其他人寫的編輯器大部分都不是C語言版本的,而這一個是C語言版本的。

另外說明一下,該編輯器的想法完全是我個人想法寫出來的,不敢保證編輯習慣符合別人的習慣。

但本著,能夠實現(xiàn)需求,程序就是正確的原則,我自己對這個程序還是比較有信心的。

運行使用代碼前,請查看代碼最前面的詳細使用說明注釋,以免對您造成不便

如果您喜歡我的文章可以點贊支持一下。
如果您對我的程序有什么意見和建議歡迎在評論區(qū)發(fā)表評論。

另外附上作者自寫的推箱子游戲代碼 可以適配該編輯器:

推箱子游戲運行程序

下面進入技術環(huán)節(jié):

使用C語言實現(xiàn) 16*16推箱子 地圖編輯器

編譯環(huán)境: Windows VS2019

其他大部分編譯環(huán)境,可通過查看下文的“注意事項”將代碼更正為其他平臺可正常編譯運行版本

需求:

通過移動光標在對應位置輸出方塊實現(xiàn)編輯地圖功能,編輯完成后按下z鍵將地圖保存進txt中。

思路:

將屏幕上的光標坐標*2與地圖數(shù)組下標對應起來,在屏幕上進行輸出操作就是對對應數(shù)組下標進行賦值操作,編輯完成后按下z鍵即可將地圖信息保存進文本文件中。

做法:

首先輸出16*16的空地,getch函數(shù)即時接收鍵盤輸入信息,wasd控制光標移動,輸入1-5可放置不同的地圖元素,z鍵將地圖信息保存進文本文件并退出程序。

具體詳細做法請查看代碼。

使用到知識點:

循環(huán)、二維數(shù)組、寫入文件

難點:

說明:

1 ■ 代表墻,2 ★ 代表目標,3 ● 代箱子,4 ♀ 代表人物,else □ 代表空地
地圖大小為16*16。
數(shù)字代表的事物必須和游戲中相匹配,也可以通過更改程序來代表其他事物,以適配游戲程序。
使用編輯器之前應先將代碼中的FLMOP宏所代表的文件路徑更改正確。

注意:

由于編譯器原因程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會出現(xiàn)錯誤,解決辦法是去掉函數(shù)前面的“_”。
同時,要將 文件打開函數(shù)fopen_s(&fp, FLPA, “r”);更改為fp = fopen(FLPA, “r”);
fcanf_s更改為fcanf scanf_s()更改為scanf

運行效果:

代碼實現(xiàn):

//C語言推箱子地圖編輯器 詳細使用說明:

//1 ■ 代表墻,2 ★ 代表目標,3 ● 代箱子,4 ♀ 代表人物,else □ 代表空地
//推箱子exe文件程序 使用本編輯器的前提條件是:使用二維數(shù)組寫出整個游戲結構、地圖大小為16*16、 \
、數(shù)字與之所代表的事物相匹配。

//使用該編輯器之前必須先確定文件路徑FLMOP宏所替代的字符串路徑在自己的電腦上準確無誤并可以訪問。 \
 否則會造成地圖編輯完成后無法保存!??!

//該編輯器在絕大多數(shù)情況下都可以正常使用并保存。但如在游戲程序中出現(xiàn)地圖位置錯亂的情況,在檢查游戲程序 \
 問題無誤后請檢查編輯器所使用的地圖文件內(nèi)地圖信息是否異常。
//如過您使用的是作者所配套使用的游戲程序,且游戲程序和地圖信息都無異常,請嘗試調整游戲程序內(nèi) \
 BYT宏(一關卡字數(shù))所代表的字數(shù)信息。該異??赡苁俏募S機讀寫函數(shù)錯誤的二進制轉換導致的。

//以上錯誤情況頻率僅代表極少數(shù)情況,可放心使用

//作者:白家名

#include <stdio.h>
#include <windows.h>
#include <conio.h>

//使用推箱子地圖編輯器,輕松編輯出多種多樣的復雜關卡

//wasd鍵控制光標,z鍵將地圖信息保存進文件并結束程序

//1 ■ 代表墻,2 ★ 代表目標,3 ● 代箱子,4 ♀ 代表人物、else □ 代表空地

//注意:如使用作者的配套游戲運行程序使用地圖,不可以地圖邊界作為限制人物活動的墻壁使用

#define N 16 //地圖寬高

#define FLMOP "C:\\Users\\ASUS\\Desktop\\編輯器地圖.txt"

void gotoxy(int x, int y); //光標定位
void fxscdt(); //翻譯輸出地圖
void ckydgbhs(); //控制移動和設置元素函數(shù)

int map[N][N]; //地圖數(shù)組
char ck; //讀方向鍵
int x, y; //光標坐標(x*2)

int main()  //主函數(shù)控制所有
{
 system("title 推箱子地圖編譯器1.0");
 system("mode con cols=78 lines=31");
 fxscdt(); //輸出地圖和使用說明

 while (1)
 {
 ckydgbhs(); //控制光標移動
 
 gotoxy(42, 2); //輸出光標位置信息
 printf(" ");
 gotoxy(42, 2);
 printf("%d %d", x, y);

 //光標
 gotoxy(x << 1, y); //i橫軸,j縱軸,橫坐標乘2和數(shù)組的下標相對應

 Sleep(60);
 }
 
 gotoxy(0, 40);
 return 0;
}

void dszcz() //編輯結束后輸出數(shù)組
{
 gotoxy(0, 21);
 printf("是否確認保存并退出地圖編輯器?! z 確認");
 char tch= _getch();

 if (tch != 'z') return; //輸入z確認繼續(xù)

 FILE* fp = NULL; //將地圖數(shù)組保存進所選文件路徑中
 fopen_s(&fp, FLMOP, "a+"); //追加方式打開文件


 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()  //方向和設置元素
{
 ck = _getch(); //接收

 switch (ck)
 {
 case 'w': y--; //光標移動
 if (y < 0) //對光標的移動位置加以限制
 { 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結束編輯地圖
 }

 if (ck != 'w' && ck != 'a' && ck != 's' && ck != 'd' && ck != 'z') //不是移動和保存時,將ck值存儲進數(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("光標 現(xiàn)在的 x y 坐標:");
 gotoxy(42, 5);
 printf("16 * 16 推箱子 地圖編輯器");
 gotoxy(42, 8);
 printf("wsad 鍵控制光標上下左右移動");
 gotoxy(42, 10);
 printf("按下 e 鍵可放置方塊,輸入1-5的數(shù)字");
 gotoxy(42, 12);
 printf("1 ■ 墻壁 \t2 ★ 目標");
 gotoxy(42, 14);
 printf("3 ● 箱子 \t4 ♀ 人");
 gotoxy(42, 16);
 printf("其他 □ 空地");
 gotoxy(0, 19);
 printf("確認路徑后無誤后 按下 z 鍵享受一鍵無憂保存地圖!(a+)");
 gotoxy(0, 0);
}

void gotoxy(int x, int y)
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

如果對于程序代碼注釋有我沒寫明白的地方,歡迎在評論區(qū)下方留言詢問,如果我看到會盡最大的努力為您解惑。

不足之處:

暫不明確,歡迎提出建議。

最后,感謝所有愿意對我提出批評和建議的人,你們的支持是我堅持下去的強大動力。

相關文章

  • C語言 位段的詳細介紹

    C語言 位段的詳細介紹

    這篇文章主要介紹了C語言 位段的詳細介紹的相關資料,學習C語言基礎的朋友,可以參考本文,需要的朋友可以參考下
    2016-11-11
  • 利用C語言如何實現(xiàn)一些簡單圖形的打印

    利用C語言如何實現(xiàn)一些簡單圖形的打印

    這篇文章主要給大家介紹了關于利用C語言如何實現(xiàn)一些簡單圖形的打印的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C++ 中使用不同平臺的時間函數(shù)及對比分析

    C++ 中使用不同平臺的時間函數(shù)及對比分析

    在C++ 編程中,時間函數(shù)的選擇對于性能測量、任務調度和時間戳記錄至關重要,本文將介紹在 C++ 中常用的時間函數(shù),并比較它們在不同平臺上的應用和效果,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • C++實現(xiàn)的打字母游戲示例

    C++實現(xiàn)的打字母游戲示例

    這篇文章主要介紹了C++實現(xiàn)的打字母游戲,涉及C++字體操作、時間及鍵盤響應相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • 關于C++11中限定作用域的枚舉類型的問題

    關于C++11中限定作用域的枚舉類型的問題

    C++中有兩種類型的枚舉:不限定作用域的枚舉類型和限定作用域的枚舉類型。限定作用域的枚舉類型是C++11標準引入的新類型,對C++11中限定作用域的枚舉類型相關知識感興趣的朋友一起看看吧
    2022-01-01
  • C語言多功能動態(tài)通訊錄實現(xiàn)示例

    C語言多功能動態(tài)通訊錄實現(xiàn)示例

    這篇文章主要為大家介紹了C語言多功能動態(tài)通訊錄實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C語言非遞歸后序遍歷二叉樹

    C語言非遞歸后序遍歷二叉樹

    這篇文章主要為大家詳細介紹了C語言非遞歸后序遍歷二叉樹,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • OpenCV實現(xiàn)簡易標定板

    OpenCV實現(xiàn)簡易標定板

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡易標定板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++連接mysql數(shù)據(jù)庫的兩種方法小結

    C++連接mysql數(shù)據(jù)庫的兩種方法小結

    這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫的兩種方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別

    C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別

    這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論