有没有更有效的方法来编写这段代码?

时间:2013-09-06 21:54:08

标签: java minecraft

我正在为Minecraft制作一种“hack”或“mod”。它会删除你周围的街区,向前移动,删除更多,向前移动等。经过一段时间后,它会向侧面移动并向后移动。这就像世界正在慢慢地自我删除:D

if(Camb.nuker){
    whenToStop++;
    byte byte0 = 3;
    if(whenToStop < 60){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 60 && whenToStop < 65){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 65 && whenToStop < 124){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 124 && whenToStop < 129){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 129 && whenToStop < 188){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 188 && whenToStop < 193){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 193 && whenToStop < 252){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 252 && whenToStop < 257){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 257 && whenToStop < 316){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 316 && whenToStop < 321){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 321 && whenToStop < 376){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }

    for(int k = byte0; k > -byte0; k--)
    {
        for(int i1 = byte0; i1 > -byte0; i1--)
        {
            for(int j1 = byte0; j1 > -byte0; j1--)
            {
                double d1 = mc.thePlayer.posX + (double)k;
                double d3 = mc.thePlayer.posY + (double)i1;
                double d5 = mc.thePlayer.posZ + (double)j1;
                int k1 = (int)d1;
                int l1 = (int)d3;
                int i2 = (int)d5;
                int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                Block block = Block.blocksList[j2];
                if(block != null){
                    ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                    ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));   
                }
            }
        }
    }
}
if(Camb.nuker==false){
    whenToStop = 0;
}

您主要必须关注我声明字节的代码块。其余代码循环遍历块并打破它们,没什么特别的。

那么我如何才能使这一块代码更有效率呢?我正在考虑创建一个函数,但是我不太了解函数的功能,我该怎么做呢?例如,我将使用代码 functionname (要破坏的行数);

谢谢, 布拉德

5 个答案:

答案 0 :(得分:5)

首先点击if块可能是:

double dx = 0, dy = 0, dz = 0;
whenToStop++;
if (whenToStop < 60) {
  dz = -1.5;
} else if (whenToStop < 65) {
  dx = -1.2;
} else if (whenToStop < 124) {
  dz = +1.5;
} else if (whenToStop < 129) {
  dx = -1.2;
} else if (whenToStop < 188) {
  dz = -1.5;
} else if (whenToStop < 193) {
  dx = -1.2;
} else if (whenToStop < 252) {
  dz = +1.5;
} else if (whenToStop < 257) {
  dx = -1.2;
} else if (whenToStop < 316) {
  dz = -1.5;
} else if (whenToStop < 321) {
  dx = -1.2;
} else if (whenToStop < 376) {
  dz = +1.5;
}
setPosition(posX + dx, posY + dy, posZ + dz);

但这引发了一个问题当值恰好等于60 时会发生什么?这种影响是故意的吗?

现在它就是这种形式你应该可以使用某种形式的数组作为分裂点。

class D {
  final int p;
  final double x;
  final double y;
  final double z;

  public D(int p, double x, double y, double z) {
    this.p = p;
    this.x = x;
    this.y = y;
    this.z = z;
  }
}

D[] d = {
  new D(60,     0,   0, -1.5),
  new D(65,  -1.2,   0,    0),
  new D(124,    0,   0, +1.5),
  new D(129, -1.2,   0,    0),
  new D(188,    0,   0, -1.5),
  new D(193, -1.2,   0,    0),
  new D(252,    0,   0, +1.5),
  new D(257, -1.2,   0,    0),
  new D(316,    0,   0, -1.5),
  new D(321, -1.2,   0,    0),
  new D(376,    0,   0, +1.5),
};

...
  whenToStop++;
  D delta = null;
  for ( int i = 0; i < d.length && whenToStop < d[i].p; i++ ) {
    delta = d[i];
  }
  if ( delta != null ) {
    setPosition(posX + delta.x, posY + delta.y, posZ + delta.z);
  }

我现在说你就是你需要的地方。

答案 1 :(得分:1)

我将详细阐述@ MadProgrammer的建议:

创建一个结构来保存每个条件的限制和增量:

class Entry {
  int upper_limit;
  double delta_x;
  double delta_y;
  double delta_z;
}

然后使用数据填充结构列表:

ArrayList<Entry> entries;
entries.add(new Entry(60, 0., 0., -1.5));
entries.add(new Entry(65, -1.2, 0., 0.));
// Continue with the remaining entries.

然后将List传递给函数:

DoMove(List<Entry> entries, int when_to_stop, SomeClass mc,
       double pos_x, double pos_y, double pos_z) {

  for (Entry entry : entries) {
    if (when_to_stop < entry.upper_limit) {
      // move
    }
  }
 //  Default case or error
}

答案 2 :(得分:0)

我修改过的OldCurmudgeons代码版本。使它成为一个完整的函数(我假设播放器是PlayerType):

void move(PlayerType player, int step) {
    double dx = 0, dy = 0, dz = 0;
    int cycle = step % 128;
    if (cycle < 60) {
      dz = -1.5;
    } else if (cycle < 64) {
      dx = -1.2;
    } else if (cycle < 124) {
      dz = +1.5;
    } else {
      dx = -1.2;
    } 
    player.setPosition(player.posX + dx, player.posY + dy, player.posZ + dz);

}

然后你的“主程序”会把它称为:

final int LIMIT = 1000; // this will stop the movement

if (Camb.nuker) {
   move(mc.thePlayer, step++);
   <your for loop>
   if (step == LIMIT)
     Camb.nuker = false;
} else
  step = 0;

现在,您可以根据需要使用whenToStop的大值来无限制地使用它。

我也认为你在索引中有轻微的错误,所以我把它拉直到64/128周期。

编辑:最后一个街区不需要“if”。

Edit2:使它成为一个功能和“主程序”

Edit3:whenToStop是函数的参数,在函数内部没有++。

编辑4:在循环声明之前缺少'int'。

Edit5:'玩家'。缺少'pos':s

Edit6:重命名变量并添加了LIMIT

答案 3 :(得分:0)

循环可以改写为:

public void checkBytes(byte byte0) {
    double d1e = mc.thePlayer.posX - byte0;
    double d3e = mc.thePlayer.posY - byte0;
    double d5e = mc.thePlayer.posZ - byte0;
    for(double d1 = mc.thePlayer.posX + byte0; d1 > d1e; d1 -= 1.0) {
        for(double d3 = mc.thePlayer.posY + byte0; d3 > d3e; d3 -= 1.0) {
          for(double d1 = mc.thePlayer.posZ + byte0; d5 > d5e; d5 -= 1.0) {
                int k1 = (int)d1;
                int l1 = (int)d3;
                int i2 = (int)d5;
                int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                Block block = Block.blocksList[j2];
                if(block != null){
                   ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                   ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));
                }
            }
        }

    }
}

这将节省转换double&lt; - &gt; int的时间,并且两次减少添加次数:而不是对“k--”和“d1 = mc.thePlayer.posX + k” - 将会有“d1 - = 1.0”。

此外,如果值d1 / d3 / d5始终为正(我不确定),您可以将这些值定义为整数,并将强制转换为k1 / l1 / i2。

答案 4 :(得分:-1)

如果您不知道,有几个if(){}使编译器以相反的顺序检查它们,它会检查最后一个if if然后是if之前的那个然后等等

与if(){}不同,if if(){}

if else让编译器按书面顺序检查它们,代码中的第一个是第一个检查的

无论如何,这是一种重新格式化的代码

// in your Camb class if possible
//...
private boolean nuker = false;
// more code that changes the nuker variable
public static boolean isNuker(){
    return nuker;
}


// in this class
if(Camb.isNuker()){
        whenToStop++;
        byte byte0 = 3;
        checkWhenToStop(whenToStop)
        checkBytes(byte0)
}else{
    whenToStop = 0;
}

public void checkWhenToStop(int whenToStop){
    if(whenToStop < 60){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 60 && whenToStop < 65){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 65 && whenToStop < 124){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 124 && whenToStop < 129){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 129 && whenToStop < 188){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 188 && whenToStop < 193){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 193 && whenToStop < 252){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
    if(whenToStop > 252 && whenToStop < 257){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 257 && whenToStop < 316){
        mc.thePlayer.setPosition(posX, posY, posZ-1.5);
    }
    if(whenToStop > 316 && whenToStop < 321){
        mc.thePlayer.setPosition(posX-1.2, posY, posZ);
    }
    if(whenToStop > 321 && whenToStop < 376){
        mc.thePlayer.setPosition(posX, posY, posZ+1.5);
    }
}

public void checkBytes(byte byte0){
        for(int k = byte0; k > -byte0; k--){
            for(int i1 = byte0; i1 > -byte0; i1--){
                for(int j1 = byte0; j1 > -byte0; j1--){
                    double d1 = mc.thePlayer.posX + (double)k;
                    double d3 = mc.thePlayer.posY + (double)i1;
                    double d5 = mc.thePlayer.posZ + (double)j1;
                    int k1 = (int)d1;
                    int l1 = (int)d3;
                    int i2 = (int)d5;
                    int j2 = mc.theWorld.getBlockId(k1, l1, i2);
                    Block block = Block.blocksList[j2];
                    if(block != null){
                       ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(0, k1, l1, i2, 1));
                       ((EntityClientPlayerMP)mc.thePlayer).sendQueue.addToSendQueue(new Packet14BlockDig(2, k1, l1, i2, 1));
                    }
                }
            }

        }
}