python代码实现斗地主

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 27 12:45:14 2021

@author: lenovo
"""

import random
from collections import Counter

class Player():
    def __init__(self, card, role):
        self.card = card
        self.role = role
        self.length = len(self.card)
        self.count = Counter(self.card)
    
    ##### 理牌    
    def clear(self):
        for i in range(1, self.length):
             j = i - 1
             if(self.card[i] < self.card[j]):
                 temp = self.card[i]
                 self.card[i] = self.card[j]
                 j = j-1
                 while j>=0 and self.card[j] > temp:
                     self.card[j+1] = self.card[j]
                     j = j-1
                 self.card[j+1] = temp
        return self.card

    ##### 随机出牌
    def play(self, n, x):
        self.count = Counter(self.card)
        
        ### 出单牌
        if n == 1:
            result = [1] + [x] * 1
            return result
            
        ### 出对子
        elif n == 2 and self.count[x] >= 2:
            result = [2] + [x] * 2
            return result
            
        ### 出三带一
        elif n == 3 and self.count[x] >= 3:
            a = 0
            while a not in self.card and a != x:
                a = random.randint(3, 17)
            result = [3] + [x] * 3 + [a]
            return result
            
        ### 出炸弹
        elif n == 4 and self.count[x] == 4:
            result = [4] + [x] * 4
            return result
            
        ### 出顺子
        elif n == 5 and [x+1, x+2, x+3, x+4] in self.card:
            result = [5] + [x, x+1, x+2, x+3, x+4]
            flag = 0
            i = 5
            while x+i in self.card:
                flag = random.randint(0, 1)
                if flag == 1:
                    result.append(x+i)
                elif flag == 0:
                    break
                i = i + 1
            return result
            
        else:
            return [0]
            
    def first_play(self):
        result = [0]
        while result == [0]:
            n = random.randint(1,5)
            x = 0
            while x not in self.card:
                x = random.randint(3, 17)
                result = self.play(n, x)
        for x in result[1:]:
            self.card.remove(x)
        return result
            
    def next_play(self, table):
        n = table[-1][0]
        x = 0
        result = [0]
        i = 0
        while result == [0] or x not in self.card:
            x = random.randint(table[-1][1], 17)
            result = self.play(n, x)
            i = i + 1
            if i == 30:
                return table[-1]
        for x in result[1:]:
            self.card.remove(x)
        return result
            
        
cards = []
for i in range(3, 16):
    cards = cards + [i] * 4
cards = cards + [16,17]

##### 发牌
def deal():
    card = []
    for i in range(0, 17):
        p = random.randint(0, len(cards)-1)
        temp = cards.pop(p)
        card.append(temp)
    return card

card_1 = deal()
card_2 = deal() 
card_3 = deal()


##### 选地主
lord = random.randint(1, 3)
if lord == 1:
    card_1 = card_1 + cards
if lord == 2:
    card_2 = card_2 + cards
if lord == 3:
    card_3 = card_3 + cards
    
player_1 = Player(card_1, 0)
player_2 = Player(card_2, 0)
player_3 = Player(card_3, 0)

##### 理牌
player_1.clear()
player_2.clear()
player_3.clear()

##### 显示
print("玩家一:" + str(card_1))
print("玩家二:" + str(card_2))
print("玩家三:" + str(card_3))
print("地主:" + str(lord) + '\n')

##### 定义出过的牌
table = []

##### 定义顺序
order = [player_1, player_2, player_3]
leader = lord - 1

while len(card_1) != 0 and len(card_2) != 0 and len(card_3) != 0:
    p = 0
    i = 0
    table.append(order[leader-1].first_play())
    print('\n' + "头家:" + str(leader+1))
    print("出牌:" + str(table[-1]))
    while len(card_1) != 0 and len(card_2) != 0 and len(card_3) != 0:
        table.append(order[(leader+i)%3].next_play(table))
        print("出牌:" + str(table[-1]))
        i = i + 1
        if table[-2] == table[-1]:
            p = p + 1
        else: p = 0
        if p == 2: 
            leader = (leader+i-2)%3
            break

if len(order[lord-1].card) == 0:
    print('\n' + "地主胜利!")
else:
    print('\n' + "农民胜利!")
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
斗地主是一种非常经典的扑克牌游戏,可以用Python类进行实现。以下是一个简单的示例代码: ```python import random class Landlord: def __init__(self): self.players = [] self.cards = [] self.landlord = None def add_player(self, name): self.players.append(name) def create_cards(self): for i in range(3, 16): for j in range(4): self.cards.append((i, j)) self.cards.append((16, 0)) self.cards.append((16, 1)) def shuffle_cards(self): random.shuffle(self.cards) def deal_cards(self): for i in range(3): for player in self.players: player.cards.append(self.cards.pop()) def determine_landlord(self): self.landlord = random.choice(self.players) def play_game(self): self.create_cards() self.shuffle_cards() for player in self.players: player.cards = [] self.deal_cards() self.determine_landlord() print("Landlord is:", self.landlord) ``` 在这个代码中,我们创建了一个`Landlord`类,其中包含了添加玩家、创建牌、洗牌、发牌和确定地主等方法。我们还使用元组来表示一张牌,其中第一个元素是点数(3~16,A:14,2:15,大小王:16),第二个元素是花色(0~3,分别表示黑桃、红心、梅花、方块)。我们可以通过创建`Player`类来表示每个玩家,包含了玩家的名称和手牌。 ```python class Player: def __init__(self, name): self.name = name self.cards = [] def show_cards(self): print(self.name, "has cards:") for card in self.cards: print(card) ``` 我们还可以添加出牌、抢地主、加倍等方法,来完善这个斗地主游戏的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

From Star.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值