Giter Site home page Giter Site logo

ddzlib's Introduction

ddzlib

斗地主牌库(含癞子和机器人)

牌库

54张牌,其中有一个面值的牌是癞子,也就是有4张癞子。

牌库实现功能

  1. 分析所有牌型(包含癞子的情况),如顺子,三带,飞机带翅膀,炸弹等等。
  2. 查找指定牌型。
  3. 查找比指定牌型大的牌型。
  4. 牌型比较。
  5. 选出较优的牌型压其它指定牌型。
  6. 提示可以出哪些牌型。

机器人的设计文档

机器人打算水平完全体现在如何拆牌和拆牌后如何出牌和跟牌。

拆算思路

  1. 先确定火箭:判断是否有大小王。
  2. 再确定炸弹:判明是否有四头。
  3. 再确定三顺:,应该使三顺的数量尽可能大。即如果有444555666,则将其合成一个三顺,而不是分成444555一个三顺和666一个三条。
  4. 再确定单顺:判断单顺时必须去除四个2以外的所有炸弹。首先判断是否存在除了三条牌(这里的三条是指所有的三条)以外的连牌,如果有,则将其提取出来。其 次,将剩余的牌与每一个三条(不包含三顺)进行试组合,如果能够重新组成单顺和对子,则将原有的三条取消,重新组合成连牌和单顺(例子4566678重新 组成45678和66)。最后,将已知的连牌、三条(不包含三顺)和剩下的牌张再试组合,将所有如45678(已知的连牌)999(三条)10J(单 牌),重新组合成45678910J和99。通过以上的方法,就能将连牌和三条很好地重新组合。
  5. 再确定三条:找不到三顺,则在除了炸弹以外的牌中判断是否包含三条。
  6. 再确定双顺:首先,如果两单顺牌完全重合,则将其重新组合成双顺。其次,在除炸弹、三顺、三条、单顺以外的牌中检测是否包含双顺。如果有,将其提取出来。
  7. 再确定对子:在炸弹、三顺、三条、连牌、双顺以外的牌中检测是否存在对子,如果存在将其提取出来。
  8. 再确定单牌:除了炸弹、三顺、三条、连牌、双顺、对子以外的所有牌张都是单牌。

拆牌手数分析

所谓一手牌的手数,指的是在没有别人压牌的情况下需要出几把能将牌出完。这个数字在经过上面的拆牌后是可以确定的。 举个例子:手牌为22AAKQJ9987776654。 按照上面的折算思路可以分析出以下的牌型:
22、AA、K、Q、J、987654、9、77、6的牌型。 通过对上面牌型的计算,可以容易得出这手牌需要9手才能出完,因此这手牌的手数就是9。

出牌逻辑

自己出牌

  1. 出牌的原则一般按照从小到大的原则,即首先出包含最小牌的组合(单牌、对子、双顺、连牌、三顺、三条等,炸弹、火箭不包括在内)。
  2. 三条的出牌原则:因为三条出牌可以带一张单牌或一个对子,所以在出三条时需要检测是否有单牌,如果有,则带一张最小的单牌,如果没有,则再检测是否存在对子,如果有,则跟一个最小的对子,如果单牌和对子都没有,则出三条。 在带牌时,除非是只剩两手牌,否则不能带王或2。
  3. 三顺的出牌原则:因为三顺出牌可以带两张(或更多)单牌或两个(或更多)对子,所以与出三条一样,需要检测是否有单牌或对子。如果有足够多的单牌或对子, 则将其带出。如果有单牌,但没有足够多的单牌,则检查是否有6连以上的连牌,如果有将连牌的最小张数当作单牌带出。如果有对子,但没有足够多的对子,则检 查是否有4连以上的双顺,如果有将双顺的最小对子当作对子带出。在带牌时,除非是只剩两手牌,否则不能带王或2。
  4. 连牌的出牌原则:直接出。
  5. 双顺的出牌原则:直接出。
  6. 对子的出牌原则:因为对子可以用三条、三顺等带出,所以在出对子时,应该先检测一下三条+三顺(中三条)的数量,如果所有三条数量 <= 对子+单牌数量总和-2时,出对子,否则出三带2等等。
  7. 单牌的出牌原则:因为单牌可以用三条、三顺等带出,所以在出单牌时,应该先检测一下三条+三顺(中三条)的数量,如果所有三条数量 <= 对子+单牌数量总和-2时,出单牌,否则出三带1等等。

跟牌逻辑

  1. 如果手中有独立的,与所出的牌一样牌型的牌时,先跟之。
  2. 可以作为单牌、对子、三条等形式跟出。
  3. 当手中没有相应牌跟时,如果是本方人员出的牌,可以不跟,如果是对方出的牌,则必须拆牌跟,如果再没有,出炸弹或火箭,否则PASS。
  4. 如果手中的牌除了炸弹。火箭外还剩一手牌,则如果牌型相符,则先跟之,否则炸之。
  5. 单牌的跟牌原则:如果手中有单牌,则跟之,否则拆2跟之,否则拆对牌跟之,否则拆6连以上的单顺顶张跟之,否则拆三条跟之,否则拆三顺跟之,否则拆5连单顺跟之,否则拆双顺跟之,否则炸之,否则PASS。
  6. 对牌的根牌原则:如果手中有对子,则跟之,否则拆4连以上的双顺顶张跟之,否则拆三条跟之,否则拆双顺跟之,否则拆三顺跟之,否则炸之,否则PASS。
  7. 三条、三带1、三带2等牌的根牌原则:如果手中有相同牌型的牌则跟之,否则拆三顺跟之,否则炸之,否则PASS。注意,只有在手中牌在出了以后还剩一手牌时,或直接出完的情况下,才允许带王或2。在没有足够牌带的情况下,参照单牌。对子的拆牌原则进行拆牌处理。
  8. 三顺及三顺带牌的根牌原则:如果有相应的牌型,则跟之,否则可以将大的三顺拆成小的三顺跟之,否则炸之,否则PASS。注意,只有在手中牌在出了以后还剩一手牌时,或直接出完的情况下,才允许带王或2。在没有足够牌带的情况下,参照单牌。对子的拆牌原则进行拆牌处理。
  9. 连牌的跟牌原则:如果有相应的牌型,则跟之,否则拆相同张数的双顺,否则拆相同张数的三顺,否则拆不同张数的连牌,否则拆不同张数的双顺,否则拆不同张数的三顺,否则炸之,否则PASS。
  10. 双顺的跟牌原则:有相同牌型的牌,则跟之,否则拆不同张数的双顺,否则拆不同张数的三顺,否则拆相同张数的三顺,否则炸之,否则PASS。
  11. 炸弹的跟牌原则:有超过所出炸弹的炸弹,或有火箭,则炸之,否则PASS。
  12. 炸弹带两手牌的跟牌原则:如果有炸弹,则炸之,否则PASS。

殊情况

特殊情况,在机器人出牌或过之前都要检测特殊情况,如:

  1. 自己是庄家 a) 在出牌时,如果偏家有一个人只剩一张牌时,尽量不出单牌,否则单牌由大到小出。
    b) 在跟牌时,如果偏家有一个人只剩一张牌时,跟手中最大的牌。 c) 如果有玩家报双,不打对子,如果只有对子,则拆最小的对子打
  2. 偏家打法: a) 如果是庄家的上家,且庄家只剩一张牌时,尽量不出单牌,否则单牌由大到小出。
    b) 在跟牌时,如果是庄家的上家,且庄家只剩一张牌时,跟手中最大的牌。 c) 当一个偏家打出的是单牌时,一般情况下能跟就跟。如果手中必须跟J或以上的牌时,选择PASS。 d) 当一个偏家打出的是对子时,一般情况下能跟就跟。如果手中必须跟JJ或以上的牌时,选择PASS。 e) 如果一个偏家打出的牌是除了单牌及对子以外的牌型,则选择PASS。 f) 如果处在下家的偏家只剩一张牌时,在出牌时出手中最小的牌。跟牌还按照一般的原则。 g) 如果庄家报双,不打对子,如果只有对子,则拆最小的对子打。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.