ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-08 18:03:12  阅读:187  来源: 互联网

标签:baba 24 逻辑 java get text getX getY win


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

4.4.3.1 优化

我们依旧会遇到无限的递归循环之中,即如果我们将Push块重叠,控制台报错:
在这里插入图片描述
此时,较好的解决办法就是,碰到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.这里就运用了面向对象的继承、多态思想。
在这里插入图片描述
​ 此外,这里的逻辑与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;
        }
    }

}

目前,我们的获胜条件从控制台输出,之后,我们回对获胜界面进行优化
在这里插入图片描述

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

标签:baba,24,逻辑,java,get,text,getX,getY,win
来源: https://blog.csdn.net/m0_46565757/article/details/122383657

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有