- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经使用 Libgdx 从键盘字符中生成了一个地牢。我决定将数组打印为文本文件。
然而这是我得到的:
而且不一致
我不明白这是怎么回事?我检查了我的算法,没有发现任何错误。
这是我的代码:
public class test1 extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
int X = 50;
int Y = 25;
////////// # wall
////////// . ground
char[][][] mapChars = new char[1000][1000][1000];
private void genDung() {
int clearance = 4;
for (int i = 0; i < Y; i++) {
for (int j = 0; j <= X; j++) {
if(j == X)
mapChars[0][i][j] = '\n';
else
mapChars[0][i][j] = '#';
}
}
int roomCount = MathUtils.random(2, 2);
int[] roomPosX = new int[roomCount];
int[] roomPosY = new int[roomCount];
int[] roomCenterPosX = new int[roomCount];
int[] roomCenterPosY = new int[roomCount];
int[] roomSizeX = new int[roomCount];
int[] roomSizeY = new int[roomCount];
for (int i = 0; i < roomCount; i++) {
int attempts = 0;
while(true) {
boolean rePosition = false;
roomPosX[i] = MathUtils.random(1, X-1);
roomPosY[i] = MathUtils.random(1, Y-1);
roomSizeX[i] = MathUtils.random(2, 12);
roomSizeY[i] = MathUtils.random(2, 8);
for(int j = 0; j <= i; j++) {
if(i != j) {
if(roomPosX[i] >= roomPosX[j] && roomPosX[i] <= (roomPosX[j] + roomSizeX[j] + clearance)) {
if(roomPosY[i] >= roomPosY[j] && roomPosY[i] <= (roomPosY[j] + roomSizeY[j] + clearance)) {
rePosition = true;
break;
}
}
if((roomPosX[i]+roomSizeX[i]) >= roomPosX[j] && (roomPosX[i]+roomSizeX[i]) <= (roomPosX[j] + roomSizeX[j] + clearance)) {
if((roomPosY[i]+roomSizeY[i]) >= roomPosY[j] && (roomPosY[i]+roomSizeY[i]) <= (roomPosY[j] + roomSizeY[j] + clearance)) {
rePosition = true;
break;
}
}
if((roomPosX[i]) >= roomPosX[j] && (roomPosX[i]) <= (roomPosX[j] + roomSizeX[j] + clearance)) {
if((roomPosY[i]+roomSizeY[i]) >= roomPosY[j] && (roomPosY[i]+roomSizeY[i]) <= (roomPosY[j] + roomSizeY[j] + clearance)) {
rePosition = true;
break;
}
}
if((roomPosX[i]+roomSizeX[i]) >= roomPosX[j] && (roomPosX[i]+roomSizeX[i]) <= (roomPosX[j] + roomSizeX[j] + clearance)) {
if((roomPosY[i]) >= roomPosY[j] && (roomPosY[i]) <= (roomPosY[j] + roomSizeY[j] + clearance)) {
rePosition = true;
break;
}
}
}
else if(roomPosX[j] + roomSizeX[j] >= X-1){
rePosition = true;
}
else if(roomPosY[j] + roomSizeY[j] >= Y-1){
rePosition = true;
}
}
attempts++;
if(attempts >= 10000) break;
if(!rePosition) break;
}
}
for(int r = 0; r < roomCount; r++) {
for (int a = roomPosX[r]; a <= (roomPosX[r] + roomSizeX[r]); a++) {
for (int b = roomPosY[r]; b <= (roomPosY[r] + roomSizeY[r]); b++) {
mapChars[0][b][a] = '.';
}
}
}
Gdx.app.log("roomCount", String.valueOf(roomCount)+"\n\n\n");
for(int i =0; i< roomCount; i++) {
roomCenterPosX[i] = roomPosX[i] + roomSizeX[i]/2;
roomCenterPosY[i] = roomPosY[i] + roomSizeY[i]/2;
Gdx.app.log("room", String.valueOf(i)+"\n");
Gdx.app.log("roomPosX", String.valueOf(roomPosX[i]));
Gdx.app.log("roomPosY", String.valueOf(roomPosY[i]));
Gdx.app.log("roomSizeX", String.valueOf(roomSizeX[i]));
Gdx.app.log("roomSizeY", String.valueOf(roomSizeY[i])+"\n");
Gdx.app.log("RoomCenterPosX", String.valueOf(roomCenterPosX[i]));
Gdx.app.log("RoomCenterPosY", String.valueOf(roomCenterPosY[i])+"\n\n");
}
int difference = X;
int[] roomNum = new int[2];
for(int i = 0; i < roomCount; i++) {
for(int j = 0; j < roomCount; j++) {
if(i != j) {
if(abs(roomCenterPosX[i] - roomCenterPosX[j]) < difference) {
difference = abs(roomCenterPosX[i] - roomCenterPosX[j]);
roomNum[0] = i;
roomNum[1] = j;
}
}
}
}
Gdx.app.log("FarthestRooms", String.valueOf(roomNum[0]));
Gdx.app.log("FarthestRooms", String.valueOf(roomNum[1]));
int differenceX = X;
int differenceY = Y;
int[] connectRooms = new int[2];
// int[] roomsConnected = new int[roomCount];
connectRooms[0] = MathUtils.random(0, roomCount - 1);
// roomsConnected[0] = connectRooms[0];
int count;
for(int i = 0; i < roomCount-1; i++) {
int j;
while(true) {
connectRooms[1] = MathUtils.random(0, roomCount - 1);
/* while (true) {
connectRooms[1] = MathUtils.random(0, roomCount - 1);
count = 0;
for (j = 0; j < i; j++) {
if (connectRooms[1] != roomsConnected[j] && connectRooms[0] != roomsConnected[j]){
count++;
}
}
if(count >= i-2)
break;
}*/
if(connectRooms[0] != connectRooms[1])
break;
}
// roomsConnected[i+1] = connectRooms[1];
differenceX = roomCenterPosX[connectRooms[0]] - roomCenterPosX[connectRooms[1]];
differenceY = roomCenterPosY[connectRooms[0]] - roomCenterPosY[connectRooms[1]];
if(roomCenterPosX[connectRooms[0]] < roomCenterPosX[connectRooms[1]])
differenceX *= -1;
if(roomCenterPosY[connectRooms[0]] < roomCenterPosY[connectRooms[1]])
differenceY *= -1;
int k;
try {
if (differenceX > 0) {
for (k = 0; k < differenceX; k++) {
mapChars[0][roomCenterPosY[i]][roomCenterPosX[i] + k] = '.';
}
} else if (differenceX < 0) {
for (k = 0; k > differenceX; k--) {
mapChars[0][roomCenterPosY[i]][roomCenterPosX[i] + k] = '.';
}
} else k = 0;
if (differenceY < 0) {
for (int z = 0; z > differenceY; z--) {
mapChars[0][roomCenterPosY[i] + z][roomCenterPosX[i] + k] = '.';
}
} else if (differenceY > 0) {
for (int z = 0; z < differenceY; z++) {
mapChars[0][roomCenterPosY[i] + z][roomCenterPosX[i] + k] = '.';
}
} else {
}
}
catch (ArrayIndexOutOfBoundsException e) {
Gdx.app.log("Non Fatal Exception", String.valueOf(e));
}
Gdx.app.log("Connect", String.valueOf(connectRooms[0]));
Gdx.app.log("Connect", String.valueOf(connectRooms[1]));
Gdx.app.log("DifferenceX", String.valueOf(differenceX));
Gdx.app.log("DifferenceY", String.valueOf(differenceY)+"\n");
}
for(int q = 0; q < Y; q++) {
mapChars[0][q][X] = '\n';
}
for(int w = 0; w < Y; w++) {
mapChars[0][w][X-1] = '#';
}
for(int e = 0; e < Y; e++) {
mapChars[0][Y-1][e] = '#';
}
}
private void export() {
if(Gdx.files.isLocalStorageAvailable()) {
FileHandle fileHandle = Gdx.files.local("map.txt");
if(Gdx.files.local("map.txt").exists())
fileHandle.writeString("", false);
for(int i = 0; i<= Y; i++) {
for (int j = 0; j <= X; j++) {
fileHandle.writeString(""+mapChars[0][i][j] , true);
}
}
}
}
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
// genMap();
// for(int i = 0; i< 4; i++)
// refineMap();
genDung();
export();
}
@Override
public void render () {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
if(Gdx.input.isTouched()) {
// genMap();
// for(int i = 0; i< 4; i++)
// refineMap();
genDung();
export();
}
}
}
我希望这两个房间每次都能正确连接。如您所见,有一次,房间相连另一次房间不连通。
提前致谢
最佳答案
整个事情都可以简化,绝对需要重构。关于 2 房间连接 - 请仔细检查此部分
differenceX = roomCenterPosX[connectRooms[0]] - roomCenterPosX[connectRooms[1]];
differenceY = roomCenterPosY[connectRooms[0]] - roomCenterPosY[connectRooms[1]];
if(roomCenterPosX[connectRooms[0]] < roomCenterPosX[connectRooms[1]])
differenceX *= -1;
if(roomCenterPosY[connectRooms[0]] < roomCenterPosY[connectRooms[1]])
differenceY *= -1;
正如@kiheru 指出的,它等同于 Math.abs(roomCenterPosX[connectRooms[0]] - roomCenterPosX[connectRooms[1]])
(Y 也一样)。因此,您总是向右和向下“挖掘”,而不是向上或向左“挖掘”。
放弃这种倒置,尽情享受算法的其余部分吧:)
关于java - Libgdx 生成 RogueLIke Dungeon - 算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344541/
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在制作一款 roguelike 游戏,我正在尝试将“快速而肮脏”的 FOV 技术应用到我的游戏中,但我遇到了一些问题。我几乎可以肯定它在我的函数中完成了线计算,其中我有一个 x 和 y 变量沿着
我正在为一款基于 ascii 字符的 roguelike 游戏编写绘图系统(类似于矮人要塞的图形)。我正在使用 here 中的 AsciiPanel 。我的问题是,当我在 map 上绘制实体时,它们似
我正在做一个大学 compsci 项目,我需要一些关于视野算法的帮助。我主要工作,但在某些情况下,算法会看穿墙壁并突出显示玩家不应该看到的墙壁。 void cMap::los(int x0, int
作为 JAVA 继承的学习进程,我组合了一个调度程序类和参与者类。调度程序类创建一个参与者对象列表,并通过它们调用参与者的 act()。 现在,我对 actor 类的第一直觉是向玩家 actor 传递
我正在开发一款 Roguelike 游戏,作为编程/数据库练习和爱好(因为我想拥有自己的“矮人堡垒”项目来随心所欲地称霸)。当我试图编写一个足够强大的系统来生成游戏中的各种生物时,我很早就陷入了困境。
我继续在我的 python roguelike 上取得进展,并进一步深入学习本教程:http://roguebasin.roguelikedevelopment.org/index.php?title
当我尝试运行这段代码时,在 game_start 函数中创建的 pygame 窗口没有启动。当我删除 game_main_loop 功能时,它确实如此。我无法弄清楚该功能有什么问题,有人有任何想法吗?
我正在用 C 语言制作 Roguelike 游戏,但我无法让我的角色按照我想要的方式移动。我在点 (x, y) 处制作了一个带有字符的二维字符数组,绘制了数组,更改了 x 和 y 值,并根据输入的方向
好吧,这听起来像是一个疯狂的想法 - 但我有兴趣模仿 1980 年代的风格 roguelike game纯 Java 中的文本界面,即使用 Swing 或类似软件。 这里大致是它需要做的: 提供固定大
又是我。我仍在开发 Roguelike 游戏,但我还有另一个问题。我使用 Jlabel 的 2D 数组在 GridLayout 上显示我的 map ,它工作得很好。但现在,我想在地板上画我的角色、怪物
[更新] 我尝试使用下面的建议,但仍然有一个问题,即敌人似乎同时移动,并且当第一次看到是否已经有敌人在视线中时,他们每个移动两次。我真正想做的是在玩家视线中的敌人的行动之间有一个延迟,这样他们就不会同
我已经使用 Libgdx 从键盘字符中生成了一个地牢。我决定将数组打印为文本文件。 然而这是我得到的: 而且不一致 我不明白这是怎么回事?我检查了我的算法,没有发现任何错误。 这是我的代码: publ
几个月来我一直梦想制作 Roguelike,但出于某种原因,我固执的头脑不允许我使用图书馆。如何在不使用 stdio.h 以外的库的情况下绘制 map 并对其进行操作? 最佳答案 C 不知道“键盘”或
我有一些现有的 C# 代码,用于一个非常非常简单的 RogueLike 引擎。故意天真,因为我试图尽可能简单地做最少的事情。它所做的只是使用箭头键和 System.Console 在硬编码 map 周
我正在使用 Objective-C/Cocoa 开发一款 Roguelike 游戏,以了解更多信息。我已经掌握了大部分基本功能,但仍然有一个问题一直在试图解决。 以下是该过程的分割: 首先,加载 ma
我正在使用 libtcod 和 python 来制作 roguelike;我正在跟随的教程中,只有当您在怪物的视野中时,怪物才会跟随您。显然这是不够的;因为这意味着您可以转弯,而他们不会跟着您转弯。
我一直在考虑使用 Silverlight 构建基于 Web 的 Roguelike 游戏(或者可能只是使用 WPF 的桌面游戏)。 如果您不知道 Roguelike 是什么,它是一种图形角色扮演游戏,
我刚刚完成 this tutorial 的工作用于在 Python 中编写 Roguelike 程序,现在我非常依赖自己来确定去哪里以及下一步该做什么。 我的困境在于代码的困惑。我想将元素存储在某处,
Similar question found here 我正在开发一款用 Haskell 编写的 Roguelike 游戏。我决定使用 Data.Array.Repa 将世界表示为 2D 网格。 ,现
我是一名优秀的程序员,十分优秀!