APL桥牌游戏

时间:2016-03-07 05:25:33

标签: apl

我正在尝试在APL中编写一个Bridge游戏,我坚持的部分是在打印手时我想要返回4个单独的牌以获得所有随机卡的得分而我想要按照西装对卡进行排序首先,然后在西装中按Ace排序到两个我能够单独完成这些排序中的每一个

 HAND←DEAL;CHAR;DECK

 DECK←MAKE_DECK

 CHAR←DECK[;13?52]

 ⍝HAND←CHAR[;'SHDC23456789TJQKA'”³CHAR]

 HAND←CHAR[;'CDHS'”³CHAR] 

按套装排序,但不是套装中的数字,我也不知道如何让它成为4只手,而不只是13只牌中的一只手

示例输出:

 Q982AQT93T934 AKJ657428J987 K865AKJ54KQT3 T743JQ762A652
 SSSSHHHHHDDDC SSSSSHHHDCCCC HHHHDDDDDCCCC SSSSHDDDDCCCC

2 个答案:

答案 0 :(得分:1)

(我不确定你在MAKE_DECK中做了什么,也许有一些特殊的东西在继续?否则没有理由为此做一个专门的功能。另外,作为一个非母语的英语人士,我不确定卡片的命名等等 - 请酌情修理......)

DECK←(52⍴'AKQJ0987654'),[.5]13/'SHDC'

然后我处理卡片,然后在DECK中创建一个索引数组;

HANDS←4 13⍴52?52

这些需要按行排序。 (我正在使用“经典”风格,希望能在所有APL方言中使用......)

  x←0
  x←x+1 ⋄ HANDS[x;]←HANDS[x;⍋HANDS[x;]] ⋄  →(x<4)/⎕LC

(请注意,这一行只能在一个函数中使用,而不是直接在解释器中执行它 - 没有⎕LC他可以→到......) 那么,玩家1的手牌是什么?

DECK[;HANDS[1;]]
JAQJ08740Q4K7
SSHHHHHHDDCCC

希望你能从中得到一个很好的功能; - )

答案 1 :(得分:0)

基于前面的答案,我们可以通过一些算术消除循环。输出间距是通过expand来完成的:

      ⎕←deck←2 52⍴(52⍴'AKQJ098765432'),13/'SHDC'
AKQJ098765432AKQJ098765432AKQJ098765432AKQJ098765432
SSSSSSSSSSSSSHHHHHHHHHHHHHDDDDDDDDDDDDDCCCCCCCCCCCCC

      ⎕←hand←52?52
41 45 42 18 33 15 7 44 21 16 25 11 49 10 40 6 1 19 43 52 46 9 24 17 8 38 39 34 28 23 20 50 29 37 2 36 26 13 31 51 4 48 32
  5 27 22 14 3 30 47 35 12

Unsorted

      (55⍴14↑13⍴1)\deck[;hand]
K9Q08K807Q345 5A9A9J2864J73 27K584Q4K5220 3J690A6AQJ763
CCCHDHSCHHHSC SCSSHCCCSHHSD DDDHHCDDSDHSD CSCDSDHHSDCDS

Sorted

      (55⍴14↑13⍴1)\deck[;hand[⍋hand+13/1000×⍳4]]
84KQ0738KQ095 A9765J943AJ82 K2852KQ075424 QJ03A6AJ96763
SSHHHHHDCCCCC SSSSSHHHDCCCC SSHHHDDDDDDDC SSSSHHDDDDCCC