前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >上班摸鱼系列|Python开发命令行斗地主

上班摸鱼系列|Python开发命令行斗地主

作者头像
Crossin先生
发布2021-03-26 14:30:25
8880
发布2021-03-26 14:30:25
举报

前言

大家好,欢迎来到 Crossin的编程教室 !

今天给大家分享一个mini游戏案例:用Python开发一个命令行斗地主小游戏,利用跑程序的时间来一把斗地主岂不是非常快乐?关键是没有时间限制,可以随时断点续玩。赶紧喊上老板和产品经理一起开一局吧

先来看个效果:

简单讲讲如何使用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张,先出王炸,炸弹,最大牌
再看下家手牌数量和阵营 同阵营出最小单/对 不同阵营出比他多的牌或者大牌

由于篇幅原因就不展示全部代码。

公众号后台回复 斗地主 即可下载全部源码。

使用也很简单,从命令行进入doudizhu文件夹执行python main.py即可。

摸鱼时记得关掉声音或者删除源码中bgm相关代码。不过我要说:没有bgm的斗地主是没有灵魂的斗地主。(注意:若因上班斗地主被开除,本公众号概不负责)

祝大家工作愉快!

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:刘早起早起

来源:早起Python


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档