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

时间:2017-01-15 17:54:54

标签: java android multidimensional-array

好的,我正在空闲时间玩游戏以获得乐趣。这不适用于工作或学校。我毕业了。我没有做的是毕业于游戏编程,所以我正在学习它。我开发了几款游戏,但这可能是我最先进的游戏。

我有大约5个2d阵列。一个用于保持位图,一个用于保持X位置,一个用于保持Y位置,一个用于保持元素的状态(它们是鸟类,状态用于飞行状态和命中状态),一个用于标识元素是什么。每个阵列一起工作,给我一个游戏板,鸟儿扇动翅膀。我可以触摸游戏板,我得到了位置。这一部分都有效。

我要做的是创建一种方法来检测附近的元素是否与标记元素(触摸的项目)相同。当发生这种情况时,我基本上想要将所有这些元素标记为“命中”。这不仅仅是获取元素周围的8个块,这使得每个项目都触及标记的项目并将其标识为“命中”。你可能也玩过这样的游戏。它们像游戏一样难以玩耍(因为鸟类在你身上粪便而且会杀死你的角色:)所以它们会变得更加冷却。)我创建了另一个2D数组来处理命中状态(在我尝试解决问题的最新版本中,所以我不会重复计算命中,我现在用它来标记我不计算的项目-1 。

我的数组都是[8] [8]数组。他们不会改变,他们将永远这样。这应该会更容易。举个例子:

sample from game

图像中带圆圈的红色鸟类也应该被标记为命中。

代码:

 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);
}

我尝试了几种不同的方法,这只是本文写作的最新内容。有些人比其他人更接近,但没有人得到它。这些似乎应该是一个非常简单的事情,但我不是专业的游戏程序员,游戏编程是我想要学习的东西。

上面的代码基本上将2D数组从您触摸的位置分解为象限。我用这个尝试添加了控件“countingArray”,因为我知道没有真正的方法可以使用这种方法停止重复计数而无需某种方式来跟踪它。它从触摸点向左/向下,向左,向上,向右/向下,向右/向上移动。 顶部附近的接触点:

int currentRow = targetBirdRow;
int currentCol = targetBirdCol;
int hitbird = whichBird[targetBirdRow][targetBirdCol];

hit 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();

Full Game Image 我已编辑添加完整的游戏图像。关于它为什么过于复杂的问题促使我解释一下。 (是的,可能有更好的方法来做到这一点 - 我当然不是这方面的专家)。这个想法是,当鸟儿被击中时,显示一个简短的命中图像,让击中的鸟儿消失,然后从左边移动鸟类,添加一只新鸟来替换击中的鸟类。这种结构都有效 - 如果不是在设计中复杂的话。单击打击工作,炸弹击中工作(当你拍摄随机出现在板上的炸弹作为新鸟)。我使用位置数组来指导需要移动的鸟类的动画,以填补命中鸟类留下的空隙。我不会对获得更好的方法感到惊讶,我在这里这样做是为了学习,所以我可以随意在问题的原始范围之外发表评论。它可能会帮助其他人学习和我;而且我认为这确实是这样一个网站最重要的一点。

就我开始工作有困难而言。当我开枪时,我们的想法就是将所有与相同颜色/物种的鸟类挂在一起,触及击中的鸟,将它们标记为击中,然后使它们消失。是的,我目前为该部分编写的代码可能是我编写的最复杂的版本。我现在至少开始了十几次。最简单的版本涉及两组循环和较少的外部方法(它的大小只有一半) - 它和这个一样有效,但往往标记额外的鸟类。这个似乎没有标记额外的鸟类,但并没有得到它们全部。

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

1 个答案:

答案 0 :(得分:0)

可能你的垮台可能是设计上的复杂化。我很难理解为什么你需要5个8x8阵列来存储2D游戏板。

为了简单起见,您的标记打击平铺及其周围的解决方案应该是这样的:

sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

当然,您需要添加自己的处理,图像加载,渲染和数组条目,但是不需要像这样在2D游戏板的数组中存储位置,因为位置可以是由瓷砖指数暗示。

我希望这能让你继续 。但我担心我不完全理解你原来的节目/前提。