我是一名初学程序员,目前正在制作基于网格的策略游戏,其中角色可以创建不同形状的目标,在范围内移动这些目标,以及" 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阵列的最佳方法是什么?
答案 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";
。
这样做的两个缺点是:
第一点的解决方案是使用一些不可变的结构。例如,您可以使用字符串,例如:
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,然后检查像素是否为白色(添加点)或黑色(不要添加点)。