江湖梦网游戏服务平台

 找回密码
 免费注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2631|回复: 1

[搬运汉化] 自动生成地牢迷宫

[复制链接]

449

帖子

41

精华

25

贡献

江湖英豪

检察者

Rank: 5Rank: 5Rank: 5

积分
7236
发表于 2020-2-24 19:13 | 显示全部楼层 |阅读模式

马上注册,享用更多精彩。

您需要 登录 才可以下载或查看,没有帐号?免费注册

x
本帖最后由 大魔王 于 2020-2-24 19:15 编辑


作者: 唐门草楹

https://rpg.blue/thread-479884-1-1.html


  1. //
  2. //  main.cpp
  3. //  随机生成地牢的C++程序。
  4. //  使用方法:
  5. //  游戏中新建一个游戏地图,地图图块选择MV自带的Dungeon
  6. //  程序中的Width与Height必须与所建地图的宽度与高度一致
  7. //  srand函数传入的随机数种子将产生伪随机数,相同的种子产生的随机数相同,
  8. //  要生成不同的地图请传入不同的种子。
  9. //  用记事本打开游戏目录下data文件夹里相应的地图文件,文件名为地图名,扩展名为json。
  10. //  复制程序的运行输出的结果覆盖住地图文件里的data数据,重新加载项目,就能看到该地图里随机生成的地牢地图。
  11. //
  12. //  Created by huanggaole on 2019/12/6.
  13. //  Copyright © 2019 huanggaole. All rights reserved.
  14. //

  15. #include <stdlib.h>
  16. #include <iostream>
  17. // 以下两行修改地图的宽与高
  18. #define Width 50
  19. #define Height 50
  20. // 以下四行修改地图的通道、障碍、墙壁底部与墙壁顶部的图块索引值
  21. #define Road 1553
  22. #define Barr 5964
  23. #define Wall1 6330
  24. #define Wall2 6322
  25. using namespace std;
  26. int main(int argc, const char * argv[]) {
  27.     int ** mapdata = new int* [Height]();
  28.     int ** lastdata = new int* [Height]();
  29.     // srand生成随机种子,同样的种子得到的地图是一样的。
  30.     srand(2);
  31.     for(int i=0;i<Height;i++){
  32.         mapdata[i] = new int[Width]();
  33.         lastdata[i] = new int[Width]();
  34.         
  35.         for(int j=0;j<Width;j++){
  36.             if(i <= 1 || j == 0 || i == Height-1 || j == Width - 1){
  37.                 lastdata[i][j] = mapdata[i][j] = Barr;
  38.             }else{
  39.                 lastdata[i][j] = mapdata[i][j] = rand()%2 == 0?Barr:Road;
  40.             }
  41.         }
  42.     }
  43.     int itertime = 10000;
  44.     while(itertime>0){
  45.         itertime--;
  46.         
  47.         for(int i=1;i<Height -1;i++){
  48.             for(int j=1;j<Width-1;j++){
  49.                 int roadCount = 0;
  50.                 for(int k = i - 1; k<= i + 1; k++){
  51.                     for(int l = j - 1; l <= j + 1;l++){
  52.                         if(k != i || l != j){
  53.                             if(lastdata[k][l] == Road){
  54.                                 roadCount++;
  55.                             }
  56.                         }
  57.                     }
  58.                 }
  59.                
  60.                 if(roadCount >4){
  61.                     mapdata[i][j] = Road;
  62.                 }else if(roadCount < 4){
  63.                     mapdata[i][j] = Barr;
  64.                 }
  65.                
  66.             }
  67.         }
  68.         
  69.         for(int i=0;i<Height;i++){
  70.             for(int j=0;j<Width;j++){
  71.                 lastdata[i][j] = mapdata[i][j];
  72.             }
  73.         }
  74.     }
  75.    
  76.     for(int i = Height - 2; i>2;i--){
  77.         for(int j = Width - 2;j>2;j--){
  78.             if(mapdata[i][j] == Road && mapdata[i - 2][j] == Road){
  79.                 mapdata[i-1][j] = Road;
  80.             }
  81.         }
  82.     }
  83.    
  84.     for(int i=Height - 2; i>=2;i--){
  85.         for(int j= Width - 1;j>0;j--){
  86.             if(mapdata[i][j] == Road && mapdata[i - 1][j] == Barr && mapdata[i - 2][j] == Barr){
  87.                 mapdata[i-1][j] = Wall1;
  88.                 if(i-3 >= 0 && mapdata[i-3][j] == Barr){
  89.                     mapdata[i-2][j] = Wall2;
  90.                 }else{
  91.                     mapdata[i-2][j] = Barr;
  92.                 }
  93.             }
  94.         }
  95.     }
  96.    
  97.     for(int k = 0; k<6; k++){
  98.         for(int i=0;i<Height;i++){
  99.             for(int j=0;j<Width;j++){
  100.                 if(k == 0){
  101.                     cout << mapdata[i][j]<<",";
  102.                 }else if(k == 4){
  103.                     if(j > 0 && mapdata[i][j] == Road && mapdata[i][j - 1] != Road){
  104.                         cout << "5,";
  105.                     }else{
  106.                         cout << "0,";
  107.                     }
  108.                 }else{
  109.                     cout << "0,";
  110.                 }
  111.             }
  112.         }
  113.     }
  114.     return 0;
  115. }

复制代码


204911y35sh3b353ovv5c7.png
204912xy8fmyaqmg1arizf.png
QQ群:135474765游戏群 [img]http://img2.17getfun.com/FhlesUf3VWxvhVFuc0qdBwYuanyt?imageMogr2/auto-orient/thumbnail/1080x%3E/format/jpg/

449

帖子

41

精华

25

贡献

江湖英豪

检察者

Rank: 5Rank: 5Rank: 5

积分
7236
 楼主| 发表于 2020-2-24 19:17 | 显示全部楼层
署名说明: 初步写了一个自动生成地牢迷宫的程序。C++编译运行,用输出结果替代地图json文件里的data数据即可。地图需采用MV默认的地图块集Dungeon。
QQ群:135474765游戏群 [img]http://img2.17getfun.com/FhlesUf3VWxvhVFuc0qdBwYuanyt?imageMogr2/auto-orient/thumbnail/1080x%3E/format/jpg/
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|手机版|Archiver|小黑屋|江湖梦网 ( 粤ICP备18126133号-1 )

GMT+8, 2024-11-1 08:01 , Processed in 0.278839 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表