java swing实战——baba is you(push逻辑完善,win逻辑实现)

4.4.3 Push逻辑优化以及Text的推动逻辑

4.4.3.1 优化

我们依旧会遇到无限的递归循环之中,即如果我们将Push块重叠,控制台报错:
java swing实战——baba is you(push逻辑完善,win逻辑实现)
此时,较好的解决办法就是,碰到stop块反弹后,我们立刻返回上级递归

/**
 * stop逻辑
 */
List<People> stopList = this.peopleMap.get(stop);
for (int i = 0; i < stopList.size(); i++) { // 遍历所有不可动的对象判断
    People stopPeople = stopList.get(i);
    if(stopPeople.getX() == you.getX() && stopPeople.getY() == you.getY()) { // 发生碰撞
        // 反弹
        if (you.up) {
            you.setY(you.getY() + 24);//y += 24;
        } else if (you.down) {
            you.setY(you.getY() - 24);//y -= 24;
        } else if (you.right) {
            you.setX(you.getX() - 24);//x -= 24;
        } else if (you.left) {
            you.setX(you.getX() + 24);//x += 24;
        }
        return;// 优化
    }
}

​ 仅仅多了一行return,游戏的运行效率大大提高,无限递归也解决了,同理,由于我们游戏中每个Block只能碰撞stop、push、win、text一次,因此每种碰撞结果后,都添加return,这样可以避免一些莫名其妙的报错

4.4.3.2 Text块的推动逻辑

我们操作Text的逻辑与Push块相同,因此,我们需要让GameFrame将gameText也传递给GamePeople,此外,我们需要注意的是,我们要将you的类型改为People和Text的父类Block.这里就运用了面向对象的继承、多态思想。
java swing实战——baba is you(push逻辑完善,win逻辑实现)
​ 此外,这里的逻辑与push基本相同,如下为代码展示:

/**
 * text推动逻辑
 */
List<Text> textList = gameText.getTextList();
for (int i = 0; i < textList.size(); i++) {
    Text text = textList.get(i);
    if(text == you) continue;
    if(text.getX() == you.getX() && text.getY() == you.getY()) {
        move(direction, text, stop, push, gameText);
    }
    return;
}

4.5 FLAG is WIN

​ 现在,我们处理游戏胜利的判断,同上面一样,我们先默认FLAG is WIN,先在GamePeople完成WIN的逻辑:

  • 在GameFrame中,默认规则Flag is win
String win = PeopleLocation.FLAG; // 默认flag is win
  • 获胜条件,我们的角色或者推动的物体碰撞具有win属性的物体(目前默认为flag)即为获胜【本规则与原版游戏略有差异,让获胜条件更加灵活】
public void move(int direction, Block you, String stop, String push, String win , GameText gameText) {
    /**
     * 先移动
     */
    switch (direction) {
        case 1:
            you.up = true;
            you.down = you.right = you.left = false;
            you.setY(you.getY() - 24);//y -= 24;
            break;
        case -1:
            you.down = true;
            you.up = you.right = you.left = false;
            you.setY(you.getY() + 24);//y += 24;
            break;
        case 2:
            you.right = true;
            you.up = you.down = you.left = false;
            you.setX(you.getX() + 24);//x += 24;
            break;
        case -2:
            you.left = true;
            you.up = you.right = you.down = false;
            you.setX(you.getX() - 24);//x -= 24;
            break;
    }

    /**
     * stop逻辑
     */
    List<People> stopList = this.peopleMap.get(stop);
    for (int i = 0; i < stopList.size(); i++) { // 遍历所有不可动的对象判断
        People stopPeople = stopList.get(i);
        if(stopPeople.getX() == you.getX() && stopPeople.getY() == you.getY()) { // 发生碰撞
            // 反弹
            if (you.up) {
                you.setY(you.getY() + 24);//y += 24;
            } else if (you.down) {
                you.setY(you.getY() - 24);//y -= 24;
            } else if (you.right) {
                you.setX(you.getX() - 24);//x -= 24;
            } else if (you.left) {
                you.setX(you.getX() + 24);//x += 24;
            }
            return;// 优化
        }
    }


    /**
     * push逻辑
     */
    List<People> pushList = this.peopleMap.get(push);
    for (int i = 0; i < pushList.size(); i++) { // 遍历所有Push的对象判断
        People pushPeople = pushList.get(i);
        if (pushPeople == you) continue;
        if (pushPeople.getX() == you.getX() && pushPeople.getY() == you.getY()) { // 发生碰撞
            move(direction, pushPeople, stop, push,win, gameText);
        }
    }

    /**
     * text推动逻辑
     */
    List<Text> textList = gameText.getTextList();
    for (int i = 0; i < textList.size(); i++) {
        Text text = textList.get(i);
        if(text == you) continue;
        if(text.getX() == you.getX() && text.getY() == you.getY()) {
            move(direction, text, stop, push,win, gameText);
            return;
        }
    }


    /**
     * win逻辑
     */
    List<People> winList = this.peopleMap.get(win);
    for (int i = 0; i < winList.size(); i++) {
        People winPeople = winList.get(i);
        if(winPeople.getX() == you.getX() && winPeople.getY() == you.getY()) {
            System.out.println("胜利了");
            return;
        }
    }

}

目前,我们的获胜条件从控制台输出,之后,我们回对获胜界面进行优化
java swing实战——baba is you(push逻辑完善,win逻辑实现)

那么,现在我们完成了游戏基本的逻辑,下几章,我们进行改变游戏规则的逻辑实现。

上一篇:leetcode刷题_JAVA(24)哈希表相关问题讲解(4)LRU缓存机制(#146)


下一篇:SessionManager