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的斗地主是没有灵魂的斗地主,注意:若因上班斗地主被开除,本公众号概不负责。祝大家周末愉快,拜拜~

  • 相关阅读:
    day 66 crm(3) 自创组件stark界面展示数据
    day 65 crm(2) admin源码解析,以及简单的仿造admin组件
    用 Python+nginx+django 打造在线家庭影院
    django -admin 源码解析
    day 64 crm项目(1) admin组件的初识别以及应用
    云链接 接口不允许 情况 解决方法 mysql Host is not allowed to connect to this MySQL server解决方法
    day 56 linux的安装python3 ,虚拟环境,mysql ,redis
    day55 linux 基础以及系统优化
    Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
    Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力
  • 原文地址:https://www.cnblogs.com/liuzaoqi/p/12769588.html
Copyright © 2011-2022 走看看