返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现炸金花游戏的示例代码怎么写
  • 143
分享到

Python实现炸金花游戏的示例代码怎么写

2023-06-26 06:06:23 143人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

今天给大家介绍一下python实现炸金花游戏的示例代码怎么写。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,

今天给大家介绍一下python实现炸金花游戏的示例代码怎么写。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。

今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是没有想到简单的办法让其比较,索性都用数字了,我太菜了,希望有大佬指点一下。

代码如下:

import random   #导入随机数函数def puke():    """    生成一副52张的扑克牌(除去大小王)    :return:    """    list1 = ['黑桃', '红桃', '方块', '梅花']    list2 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]    list3 = []    for i in list1:        for j in list2:            dict1 = {i: j}            list3.append(dict1)    return list3Def func(num):    """    判断随机生成的三张扑克类型,对不同类型的牌 底分进行相应的翻倍    其中num参数返回的是对玩家牌型计算后的分数。    (最小单张是:2,    11,12,13,14  分别代表:J,Q,K,A)    :param num:    :return:    """    user_list1 = []     #用于存储牌的花色    user_list2 = []     #用于存储牌的数字    global list4     #声明调用外部全局变量    for i in list4:        user_list1.append(list(i.keys()))        for j in i:            user_list1.append(list(i.values()))    user_list2.append(user_list1[1])        #将遍历后的数字添加进user_list2中    user_list2.append(user_list1[3])    user_list2.append(user_list1[5])    user_list2 = [int(x) for item in user_list2 for x in item]      #合并列表    user_list2.sort()       #列表排序    if user_list2[0] == user_list1[1] == user_list1[2]:     #判断三张数字是否相同        num = user_list1[1][0] * 100000 + zhadan    elif user_list1[0] == user_list1[2] == user_list1[4] and user_list2[2] - user_list2[1] == user_list2[1] - \            user_list2[0] == 1:     #判断三张花色是否相同且连号        num = user_list2[1] * 10000 + shunjin    elif user_list2[2] - user_list2[1] == user_list2[1] - user_list2[0] == 1:       #判断是否连号        num = user_list2[1] * 1000 + shunzi    elif user_list2[0] == user_list2[1] or user_list2[1] == user_list2[2] or user_list2[2] == user_list2[0]:        #判断是否有两个一样的数字        if user_list2[0] == user_list2[1]:            num = user_list2[0] * 100 + duizi        if user_list2[0] == user_list2[2]:            num = user_list2[2] * 100 + duizi        if user_list2[2] == user_list2[1]:            num = user_list2[1] * 100 + duizi    elif user_list2[0] != user_list2[1] != user_list2[2]:       #最后一种可能,单张        num = user_list2[2] * 10 + user_list2[1] + danzhang    return num      #返回计算后的分值#    定义玩家牌型的底分zhadan = 100shunjin = 80shunzi = 60duizi = 40danzhang = 20 gamer = []      #定义新列表,存放玩家数量gamers = int(input('请输入玩家数量(只能2 - 9名):'))if gamers >= 2 and gamers <= 9:        #判断用户输入的人数是否在规定范围内    for i in range(gamers):  # 玩家数量由用户定义,代表整体循环的次数        list4 = []  # 用于存储每名玩家随机得到的三张牌        for j in range(3):            sun = random.randint(1, len(puke()) - 1)  # 以随机数为扑克整体的下标进行查找对应的牌            list4.append(puke()[sun])  # 添加进列表            puke().remove(puke()[sun])  # 把已经发出去的牌在扑克牌整体中进行删除        print(f'{i + 1}号玩家的底牌:{list4}')        if i == 0:            user_1 = func(0)            gamer.append(user_1)        elif i == 1:            user_2 = func(0)            gamer.append(user_2)        elif i == 2:            user_3 = func(0)            gamer.append(user_3)        elif i == 3:            user_4 = func(0)            gamer.append(user_4)        elif i == 4:            user_5 = func(0)            gamer.append(user_5)        elif i == 5:            user_6 = func(0)            gamer.append(user_6)        elif i == 6:            user_7 = func(0)            gamer.append(user_7)        elif i == 7:            user_8 = func(0)            gamer.append(user_8)        elif i == 8:            user_9 = func(0)            gamer.append(user_9)else:    print('你输入的人数不合理,请重新输入。') old_grade = []       #定义一个新列表,用于存放以玩家排序的分数new_grade = []         #定义一个新列表,用于存放以大小排序后的分数for i in gamer:         #遍历玩家分数列表    old_grade.append(i)new_grade.extend(old_grade)old_grade.sort(reverse=True)     #降序排列后的分数列表 user = 1for j in new_grade:     #遍历玩家顺序的列表    if j == old_grade[0]:        print(f'{user}号玩家获胜,得分:{old_grade[0]}')     #最终赢家的分数没有实际意义,仅为了判断最大值    else:        user += 1

补充:示例2

一、Poker 类(扑克牌)

Card = collections.namedtuple('Card', ['rank', 'suit'])class Poker(MutableSequence):    # 扑克牌的相关定义    ranks = [str(n) for n in range(2, 11)] + list('JQKA')    suits = 'spades hearts diamonds clubs'.split()  # 黑桃,红桃,方块,梅花    suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)#黑桃最大,红桃次之,方块再次之,梅花最小    def __init__(self):        self._cards = [Card(rank, suit) for rank in self.ranks                                           for suit in self.suits]    def __len__(self):        return len(self._cards)    def __getitem__(self, position):  # 仅仅实现了__getitem__方法,该对象就变成可迭代的        return self._cards[position]    def __setitem__(self, position, value):        self._cards[position] = value    def __delitem__(self, position):        del self._cards[position]    def insert(self, position, value):        self._cards[position] = value

一副扑克牌有 54 张牌,其中 52 张是正牌,另2张是副牌(大王和小王)。本程序中未涉及到大小王。52 张正牌又均分为 13 张一组,并以黑桃、红桃、梅花、方块四种花色表示各组,每组花色的牌包括从 2-10 以及 J、Q、K、A 标示的 13 张牌。

二、Player 类(玩家)

Own_Poker = collections.namedtuple('Own_Poker', ['id', 'rank', 'suit', 'score'])class Player():    '''    牌型  豹子:三张同样大小的牌。  顺金:花色相同的三张连牌。  金花:三张花色相同的牌。     顺子:三张花色不全相同的连牌。  对子:三张牌中有两张同样大小的牌。  单张:除以上牌型的牌。    '''    def __init__(self, id, poker):        self.id = id        self.poker = poker  #一副扑克牌        self.pokers = []    #玩家手中的牌        self.type = 0  # 每个人初始都假定为三张毫无关系的牌,也就是扑克牌赢法中的“单张”    def set_card_score(self, card):        '''        按照点数判定扑克牌的大小        :param card:扑克牌卡片        :return:扑克牌点数大小        '''        rank_value = Poker.ranks.index(card.rank)        suit_values = Poker.suit_values        return rank_value * len(suit_values) + suit_values[card.suit]    def sort_card_index(self, rank_index_list):        '''        通过值减下标的方式分组,如果三个值连续则被分配到同一个g中        比如说ll=[3,4,5,7,8],分组时,enumerate(ll)=[(0,3),(1,4),(2,5),(3,7),(4,8)],fun函数值减下标,结果一样的,就归为一组        在本程序中,如果是三张连续的扑克牌,则应该是同一个g中,此时返回为Ture,否则为False        :param rank_index_list:        :return:        '''        fun = lambda x: x[1] - x[0]        for k, g in groupby(enumerate(rank_index_list), fun):  # 返回一个产生按照fun进行分组后的值集合的迭代器.            if len([v for i, v in g]) == 3:                return True        return False    def judge_type(self):        '''        玩家随机发完三张牌后,根据扑克牌玩法进行区分,对手中的牌进行判别属于哪种类型        :return:        '''        suit_list = []        rank_list = []        score_list = []        for poker in self.pokers:            suit_list.append(poker.suit)            rank_list.append(poker.rank)            score_list.append(poker.score)        rank_index_list = []  # 扑克牌卡片在Poker中rank中的index        for rank in rank_list:            index = self.poker.ranks.index(rank)            rank_index_list.append(index)        if len(set(rank_list)) == 1:            self.type = 5  # 豹子        elif len(set(suit_list)) == 1:            if self.sort_card_index(rank_index_list):                self.type = 4  # 顺金            else:                self.type = 3  # 金花        elif self.sort_card_index(rank_index_list):            self.type = 2  # 顺子        elif len(set(rank_list)) == 2:            self.type = 1  # 对子    def play(self):        self.judge_type()

每位玩家都有一个名称,用同一副扑克牌,炸金花游戏要求每人手中有三张牌,根据手中的牌,程序初步判断属于哪种牌型,用于后续游戏取胜机制做判断。

三、Winner 类(游戏取胜机制)

class Winner():    def __init__(self, player1, player2):        self.player1 = player1        self.player2 = player2    def get_max_card(self, player):        '''        筛选出三张牌中最大的牌,这里返回的是在ranks中的index        :param player:        :return:        '''        ranks = Poker.ranks        rank_index_list = []  # 扑克牌卡片在Poker中rank中的index        for poker in player.pokers:            index = ranks.index(poker.rank)            rank_index_list.append(index)        return max(rank_index_list)    def get_card_suit(self, player):        '''        返回扑克牌花色大小        :param player:        :return:        '''        suit_values = Poker.suit_values        suit = player.pokers[0].suit        return suit_values[suit]    def get_card_value(self, player):        '''        当牌型是对子的时候,经过匹配找出是对子的牌和单个的牌,这里返回的是牌的index,便于比较大小        :param player:        :return:        '''        ranks = Poker.ranks        rank_index_dict = {}  # 扑克牌卡片在Poker中rank中的index        repeat_rank_value = 0  # 成对的两张扑克牌的大小        single_rank_value = 0  # 单个的扑克牌的大小        for poker in player.pokers:            index = ranks.index(poker.rank)            if index in rank_index_dict:                rank_index_dict[index] += 1            else:                rank_index_dict[index] = 1        rank_index_dict = sorted(rank_index_dict.items(), key=lambda d: d[1], reverse=True)        n = 0        for key in rank_index_dict:            if n == 0:                repeat_rank_value = key            else:                single_rank_value = key            n += 1        return repeat_rank_value, single_rank_value    def get_player_score(self, player):        '''        当牌型为单牌时,计算手中的牌相加后的值大小        :param player:        :return:        '''        ranks = Poker.ranks        score = 0        for poker in player.pokers:            index = ranks.index(poker.rank)  # 扑克牌卡片在Poker中rank中的index            score += index        return score    def get_winner(self):        player1, player2 = self.player1, self.player2        # 先比较玩家手中的牌型,大的胜出,玩牌的规则暂时不涉及到牌色,如有修改可以在此基础上调整        # 豹子> 顺金 > 金花 > 顺子 > 对子 > 单张        if player1.type > player2.type:            return player1        elif player1.type < player2.type:            return player2        else:  # 当玩家双方手中的牌型一致时,根据赢法一一判断            if player1.type == 5 or player1.type == 4 or player1.type == 2:  # 豹子、顺金、顺子 规则说明:按照比点                if self.get_max_card(player1) > self.get_max_card(player2):                    return player1                else:                    return player2            elif player1.type == 1:  # 对子 规则说明:先比较相同两张的值的大小,谁大谁胜出;如果对子相同,再比较单个                repeat_rank_value1, single_rank_value1 = self.get_card_value(player1)                repeat_rank_value2, single_rank_value2 = self.get_card_value(player1)                if repeat_rank_value1 > repeat_rank_value2:                    return player1                elif repeat_rank_value1 < repeat_rank_value2:                    return player2                else:                    if single_rank_value1 > single_rank_value2:                        return player1                    elif single_rank_value1 < single_rank_value2:                        return player2                    else:                        return None  # 平局,大家手上的牌一样大            else:  # 单牌,金花   规则:比较所有牌的点数大小,不区分牌色                if self.get_player_score(player1) > self.get_player_score(player2):                    return player1                elif self.get_player_score(player1) < self.get_player_score(player2):                    return player2                else:                    return None

由于不是很清楚炸金花的游戏规则,这里我们采用的是最简单的游戏规则。

牌型 豹子:三张同样大小的牌。顺金:花色相同的三张连牌。金花:三张花色相同的牌。 顺子:三张花色不全相同的连牌。 对子:三张牌中有两张同样大小的牌。单张:除以上牌型的牌。

玩法比较简单,豹子> 顺金 > 金花 > 顺子 > 对子 > 单张,当牌型不一致的话,谁牌型大谁胜出;当牌型一致的时候,又分为三种情况,一是豹子、顺金、顺子,比较玩家手中牌的最大值,谁拥有最大牌面值谁胜出;二是对子,比较玩家手中对子的牌面大小,如果相同再另行比较;三是金花、单张,比较玩家手中所有牌面大小之和。

除了上述三个对象类外,还需要一个发牌者(荷官)来主持洗牌和发牌。

def compare_card(card1, card2):    '''    比较两种扑克牌是否相同    :param card1:    :param card2:    :return: 相同返回为True,否则为False    '''    if card1.rank == card2.rank and card1.suit == card2.suit:        return True    return Falsedef dutch_official_work(poker, player1, player2):    '''    发牌人(荷官)给两位玩家轮替发牌,发出去的牌都需要从这副扑克牌中剔除出去    :param poker: 那一副扑克牌    :param player1:玩家1    :param player2:玩家2    :return:整理后的扑克牌    '''    def distribute_card(player):        card = choice(poker)  # 发牌        player.pokers.append(Own_Poker(player.id, card.rank, card.suit, player.set_card_score(card)))        for i in range(len(poker)):            if compare_card(card, poker[i]):                poker.__delitem__(i)                break    shuffle(poker)  # 洗牌    for k in range(3):        distribute_card(player1)        distribute_card(player2)    return poker

Python的优点有哪些

1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严格;2、Python属于开源的,所有人都可以看到源代码,并且可以被移植在许多平台上使用;3、Python面向对象,能够支持面向过程编程,也支持面向对象编程;4、Python是一种解释性语言,Python写的程序不需要编译成二进制代码,可以直接从源代码运行程序;5、Python功能强大,拥有的模块众多,基本能够实现所有的常见功能。

以上就是Python实现炸金花游戏的示例代码怎么写的全部内容了,更多与Python实现炸金花游戏的示例代码怎么写相关的内容可以搜索编程网之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下编程网!

--结束END--

本文标题: Python实现炸金花游戏的示例代码怎么写

本文链接: https://lsjlt.com/news/307311.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python实现炸金花游戏的示例代码怎么写
    今天给大家介绍一下Python实现炸金花游戏的示例代码怎么写。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,...
    99+
    2023-06-26
  • Python实现炸金花游戏的示例代码
    今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是没有想到简单的办法让其比较,索性都用数字了...
    99+
    2024-04-02
  • Python实现带图形界面的炸金花游戏
    要实现带图形界面的炸金花游戏,你可以使用Python的GUI库,如Tkinter、PyQt或Kivy。以下是一个使用Tkinter库...
    99+
    2023-08-14
    Python
  • Python如何实现带图形界面的炸金花游戏
    本文小编为大家详细介绍“Python如何实现带图形界面的炸金花游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现带图形界面的炸金花游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。炸金花题目...
    99+
    2023-07-04
  • Python实现带图形界面的炸金花游戏(升级版)
    旧版本的代码请见上一篇博文:  Python实现带图形界面的炸金花游戏 本文尝试在旧版本的基础上,“升级”以下几个部分: 一、图形的旋转,模拟四个...
    99+
    2022-12-08
    Python炸金花游戏 Python炸金花 Python 游戏
  • Java实现经典游戏黄金矿工的示例代码
    目录前言主要设计功能截图代码实现游戏核心类钩子类总结前言 《黄金矿工》游戏是一个经典的抓金子小游戏,它可以锻炼人的反应能力。。该游戏中,可以通过“挖矿”获得积...
    99+
    2024-04-02
  • Python实现小游戏的源代码示例
    这篇文章将为大家详细讲解有关Python实现小游戏的源代码示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、21点数字小游戏展示:首先配置文件的源码:'''配置文件'&...
    99+
    2023-06-14
  • python实现烟花的实例代码怎么编写
    本篇文章给大家分享的是有关python实现烟花的实例代码怎么编写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现代码如下:# -*- coding:&nb...
    99+
    2023-06-22
  • Python实现21点小游戏的示例代码
    目录游戏玩法代码 - v1测试代码 - v2测试游戏玩法 游戏玩法: 该游戏由 2 到 6 个人玩,使用除大小王之外的 52 张牌, 游戏者的目标是使手中的牌的点数之和不超过 21 ...
    99+
    2024-04-02
  • Python游戏代码怎么写
    这篇文章主要介绍“Python游戏代码怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python游戏代码怎么写”文章能帮助大家解决问题。1、吃金币源码分享:import osimpo...
    99+
    2023-06-29
  • python实现井字棋游戏的代码怎么写
    python实现井字棋游戏的代码怎么写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。井字棋简介井字棋又称三子棋,英文名为Tic Tac Toe。具体玩法为在一个3x3的棋盘上,...
    99+
    2023-06-25
  • 基于Python实现围棋游戏的示例代码
    目录1.导入模块2.初始化棋盘3. 开始游戏4.放弃当前回合落子5.悔棋判断6.重新开始7.右侧太极图的设置8.落子设置9.吃子规则判定设置10.其他11.程序入口12.效果图文件自...
    99+
    2024-04-02
  • Python实现生命游戏的示例代码(tkinter版)
    目录生命游戏(Game of Life)游戏概述生存定律图形结构代码实现运行界面使用简介后续改进生命游戏(Game of Life) 由剑桥大学约翰·何顿·...
    99+
    2024-04-02
  • Python代码实现贪吃蛇小游戏的示例
    这篇文章给大家分享的是有关Python代码实现贪吃蛇小游戏的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图示基本准备首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装...
    99+
    2023-06-15
  • Python实现极限车神游戏的示例代码
    目录导语正文一、环境准备二、代码实现三、效果实现导语 今天小编要为大家介绍一款小编自己用代码码出来的赛车风格的打字小游戏 取名暂定为《极限车神》打字小游戏。 这款Pygame小游戏在...
    99+
    2023-02-14
    Python实现极限车神游戏 Python极限车神游戏 Python 游戏
  • 基于Python实现24点游戏的示例代码
    目录1.前言2.思路3.代码1.前言 24数大家之前玩过没有? 规则:一副扑克牌抽走大王,小王,K,Q,J(有的规则里面会抽走10,本文一律不抽走),之后在牌堆里随机抽取四张牌,将这...
    99+
    2022-12-08
    Python 24点游戏 Python 24点 Python 游戏
  • 通过Python实现猜灯谜游戏的示例代码
    目录导语猜灯谜界面程序讲解构造初始界面构造灯谜类对象监控鼠标事件源码导语 新的一年迎来了元宵节,元宵佳节在陪伴家人的同时,自然也少不了赏花灯,猜灯谜的项目。当然,受到疫情的影响,许多...
    99+
    2024-04-02
  • Python实现智能贪吃蛇游戏的示例代码
    目录前言基本环境配置实现效果实现代码前言 我想大家都玩过诺基亚上面的贪吃蛇吧,本文将带你一步步用python语言实现一个snake小游戏。 基本环境配置 版本:Python3 系统:...
    99+
    2024-04-02
  • 基于Python实现格斗小游戏的示例代码
    目录前言一、简易版本格斗二、炼狱角斗场格斗前言 格斗游戏,曾经是街机厅里最火爆的游戏之一,甚至可以把“之一”去掉,那个年代的格斗游戏 就是街机游戏的王。 如今...
    99+
    2023-03-02
    Python实现格斗游戏 Python格斗游戏 Python游戏
  • Java实现经典游戏打砖块游戏的示例代码
    目录前言主要设计功能截图代码实现游戏核心类小球类砖块类总结前言 《JAVA打砖块》游戏是自制的游戏。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的&l...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作