当前位置: 首页 > 知识库问答 >
问题:

调试游戏逻辑

阎阎宝
2023-03-14

规格-

在游戏中,孩子们坐成一圈,圈外的一个人(领导者)唱一首固定字数的歌。绕着圆圈顺时针移动,领导者为歌曲中的每个单词指向环中的一个新孩子。歌曲最后一个词被指向的孩子出局,必须离开圆圈。领导者然后用较小的圆重复这个过程。游戏继续进行,直到最后一个孩子被淘汰。这个孩子是开始下一个游戏的领导者。

我几乎已经弄明白了这个逻辑,但在我的数组索引中找不到一个bug,我将当前元素添加到另一个数组中(以显示消除的子元素),然后将它们从当前数组中删除。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Practice {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter number of kids: ");
        int kidCount = sc.nextInt();
        List<Integer> kids = new ArrayList<Integer>();
        List<Integer> rejects = new ArrayList<Integer>();

        System.out.println("Enter number of words in the song: ");
        int words = sc.nextInt();

        int wordCount = 0;

        for (int i = 1; i <= kidCount; i++) {
            kids.add(i);
        }

        for (int i = 0; i < kids.size(); i++) {
            wordCount++;

            if (wordCount % words == 0) {
                rejects.add(kids.get(i));
                kids.remove(kids.get(i));

            }

            if (i == kids.size() - 1) {
                if (wordCount % words != 0) {
                    i = 0;
                } else {
                    rejects.add(kids.get(i));
                    kids.remove(kids.get(i));
                }
            }
        }
        System.out.println(rejects.toString());
    }
}

如果有6个孩子和3个单词,预期输出:3 6 4 2 5 1

电流输出:[3,2,4,6]

共有1个答案

东门越
2023-03-14

您循环遍历孩子的方式有缺陷。您“循环”的方式将始终跳过孩子1,因为您在执行i之前立即设置了i=0。此外,如果您在最后一个之前删除了孩子,例如孩子5,您将立即删除最后一个孩子,例如孩子6,因为孩子数组的大小已更改,并且您有第二个删除子句。此外,在删除最后一个孩子后,循环将立即退出,即使还有更多孩子,仅仅是因为它没有在列表末尾的其他中设置i=0

一般来说,您应该避免使用for,因为您经常弄乱计数器。的应该表示单个传递。您试图完成的是循环,带有就地删除。事实上,您的主要错误是条件的,因为它不是对您想要的子级进行迭代,而是循环,直到只剩下一个子级。

因此,更干净的实现是:

int i = 0;
while (kids.size() > 1) { // Loop until we have a winner
    wordCount++; // Give the kid a word
    if (wordCount >= words) { // It's the last word, he's out
        rejects.add(kids.remove(i)); // Remove the kid at index i and place it into rejects
        // P.S. Small issue with ArrayList API: If your object type is Integer, then there's ambiguity between remove(T) and remove(int), which will prevent auto boxing from being used
        wordCount = 0; // And from the top
    }
    else {
        i++; // This kid is okay, move to the next
        // P.S. If we removed the kid, we're already pointing at the next one, hence the "else"
    }
    if (i >= kids.size()) { // Reached the end of the kids list
        i = 0; // Loop around
    }
}

 类似资料:
  • 可能入行真不太简单吧😭😭😭感觉是凉的

  • 导读:《入门:游戏主循环》 【转载】入门:游戏主循环 引言 主循环是一款游戏或者框架的核心以及基础,它会让游戏以及动画看起来是在做实时的运行。几乎所有游戏(除了回合制等几种类型以外)都要基于主循环以及精确的时间控制。 下面就是一个最基本的主循环示例代码: 先定义一个简单的游戏引擎接口,声明游戏的基本生命周期。 package net.jmecn.logic; /** * 一个简单的游戏引擎接口

  • 自我介绍 为什么选择做游戏测试。 写过测试用例吗?(写过) 针对游戏里面排行榜的功能,设计一下测试用例,包括玩家的头像、昵称、杀敌数、加入联盟这些。 有一个武将,他的技能可以增加带兵数,针对这个设计测试用例。 游戏测试和软件测试的区别。 面试官是个很漂亮温柔的姐姐,想测试用例的时候有点紧张卡顿,她说没关系你可以想一下,讲软件测试和游戏测试的区别的时候也给了提示和扩充,氛围很好不紧张。但是因为没有过

  • 在这个程序中,计算机生成一个随机数(在1-100之间),用户试图猜测它。一直运行到用户正确猜出数字为止。需要打印出在正确猜测数字之前所花费的尝试总数。程序运行正常,但存在逻辑错误。当我正确猜测数字时,什么都没有打印出来;程序只是停止。

  • 因为春招面试过很多系统策划,有几个硬实力还可以同学,但是表达能力比较差,语言结构混乱的话面试官听起来就会吃力,比较可惜吧,下面总结一下几种典型的表达方式。 第一:逻辑打点法😶 句型1:"第一+结论+展开,第二+结论+展开,第三+结论+展开" 适用于面试官提问"你认为XXX游戏怎么样?""评价一下XXX设计"等开放性主观问题。 句型2:"前期XXX,中期XXX,后期XXX" 适用于面试官提问"针对

  • 刚下考场,趁热乎劲记录一下 题型: 25单选(计算机基础知识,覆盖面广,都是简单题) 5问答:其中,3道测试用例题(有具体场景包含游戏内购物等,主要是功能测试)2道生活题(如难忘的一件事,大学目标等) 3编程:题目比较偏智力题(如交叉洗牌),有几个小问,每道题都有一个小问写测试用例(如某个函数) 总体感觉:笔试体验不佳,答题平台是自己的系统,IDE比较拉,题目质量一般,大题有很多描述不清楚的地方,