gpt4 book ai didi

java - 高尔夫纸牌的游戏状态树

转载 作者:行者123 更新时间:2023-11-30 11:46:00 26 4
gpt4 key购买 nike

我正在做一个家庭作业项目,我们需要为高尔夫纸牌游戏生成一个状态树。为此,我决定创建一个 Move 类,它表示从一叠纸牌到另一叠纸牌的移动 - 简而言之,它包含对一次移动中涉及的两叠纸牌的引用。我树中的每个节点都知道它要移动什么。

我目前遇到的问题是我的树太大了——比如 OutOfMemoryError 太大了。 编辑 - 我应该注意到,当我为一个非常小的游戏制作一棵树时,我没有收到错误,但我的树仍然比它应该的大得多!

对于那些不熟悉游戏的人:Golf Solitaire Rules . 注意 - 我们不需要实现在国王之后扮演女王的限制。

public void makeTree()
{
_root = makeNode( null, null, 0 );
}

private Node makeNode( Node parent, Move m, int depth )
{
Node node = new Node( parent, m, depth );
ArrayList<Move> moves = findAllMoves();
if( moves.size() == 0 )
node.setScore( getScore() );
else {
for( Move mv : moves ) {
mv.makeMove();
Node child = makeNode( node, mv, depth++ );
node.addChild( child );
mv.undoMove();
}
}
return node;
}

private ArrayList<Move> findAllMoves()
{
ArrayList<Move> moves = new ArrayList<Move>();

for( int i = 0; i < numPlayPiles; i++ ) {
if( _play[i].size() != 0 ) {
if( Math.abs( _play[i].top().getRank().ordinal() -
discard.getRank().ordinal() ) == 1 ) {
moves.add( new Move( _play[i], _discard ) );
}
}
}

if( _draw.size() != 0 )
moves.add( new Move( _draw, _discard ) );

return moves;
}

_play[i] 只是引用游戏中的一堆纸牌。

我意识到在问题中发布的代码有点多,但我的问题只是关于我的逻辑。我怀疑我的错误在于我返回 makeNode 的方式,但我完全被困在这里。有人可以证实我的怀疑和/或可能给我一些指导吗?

最佳答案

对于任何好奇的人,我的问题之一是没有正确阅读作业。具体来说,我的 findAllMoves 方法是问题所在。一个节点应该要么从抽牌堆中移动,要么从游戏堆中移动所有可能的移动,但不能同时具有这两种移动。我上面的代码允许每个 child ,即使在相同的深度,每个 child 都创建一个 Move 从抽奖堆到丢弃堆 - 导致大量重复节点。

它也从不检查游戏结束条件。结果,每个叶节点要么是失败的分数,要么是 0(即使玩家已经赢了,该方法也会递归直到抽奖堆为空)。

关于java - 高尔夫纸牌的游戏状态树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com