You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java循环删除数组元素问题:OOP桌游玩家选棋场景解决方案咨询

解决桌游棋子重复选择+循环删除的问题

刚从C转Java确实会被Java的各种内置工具爽到,不用自己手动实现各种基础功能太香了!针对你这个面向对象桌游里,玩家选棋子不能重复、还要在循环里删除已选棋子的需求,我给你几个实用的方案,都是Java里常用的思路,比直接操作数组方便多了:

首选方案:用ArrayList代替数组

Java的数组是固定长度的,删除元素的时候得手动移动后续元素,不仅麻烦还容易出错。而ArrayList作为动态数组,内置了remove()方法,能帮你一键搞定删除操作,完美适配这种需要动态调整元素的场景。

具体实现步骤:

  1. 先定义你的棋子类(符合OOP思想),给棋子加上必要的属性和方法:
import java.util.Objects;

class ChessPiece {
    private String pieceName; // 棋子名称
    private int pieceId; // 唯一标识,避免同名混淆

    public ChessPiece(String pieceName, int pieceId) {
        this.pieceName = pieceName;
        this.pieceId = pieceId;
    }

    // 重写equals和hashCode,方便后续判断棋子是否相同
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ChessPiece that = (ChessPiece) o;
        return pieceId == that.pieceId && Objects.equals(pieceName, that.pieceName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(pieceName, pieceId);
    }

    // 提供getter方法供外部获取属性
    public String getPieceName() {
        return pieceName;
    }

    public int getPieceId() {
        return pieceId;
    }
}
  1. 在主逻辑里用ArrayList管理可用棋子,处理玩家选择和删除操作:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BoardGameManager {
    public static void main(String[] args) {
        // 初始化可用棋子列表
        List<ChessPiece> availablePieces = new ArrayList<>();
        availablePieces.add(new ChessPiece("银甲骑士", 1));
        availablePieces.add(new ChessPiece("火焰法师", 2));
        availablePieces.add(new ChessPiece("巨斧战士", 3));
        availablePieces.add(new ChessPiece("森林游侠", 4));

        Scanner scanner = new Scanner(System.in);
        // 模拟多玩家选择流程
        for (int player = 1; player <= 3; player++) {
            System.out.println("\n===== 玩家" + player + "选择棋子 =====");
            // 展示当前可用棋子
            System.out.println("可选棋子:");
            for (int i = 0; i < availablePieces.size(); i++) {
                System.out.println((i + 1) + ". " + availablePieces.get(i).getPieceName());
            }

            // 获取玩家选择
            System.out.print("请输入棋子序号:");
            int choiceIndex = scanner.nextInt() - 1; // 转成0-based索引

            // 验证选择是否合法
            if (choiceIndex >= 0 && choiceIndex < availablePieces.size()) {
                ChessPiece selectedPiece = availablePieces.get(choiceIndex);
                System.out.println("玩家" + player + "选择了:" + selectedPiece.getPieceName());
                // 从可用列表中删除已选棋子
                availablePieces.remove(choiceIndex);
            } else {
                System.out.println("输入无效,请重新选择!");
                player--; // 让当前玩家重新选择
            }
        }

        scanner.close();
        System.out.println("\n所有玩家选择完成,剩余未选棋子:");
        for (ChessPiece piece : availablePieces) {
            System.out.println(piece.getPieceName());
        }
    }
}

为什么这个方案好用?

  • 动态调整长度:ArrayList会自动处理元素删除后的索引调整,不用像C语言那样手动遍历移动数组元素。
  • 符合OOP:棋子作为独立类,属性和行为封装清晰,后续扩展功能(比如棋子技能、状态)也更方便。
  • 代码更简洁:内置方法直接调用,减少手动实现的bug风险。

如果一定要用数组怎么办?

如果因为某些原因必须用数组,那只能通过创建新数组的方式来“删除”元素:遍历原数组,把未被选中的元素复制到新数组里。不过这种方式代码繁琐,而且每次删除都要重新创建数组,性能不如ArrayList,示例如下(不推荐):

// 假设原数组是ChessPiece[] pieces
ChessPiece[] newPieces = new ChessPiece[pieces.length - 1];
int newIndex = 0;
for (int i = 0; i < pieces.length; i++) {
    if (i != selectedIndex) { // selectedIndex是玩家选中的索引
        newPieces[newIndex++] = pieces[i];
    }
}
pieces = newPieces; // 让原数组引用指向新数组

额外小提示

从C转Java的过程中,一定要多熟悉Java集合框架(Collection Framework),像List、Set、Map这些工具类几乎能覆盖所有日常数据操作场景,比数组灵活太多,能节省大量重复造轮子的时间~

内容的提问来源于stack exchange,提问作者Barry B Benson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:33