Prolog中使用谓词更新列表:初始发牌功能实现求助
Prolog初始发牌功能实现求助
我沉迷函数式编程,对Prolog相关编程较为陌生,现在需要用Prolog实现一款游戏,已经定义了如下牌组:
deck([(ace, spade), (two,spade), (three, spade),(four, spade), (five, spade), (six, spade), (seven, spade), (eight, spade), (nine, spade), (ten, spade),(jack, spade),(queen, spade), (king, heart), (ace, club), (two,club), (three, club),(four, club), (five, club), (six, club), (seven, club), (eight, club), (nine, club), (ten, club),(jack, club),(queen, club), (king, club), (ace, heart), (two,heart), (three, heart),(four, heart), (five, heart), (six, heart), (seven, heart), (eight, heart), (nine, heart), (ten, heart),(jack, heart),(queen, heart), (king, heart), (ace, diamond), (two,diamond), (three, diamond),(four, diamond), (five, diamond), (six, diamond), (seven, diamond), (eight, diamond), (nine, diamond), (ten, diamond),(jack, diamond),(queen, diamond), (king, diamond) ] ).
初始发牌功能规格说明
从Deck中发牌,初始发牌规则为玩家发两张牌,庄家发两张牌。该谓词需要返回移除已发牌后的新牌组,以及包含双方手牌的牌桌(即列表的列表)。参数说明:
Table:包含双方手牌的列表(列表的列表)NewDeck:移除初始发牌所用牌后的新牌组Deck:用于初始发牌的原始牌组
我编写的代码(不确定是否可行)
initDeal([], [], []). initDeal(Table, NewDeck, Deck) :- [X, Y, Rest] = Deck, FirstNewDeck = Rest, [M, N, Final] = NewDeck, NewDeck = Final, Table = [[X,Y],[M,N]].
代码问题分析与修正
你的代码存在几个逻辑错误:
- 原代码仅从
Deck取前两张牌,后续错误地试图从NewDeck中再取牌,完全搞反了发牌逻辑——应该直接从原始Deck中取前四张牌分配给玩家和庄家,剩余部分就是NewDeck。 [M, N, Final] = NewDeck和NewDeck = Final属于矛盾语句,会导致变量绑定失败,无法得到正确结果。- 空牌组的子句
initDeal([], [], [])不符合需求,空牌组根本无法完成需要四张牌的初始发牌。
正确实现代码
% 初始发牌:玩家两张,庄家两张,返回牌桌和剩余牌组 initDeal(Table, NewDeck, Deck) :- % 从原始牌组提取前四张牌,剩余部分绑定为NewDeck [P1, P2, D1, D2 | NewDeck] = Deck, % 构造包含玩家、庄家手牌的牌桌 Table = [[P1, P2], [D1, D2]].
代码解释
- 利用Prolog的列表匹配语法,直接从
Deck中拆分出玩家的两张牌P1、P2、庄家的两张牌D1、D2,剩余的牌组自动绑定给NewDeck。 - 若原始牌组长度不足4张,该谓词会自动失败,符合“无法完成初始发牌”的逻辑。
内容的提问来源于stack exchange,提问作者Oadeniran
相关产品推荐
相关产品推荐

