Elixir实现War卡牌游戏遇测试失败,求排查方案
用Elixir实现War卡牌游戏的问题排查
游戏规则
- 洗牌后的52张牌(1-13各4张)交替发给两名玩家,每人26张。
- 每轮双方亮出顶牌:等级高的玩家将本轮所有牌按降序放入自己牌堆底部。
- 若顶牌平局则触发战争:每人放1张暗牌+1张明牌,明牌等级高的玩家赢得所有牌;若仍平局则重复此过程,直到分出胜负。
- 任一玩家牌耗尽则失败,另一方获胜。
技术要求
输入为1-13各4个的52整数排列,程序需模拟游戏至一方牌耗尽,返回获胜玩家的完整牌堆(按规则排序)。
测试用例
defmodule WarTest do use ExUnit.Case describe "War" do test "deal_1" do t1 = [1,1,1,1,13,13,13,13,11,11,11,11,12,12,12,12,10,10,10,10,9,9,9,9,7,7,7,7,8,8,8,8,6,6,6,6,5,5,5,5,4,4,4,4,3,3,3,3,2,2,2,2] r1 = [1,1,1,1,13,13,13,13,12,12,12,12,11,11,11,11,10,10,10,10,9,9,9,9,8,8,8,8,7,7,7,7,6,6,6,6,5,5,5,5,4,4,4,4,3,3,3,3,2,2,2,2] assert War.deal(t1) == r1 end test "deal_2" do t2 = [1,13,1,13,1,13,1,13,12,11,12,11,12,11,12,11,10,9,10,9,10,9,10,9,8,7,8,7,8,7,8,7,6,5,6,5,6,5,6,5,4,3,4,3,4,3,4,3,2,2,2,2] r2 = [4,3,2,2,2,2,4,3,4,3,4,3,6,5,6,5,6,5,6,5,8,7,8,7,8,7,8,7,10,9,10,9,10,9,10,9,12,11,12,11,12,11,12,11,1,13,1,13,1,13,1,13] assert War.deal(t2) == r2 end test "deal_3" do t3 = [13,1,13,1,13,1,13,1,11,12,11,12,11,12,11,12,9,10,9,10,9,10,9,10,7,8,7,8,7,8,7,8,5,6,5,6,5,6,5,6,3,4,3,4,3,4,3,4,2,2,2,2] r3 = [4,3,2,2,2,2,4,3,4,3,4,3,6,5,6,5,6,5,6,5,8,7,8,7,8,7,8,7,10,9,10,9,10,9,10,9,12,11,12,11,12,11,12,11,1,13,1,13,1,13,1,13] assert War.deal(t3) == r3 end test "deal_4" do t4 = [10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9] r4 = [1,1,13,12,9,5,11,4,9,3,8,7,7,2,13,10,12,5,10,4,9,6,8,3,1,1,13,12,7,5,11,4,9,3,8,6,7,2,13,10,12,5,11,11,10,8,6,4,6,3,2,2] assert War.deal(t4) == r4 end test "deal_5" do t5 = [1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13] r5 = [1,10,13,8,11,9,8,7,11,8,13,7,13,6,12,6,9,5,8,5,7,4,7,4,11,6,12,10,6,3,2,2,12,5,9,3,10,4,9,2,10,3,5,2,1,1,1,13,12,11,4,3] assert War.deal(t5) == r5 end end end
核心实现代码
defmodule War do defp play_game(p1, p2, tied \ []) defp play_game([], p2, tied), do: p2 ++ tied defp play_game(p1, [], tied), do: p1 ++ tied # War, cards tied defp play_game([c | xs], [c | ys], tied) do cards = Enum.sort([c, c] ++ tied, :desc) play_game(xs, ys, cards) end # Normal game turn defp play_game([x | xs], [y | ys], tied) do cards = Enum.sort([x, y] ++ tied, :desc) if x > y do play_game(xs ++ cards, ys) else play_game(xs, ys ++ cards) end end end
当前问题
当前实现仅通过第一个测试用例,其余测试均失败,需要排查问题并给出解决方法。
内容的提问来源于stack exchange,提问作者Zoey
相关产品推荐
相关产品推荐

