Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用2D数组的Android视频游戏-查找连接匹配_Java_Android_Multidimensional Array - Fatal编程技术网

Java 使用2D数组的Android视频游戏-查找连接匹配

Java 使用2D数组的Android视频游戏-查找连接匹配,java,android,multidimensional-array,Java,Android,Multidimensional Array,好的,我在空闲时间制作一个游戏来娱乐。这不是为了工作或上学。我毕业了。我没有做的是从游戏编程专业毕业,所以我正在一边学习。我已经开发了几个游戏,但这一个可能是我最先进的 我有大约5个2d阵列。一个用来保存位图,一个用来保存X位置,一个用来保存Y位置,一个用来保存元素的状态(它们是鸟,状态是飞行状态和命中状态),还有一个用来标识元素是什么。每个阵列一起工作,给了我一个游戏板与鸟类拍动翅膀。我能触摸到游戏板,我就能找回位置。这部分都很有效 我试图做的是创建一种方法来检测附近的元素是否与标记的元素(被

好的,我在空闲时间制作一个游戏来娱乐。这不是为了工作或上学。我毕业了。我没有做的是从游戏编程专业毕业,所以我正在一边学习。我已经开发了几个游戏,但这一个可能是我最先进的

我有大约5个2d阵列。一个用来保存位图,一个用来保存X位置,一个用来保存Y位置,一个用来保存元素的状态(它们是鸟,状态是飞行状态和命中状态),还有一个用来标识元素是什么。每个阵列一起工作,给了我一个游戏板与鸟类拍动翅膀。我能触摸到游戏板,我就能找回位置。这部分都很有效

我试图做的是创建一种方法来检测附近的元素是否与标记的元素(被触摸的项目)相同。当这种情况发生时,我基本上希望将所有这些元素标记为“命中”。这不仅仅是获取元素周围的8个块,这是获取每个与标记项接触的项,并将它们标识为“命中”。你可能玩过这样的游戏。它们是益智类游戏(因为鸟会在你身上大便,杀死你的角色:))。我创建了另一个2D数组来跟踪命中状态(在我试图解决这个问题的最新迭代中,所以我不会重复计算命中次数,现在我使用它来标记我不使用-1计数的项目)

我的数组都是[8][8]数组。它们不会改变,它们总是这样。这应该会更容易。例如:

图片中圈出的红色小鸟也应该被标记为击中

关于守则:

 public void calculateGunDestruction(){
    int currentRow = targetBirdRow;
    int currentCol = targetBirdCol;
    int hitbird = whichBird[targetBirdRow][targetBirdCol];
    boolean[] pathState = new boolean[5];
    countedArray = new int[8][8];
    for(int j = 0; j < countedArray.length;j++){
        for(int jj = 0; jj< countedArray[j].length;jj++){
            countedArray[j][jj] = 0;
        }
    }
    for(int i = currentRow;i < whichBird.length; i++) {
        for (int ii = currentCol; ii < whichBird[i].length; ii++) {
            pathState = pathMatch(i,ii,hitbird);
            if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
                break;
            }
        }
        if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
            break;
        }
    }
    for(int i = currentRow;i > -1; i--) {
        for (int ii = currentCol; ii < whichBird[i].length; ii++) {
            pathState = pathMatch(i,ii,hitbird);
            if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
                break;
            }
        }
        if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
            break;
        }
    }
    for(int i = currentRow;i < whichBird.length; i++) {
        for (int ii = currentCol; ii > - 1; ii--) {
            pathState = pathMatch(i,ii,hitbird);
            if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
                break;
            }
        }
        if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
            break;
        }
    }
    for(int i = currentRow;i > -1; i--) {
        for (int ii = currentCol; ii > - 1; ii--) {
            pathState = pathMatch(i,ii,hitbird);
            if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
                break;
            }
        }
        if(!pathState[0] && !pathState[1] && !pathState[2] && !pathState[3]){
            break;
        }
    }
}


 public boolean[] pathMatch(int i, int ii, int hitbird){

    boolean pathTop = false;
    boolean pathBottom = false;
    boolean pathLeft = false;
    boolean pathRight = false;

    if(findMatch(i,ii,hitbird)) {
        if(countedArray[i][ii] == 0) {
            countedArray[i][ii] = 1;
            destroyedBirds(i, ii);
        }
        if((i - 1) > -1) {
            if (countedArray[i - 1][ii] == 0) {
                if (findMatch(i - 1, ii, hitbird)) {
                    countedArray[i - 1][ii] = 1;
                    destroyedBirds(i - 1, ii);
                    pathLeft = true;
                } else {countedArray[i - 1][ii] = -1;pathLeft = false;}
            } else {pathLeft = false;}
        } else {pathLeft = false;}
        if((i + 1) < 8) {
            if (countedArray[i + 1][ii] == 0) {
                if (findMatch(i + 1, ii, hitbird)) {
                    countedArray[i + 1][ii] = 1;
                    destroyedBirds(i + 1, ii);
                    pathRight = true;
                } else {countedArray[i + 1][ii] = -1;pathRight = false;}
            } else {pathRight = false;}
        }else {pathRight = false;}
        if((ii - 1) > -1) {
            if (countedArray[i][ii - 1] == 0) {
                if (findMatch(i, ii - 1, hitbird)) {
                    countedArray[i][ii - 1] = 1;
                    destroyedBirds(i, ii - 1);
                    pathTop = true;
                } else {countedArray[i][ii - 1] = -1;pathTop = false;}
            } else {pathTop = false;}
        } else {pathTop = false;}
        if((ii + 1) < 8) {
            if (countedArray[i][ii + 1] == 0) {
                if (findMatch(i, ii + 1, hitbird)) {
                    countedArray[i][ii + 1] = 1;
                    destroyedBirds(i, ii + 1);
                    pathBottom = true;
                } else {countedArray[i][ii + 1] = -1;pathBottom = false;}
            } else {pathBottom = false;}
        }else {pathBottom = false;}
    }else{
        countedArray[i][ii] = -1;
    }

    return new boolean[]{pathTop,pathBottom,pathLeft,pathRight};
}

public boolean findMatch(int row,int col,int hitbird){
    if(hitbird == whichBird[row][col]){
        return true;
    }
    return false;
}
public void destroyedBirds(int row,int col){
    destroyedBirdsRow.add(0, row);
    destroyedBirdsCol.add(0, col);
}
hit bird持有触碰的bird或元素的标识符。这不是一个非常优雅的解决方案,但它也不起作用。在这一点上,优雅被抛到了窗外,我即将编写一段长而难看的代码,没有人能读到它,检查每个项目,没有循环,希望它能起作用。因此,鹅卵石解决方案是可行的好的

为了便于参考,调用上述代码的区域如下所示:

if(playerObj.getWeaponSelected() == wGun) {
    calculateGunDestruction();//CALLING FUNCTION

    for (int i = 0; i < destroyedBirdsRow.size(); i++) {
        state[destroyedBirdsRow.get(i)][destroyedBirdsCol.get(i)] = hit;
    }
    destroyedBirdsRow.clear();
    destroyedBirdsCol.clear();
if(playerObj.getWeaponSelected()==wGun){
CalculateUndestruction();//调用函数
对于(int i=0;i
我已经编辑添加了一个完整的游戏图像。关于为什么它过于复杂的问题促使我解释了一下。(是的,可能有更好的方法可以做到这一点——我当然不是这方面的专家)。这个想法是,当鸟被击中时,显示一个简短的击中图像,使击中的鸟消失,然后将鸟从左侧移入,添加一只新鸟替换被击中的鸟。这种结构可以工作——如果不是设计过于复杂的话。单次击中有效,炸弹击中有效(当你射击一个随机出现在黑板上的炸弹时,它是一只新鸟)。我使用位置数组来引导需要移动的鸟的动画,以填补被击中的鸟留下的空白。如果知道更好的方法,我不会感到惊讶,我在这里做这件事是为了学习,所以请在问题的原始范围之外随意评论。这可能会帮助其他试图学习的人,还有我;我认为这是真的y是这样一个站点最重要的一点

就我的工作而言,我遇到了困难。当我开枪的时候,我的想法是把所有接触到被击中鸟的颜色/种类相同的鸟钉在一起,标记为被击中,然后让它们消失。是的,我目前为该部分编写的代码可能是我编写的最复杂的版本。我至少重新开始了现在已经有十几次了。最简单的版本涉及两组循环和较少的外部方法(它是大小的一半)-它的工作原理和这个一样好,但倾向于标记额外的鸟。这个似乎没有标记额外的鸟,但没有得到所有的鸟


过去我曾制作过一些小游戏,但这是迄今为止我尝试过的最复杂的一款游戏,它看起来相当不错,除了整个分组杀戮游戏。

这可能是因为设计过于复杂。我很难理解为什么需要5个8x8阵列来存储2D游戏板

为简单起见,您标记hit Tile及其周围的解决方案应如下所示:

public static final int NOTHING=0,BIRD_FLYING=1,BIRD_HIT=2,
                        TILE_LAND=0,TILE_WATER=1;

private int[][] gameBoard=new int[8][8]; // Store terrain etc.
private int[][] birds=new int[8][8]; // Store entities on the map
private int tileSize=32; // Store the size of the tile in pixels
private Image landImg,seaImg,flyingImg,hitImg; // Store the tile images (or use 1 tilesheet and segment it in the draw method)

private void hitTile(int x,int y)
{
    for(int i=-1;i<=1;i++)
    {
        for(int j=-1;j<=1;j++)
        {
            birds[hitX+i,hitY+j]=BIRD_HIT;
        }
    }
}

private void drawTheTiles()
{
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            // Draw background tiles first
            switch(gameBoard[i][j])
            {
                default:
                case TILE_LAND:
                    g.drawImage(landImg,i*tileSize,j*tileSize,this);
                    break;
                case TILE_SEA:
                    g.drawImage(seaImg,i*tileSize,j*tileSize,this);
                    break;
            }
            // Draw entities on tiles last
            switch(gameBoard[i][j])
            {
                default:
                case NOTHING:
                    // Don't draw anything
                    break;
                case BIRD_FLYING:
                    g.drawImage(flyingImg,i*tileSize,j*tileSize,this);
                    break;
                case BIRD_HIT:
                    g.drawImage(hitImg,i*tileSize,j*tileSize,this);
                    break;
            }
        }
    }
}
public static final int NOTHING=0,BIRD_FLYING=1,BIRD_HIT=2,
瓷砖地=0,瓷砖水=1;
私有int[][]游戏板=新int[8][8];//存储地形等。
private int[][]birds=new int[8][8];//在地图上存储实体
private int tileSize=32;//以像素为单位存储平铺的大小
私有图像landImg、seaImg、flyingImg、hitImg;//存储平铺图像(或使用1个平铺并在绘制方法中分割)
私有无效Hittle(整数x,整数y)
{

对于(inti=-1;这是我选择这么多数组的唯一原因(是的,可能太复杂了)8X8板不是整个游戏板。X和Y位置被存储以开始在游戏板上的放置,然后当被击中时,它们短暂地保持被击中的标记,然后被击中的鸟消失,新的鸟从左侧飞入-改变X和Y位置。因此,将它们放在阵列形式中,我可以将其运行到一个循环中因此,更容易地显示更改动画。(或者至少是我能想到的最简单的方式)。在8X8板下面有一个播放器,她向鸟射击。她在用力时会失去健康。我想我可能会改变我原来的想法。我有单打功能。我可以完成炸弹命中(清除所有单一颜色的鸟)但是,这组热门的东西会吸引比我聪明得多的人。我只是不喜欢放弃一些东西,因为它太难了,而事实上,它太难了,让我更难找到解决办法。
public static final int NOTHING=0,BIRD_FLYING=1,BIRD_HIT=2,
                        TILE_LAND=0,TILE_WATER=1;

private int[][] gameBoard=new int[8][8]; // Store terrain etc.
private int[][] birds=new int[8][8]; // Store entities on the map
private int tileSize=32; // Store the size of the tile in pixels
private Image landImg,seaImg,flyingImg,hitImg; // Store the tile images (or use 1 tilesheet and segment it in the draw method)

private void hitTile(int x,int y)
{
    for(int i=-1;i<=1;i++)
    {
        for(int j=-1;j<=1;j++)
        {
            birds[hitX+i,hitY+j]=BIRD_HIT;
        }
    }
}

private void drawTheTiles()
{
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            // Draw background tiles first
            switch(gameBoard[i][j])
            {
                default:
                case TILE_LAND:
                    g.drawImage(landImg,i*tileSize,j*tileSize,this);
                    break;
                case TILE_SEA:
                    g.drawImage(seaImg,i*tileSize,j*tileSize,this);
                    break;
            }
            // Draw entities on tiles last
            switch(gameBoard[i][j])
            {
                default:
                case NOTHING:
                    // Don't draw anything
                    break;
                case BIRD_FLYING:
                    g.drawImage(flyingImg,i*tileSize,j*tileSize,this);
                    break;
                case BIRD_HIT:
                    g.drawImage(hitImg,i*tileSize,j*tileSize,this);
                    break;
            }
        }
    }
}