maplist
/ 3&maplist / 4将其第一个参数(适当Arity的谓词)应用于其他参数列表的所有元素,那么您的makeBlanks可能是:
makeBlanks(AnsCodes, BlankCodes) :- maplist(answer_blank, AnsCodes, BlankCodes).answer_blank(Ans, Blank) :- Ans == 0'_ -> Blank = Ans ; Blank = 0'* .
并替换为:
substitute(AnsCodes, BlankCodes, GuessName, NewBlanks) :- maplist(place_guess(GuessName), AnsCodes, BlankCodes, NewBlanks).place_guess(Guess, Ans, Blank, Display) :- Guess == Ans -> Display = Ans ; Display = Blank.
编辑 :
根据其他要求:1)可以使用其他谓词解决:
alreadyGuessed(Guess, AnsCodes) :- memberchk(Guess, AnsCodes).
而问候2)
getGuess并
processGuess一起构成一个循环,当没有更多呼叫发生时,循环将终止。删除checkWin的最后一条规则,添加一个参数作为计数器来跟踪失败的猜测,并扩展processGuess来指示失败:
processGuess(AnsList, BlankList, _, CountFailed) :- ( CountFailed == 5 -> format('Sorry, game over. You didn't guess (~s)~n', [AnsList]) ; write('Nope!'), CountFailed1 is CountFailed + 1, getGuess(AnsList, BlankList, CountFailed1) ).


