创建" Pixel"在2D阵列中键入形状

时间:2015-08-18 20:36:44

标签: java arrays multidimensional-array arraylist

我是一名初学程序员,目前正在制作基于网格的策略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,以及" fire"目标传递给目标方块中的敌人列表(2d数组的单元格)。

我计划有很多这些形状,并且它们也有不同的尺寸,例如:加号,x,锥形,v形,手形,眼形,微笑形,方形,圆形等。复杂性增加了一些与玩家面对面改变的目标。目前我通过填充点的ArrayList来实现这一点:

public ArrayList<Point> getTargetArea (int facing, Target tCenter){
    ArrayList<Point> targetArea = new ArrayList<>();
    int x = tCenter.getX();
    int y = tCenter.getY();
    switch (shape){
        case "Dot":
            break;
        case "Small X":
            targetArea.add(new Point(x-1,y-1));
            targetArea.add(new Point(x+1,y+1));
            targetArea.add(new Point(x+1,y-1));
            targetArea.add(new Point(x-1,y+1));
            break;
        case "Small Cone":
            if (facing==GC.FACING_UP){
                targetArea.add(new Point(x-1,y-1));
                targetArea.add(new Point(x,y-1));
                targetArea.add(new Point(x+1,y-1));
            }
            else if (facing==GC.FACING_RIGHT){
                targetArea.add(new Point(x+1,y+1));
                targetArea.add(new Point(x+1,y));
                targetArea.add(new Point(x+1,y-1));
            }

            and so on...

当我第一次设置它时,我承认这是一个临时措施,现在我又回来添加更复杂的形状(较大的形状有40+点)我花时间重新审视这是如何完成的。如果我坚持使用这个设计,我会预先创建每个不同类型的targetArea(cone,x等)作为私有静态final ArrayList,或者在方法中创建它们。

我在想从文本文件中解析形状可能是一种更好的方法,但作为一名新程序员,我可能会错过一些明显的方法来轻松完成这项任务。

所以,要关注:

将网格形状添加到2D阵列的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

你有几个选择。

首先,您可以在源代码中声明形状,例如:使用字节数组:

for (int r = 0; r < shape.length; ++r) {
  for (int c = 0; c < shape[r].length; ++c) {
    if (shape[r][c] != 0) {
      targetArea.add(new Point(x + c, y + r));
    }
  }
}

然后你可以将它渲染到目标区域,如下所示:

(x, y)

您可能还想引入一个偏移参数,在这种情况下将其移动(-1,-1),以使中心位于String shape = "X X\n" + " \n" + "X X\n";

这样做的两个缺点是:

  1. 数组是可变的,因此如果您不是每次都重新分配数据,则可能会意外地踩踏数组中的数据。
  2. 看看形状是什么有点棘手。你可以眯着眼睛转过头,但这有点抽象。
  3. 第一点的解决方案是使用一些不可变的结构。例如,您可以使用字符串,例如:

    X

    然后将其拆分为行,并添加一个找到<div ng-app> <div ng-controller="Ctrl"> <ul> <li ng-repeat="item in Data"> <input ng-model="item.Value" /> </li> </ul> Total: {{sum(Data)}} </div> </div> function Ctrl($scope) { $scope.Data = [ { Value: 1 }, { Value: 2 }]; $scope.sum = function(list) { var total=0; angular.forEach(list , function(item){ total+= parseInt(item.Value); }); return total; } } 的点。虽然看起来形状仍然有点难度。

    第二点的解决方案是将图像存储为位图图像。您可以使用ImageIO从文件加载图像,为您提供BufferedImage。您可以使用BufferedImage.getRGB()查询像素颜色。因此,只需浏览图像中的所有x和y,然后检查像素是否为白色(添加点)或黑色(不要添加点)。