小试牛刀:用python写欢乐斗牛

    欢乐斗牛这个游戏应该大多数人都不陌生,而python这个最近一两年比较热门的编程语言,相信点击我这篇文章的朋友一定了解ta。而斗牛和python这一老一新的事物又会碰撞出什么样的火花呢?这篇文章就是利用python写的一个关于斗牛的小程序。

    斗牛分为庄家闲家,而游戏的主题就是庄家闲家拼点。所以我就创建了这两个对象,在这之前把牌面总点数的计算、倍率的计算和牌面中最大牌等方法封装成player类。在main函数中进行游戏,加上了判断庄家闲家点数的功能,判断游戏结束的条件,主动改变赌注和主动退出游戏的功能。

    斗牛计算点数的规则:如果5张牌中任意3张牌之和为10的倍数,剩下两张牌加起来的点数就是牌面点数,反之牌面的点数为0.

而计算倍率的规则和牌面点数有关,点数为10(即牛牛)时,倍率为3倍;点数为7~9时,2倍的倍率;点数为0~6时,1倍的倍率。而庄闲的点数相同时,需要继续比较各自牌面中最大的牌,一般黑桃K最大,方片A最小。

import itertools
import random

# 牌的总数
def poker_list():
    color = ['\u2665', '\u2663', '\u2666', '\u2660']
    num_poker = ['A', '2', '3', '4', '5', '6',
                 '7', '8', '9', '10', 'J', 'Q', 'K']
    # Joker=['big_Joker','small_Joker']
    sum_poker = [i+j for i in num_poker for j in color]
    return sum_poker


class player(object):
    """docstring for player"""
    def __init__(self, poker,bet_on):
        super(player, self).__init__()
        self.poker = poker
        self.bet_on=bet_on

    def sum_value(self):
        L = []
        for i in self.poker:
            # if i[0] == 'J' or i[0] == 'Q' or i[0] == 'K' or i[:2] == '10':
            if i[:-1] in ['10','J','Q','K']:
                num = 10
            elif i[0] == 'A':
                num = 1
            else:
                num = int(i[0])
            L.append(num)
        return L

    # 算出五张牌的总点数
    def poker_point(self):
        lst = self.sum_value()
        # 排列组合:3张牌的点数之和为10的倍数
        for j in itertools.combinations(lst, 3):
            if sum(j) % 10 == 0:
                if sum(lst) % 10 == 0:
                    return 10
                return sum(lst) % 10
        else:
            return 0

    # 比较双方的点数相同时,比较牌面中最大的牌,按照索引来排序,并找出牌中最大的索引值
    def sorted_index(self):
        L = []
        for i in self.poker:
            index = poker_list().index(i)
            L.append(index)
        return max(L)

    # 点数的大小对应的倍率
    def level_rate(self):
        point = self.poker_point()
        if point == 10:
            self.bet_on *=3
        elif 7 <= point < 10:
            self.bet_on *= 2
        elif point < 7:
            self.bet_on *= 1
        return self.bet_on

def main():
    print("游戏开始")
    value=int(input('请输入玩家的欢乐豆:'))

    # 统计玩家游戏局数
    i=1
    while True:
        print('第%s局游戏开始!'%i)
        bet_on=input('请玩家输入赌注:')
        try:
            bet_on=int(bet_on)
        # 如果输入的赌注小于等于0或者不为整数时,游戏结束(这样可以主动退出游戏)
        except Exception:
            print('游戏结束')
            print('您剩下的欢乐豆为:',value)
            return
        if bet_on<=0:
            print('游戏结束')
            print('您剩下的欢乐豆为:',value)
            return
        else:
            L = poker_list()
            # 把牌随机洗好
            random.shuffle(L)
            # 按顺序发牌(因为牌已经打乱顺序,所以顺序发牌)
            hostpoker = L[:5]
            # 创建庄家对象,把牌面和赌注作为传参
            host_value=player(hostpoker,bet_on)
            # 庄家牌面的点数
            host_sumPoint=host_value.poker_point()
            print("庄家的牌为:", hostpoker)
            print("庄家的点数:", host_sumPoint)

            poker=L[5:10]
            # 创建玩家对象,把牌面和赌注作为传参
            player_value=player(poker,bet_on)
             # 玩家牌面的点数
            player_sumPoint=player_value.poker_point()
            print("玩家的牌为:", poker)
            print("玩家的点数:", player_sumPoint)

            # 比较双方的点数,然后按照情况更改赌注和欢乐豆
            # 点数相同时,比较牌面中最大的牌,按照索引来排序,并找出牌中最大的索引值
            if player_sumPoint == host_sumPoint:
                if player_value.sorted_index() >host_value.sorted_index():
                    print("这把您赢了")
                    value+=player_value.level_rate()
                else :
                    print("这把您输了")
                    value-=host_value.level_rate()
            elif player_sumPoint > host_sumPoint:
                print("这把您赢了")
                value+=player_value.level_rate()
            else:
                print("这把您输了")
                value-=host_value.level_rate()

             # 判断游戏结束的条件
            if value>0:
                print('您的赌资还剩下:',value)
                print('游戏继续\r\n')
            else:
                print('您已经输光了欢乐豆,游戏结束!!!')
                return

        i+=1


if __name__ == '__main__':
    main()


版权声明:本文为weixin_42499361原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。