zoukankan      html  css  js  c++  java
  • 上班摸鱼系列|Python开发命令行斗地主

    前言

    大家周末好~最近更新了太多的数据分析内容不知道各位有没有疲劳,今天给大家带来的是如何上班如何高级摸鱼:用Python开发一个命令行斗地主小游戏,利用跑程序的时间来一把斗地主岂不是非常快乐,关键是没有时间限制,不仅可以喊上老板一起玩还能随时断点续玩

    doudizhu.mov

    接下来简单讲讲如何使用python开发这样一个斗地主游戏,我们先来想想进行一场斗地主游戏所经历的过程:首先生成54张扑克,然后将这54张扑克随机发给三名玩家,每个玩家17张牌并保留三张底牌,接着从第一个玩家开始询问是否抢地主,如果成为地主则获得三张底牌,这样依次循环直到地主出现,之后就是根据出牌规则完成一系列的出牌动作,最先出完牌的人取得胜利并按照记分规则累积分数(欢乐豆)。

    因为仅供自己娱乐使用所以不用做UI界面,不用登陆不用注册,不用分客户端、服务端以及一些消息传输等复杂的内容,简单来说只需要完成洗牌发牌出牌规则以及生成指定数量的机器人陪玩即可。因此我们仅使用纯python不依赖任何第三方库来开发。

    洗牌与发牌的实现

    洗牌与发牌是比较好搞定的,基本上使用python标准库random即可,比如生成牌库

    import random
    def get_Card():
        card_type = ['黑桃','红桃','方片','梅花']
        card_values= ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
        n=1
        cards = ['JOKER','joker']
        for i in card_type:
            for j in card_values:
                cards.append((i+j))
                n += 1
        return cards

    洗牌与发牌

    def send_Card(cards):
        print('开始洗牌')
        wash_card = random.shuffle(cards) #使用shuffle打乱
        print('开始发牌')
     
        print('底牌为 : %s' %cards[0:3])
     
        player1 = cards[3:20]
        player2 = cards[20:37]
        player3 = cards[37:54]
     
        print ('player1 : '+ str(player1))
        print ('player2 : '+ str(player2))
        print ('player3 : '+ str(player3))

    其他功能实现与使用

    那么在打牌过程中的出牌与判定规则就很难去搞定了,于是只能求助GitHub大神,很遗憾大多数项目还是比较大型的交互式斗地主游戏开发,不满足我们的简单版需求,经过一番查找与修改最终整理出一份能够实现我们之前所提出的命令行的斗地主程序(没有依赖任何第三方库),来看看部分代码,例如判定两个玩家的出牌

    def legal(cards1,cards2):
      type1,number1 = cardtype(cards1)
      type2,number2 = cardtype(cards2)
      if type2 == "rocket": #火箭
        return True
      if type2 == "bomb":
        if type1 == "bomb":
          if number2[0] > number1[0]:
            return True
          else:
            return False
        else:
          return True
      if type1 == "single": #单牌
        if type2 == "single":
          if number2 > number1:
            return True
          else:
            return False
        else:
          return False
      if type1 == "pair": #对子    if type2 == "pair":
          if number2[0] > number1[0]:
            return True
          else:
            return False
        else:
          return False
      if type1 == "3+1": #三带一
        if type2 == "3+1":
          if number2[0] > number1[0]:
            return True
          else:
            return False
        else:
          return False
      if type1 == "4+2": #4带2
        if type2 == "4+2":
          if number2[0] > number1[0]:
            return True
          else:
            return False
        else:
          return False
      if type1 == "straight": #顺子
        if type2 == "straight":
          if number2[1] == number1[1]:
            if number2[0] > number1[0]:
              return True
            else:
              return False
          else:
            return False
        else:
          return False
    ######################其他规则

    那我们生成的AI是按照什么样的规则出牌?(你可以修改ai.py部分代码调整规则)

    分析手牌

    先看是不是王炸
    看是不是炸弹,如果是对手的炸弹,能打就打
    再看是不是大于K,如果是队友出的,就过牌,否则就试着打掉,用炸弹
    如果对手手牌少于9张出大于K或者出的大于8张的飞机/顺子/连对有王炸/炸弹就用掉
    否则无脑跟 不用炸弹和火箭
    如果跟对方牌并且对方小于9张,没有1,2张的牌就拆2,3张的牌打
    自己出牌lastcard应该是[]
    若自己手牌小于5张,先出王炸,炸弹,最大牌
    再看下家手牌数量和阵营 同阵营出最小单/对 不同阵营出比他多的牌或者大牌

    由于篇幅原因就不展示全部代码。在『早起python』公众号后台回复斗地主即可下载全部源码。

    使用也很简单,从命令行进入doudizhu文件夹执行python main.py即可。摸鱼时记得关掉声音或者删除源码中bgm相关代码。当然早起想说没有bgm的斗地主是没有灵魂的斗地主,注意:若因上班斗地主被开除,本公众号概不负责。祝大家周末愉快,拜拜~

  • 相关阅读:
    ElasticSearch——分页查询
    Canal——写入到ES中数据错乱
    HBase管理与监控——WebUI
    '$.browser.msie' 为空或不是对象
    input file 获取不到Request.Files 解决办法
    .NET读取服务器或本地文件
    .NET将服务器文件导出
    .Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较
    JavaScript跨域调用基于JSON的RESTful API
    WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。
  • 原文地址:https://www.cnblogs.com/liuzaoqi/p/12769588.html
Copyright © 2011-2022 走看看