手搓四人麻将程序
一、麻将牌的表示
在麻将游戏中,总共有一百四十四张牌,这些牌被分为多个类别,每个类别又包含了不同的牌型。具体来说,麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中,包含有万子、条子和筒子,每种花色的序数牌都从一到九排列,每个数字有四张相同的牌。例如,一万、二万一直到九万,一共三十六张万子牌;同样的一条到九条,组成三十六张条子牌;还有一筒到九筒,构成另外三十六张筒子牌。
字牌则有风牌和箭牌之分。风牌包括东、南、西、北四种风向牌,各有四张,总共十六张。箭牌则包含中、发、白搭三种,同样每种四张,共计十二张。与序数牌不同的是,字牌没有大小顺序之分,它们在游戏中的作用主要是增加游戏的复杂性和多样的胡牌方式。比如,在一些胡牌条件中,要求玩家的手牌中包含特定的字牌组合。花牌虽然在大多数麻将规则中不是必需的,但它们的存在为游戏增添了一定的趣味性。花牌包括春、夏、秋、冬和梅、兰、竹、菊这八种,各一张,总共有八张。这些牌通常在游戏中具有特殊的作用,比如可以替代其他牌来形成特殊牌型,或者在某些计分规则中起到加分的效果。
from enum import Enumclass TileType(Enum):"""麻将牌的类型枚举"""WIND = 1 # 风牌DRAGON = 2 # 箭牌BAMBOO = 3 # 筒子CHARACTER = 4 # 万子DOT = 5 # 条子class TileValue(Enum):"""麻将牌的值枚举(用于风牌和箭牌)"""EAST = 1 # 东SOUTH = 2 # 南WEST = 3 # 西NORTH = 4 # 北RED = 5 # 中GREEN = 6 # 发WHITE = 7 # 白搭class Tile:"""表示一张麻将牌"""def __init__(self, tile_type, value):self.tile_type = tile_type # 牌的类型self.value = value # 牌的值def __repr__(self):"""返回牌的字符串表示,便于调试和显示"""type_name = {TileType.WIND: "风",TileType.DRAGON: "箭",TileType.BAMBOO: "筒",TileType.CHARACTER: "万",TileType.DOT: "条"}.get(self.tile_type, "未知")value_name = ""if self.tile_type == TileType.WIND:value_name = {TileValue.EAST: "东",TileValue.SOUTH: "南",TileValue.WEST: "西",TileValue.NORTH: "北"}.get(self.value, "未知")elif self.tile_type == TileType.DRAGON:value_name = {TileValue.RED: "中",TileValue.GREEN: "发",TileValue.WHITE: "白"}.get(self.value, "未知")else:value_name = str(self.value)return f"{type_name}{value_name}"class TileDeck:"""表示麻将牌堆"""def __init__(self):self.tiles = []self.initialize_deck()def initialize_deck(self):"""初始化麻将牌堆,包含所有144张牌"""# 风牌(东、南、西、北)for wind in [TileValue.EAST, TileValue.SOUTH, TileValue.WEST, TileValue.NORTH]:for _ in range(4): # 每种风牌有4张self.tiles.append(Tile(TileType.WIND, wind))# 箭牌(中、发、白)for dragon in [TileValue.RED, TileValue.GREEN, TileValue.WHITE]:for _ in range(4): # 每种箭牌有4张self.tiles.append(Tile(TileType.DRAGON, dragon))# 序数牌:万子、条子、筒子,每种从1到9,每种有4张for tile_type in [TileType.CHARACTER, TileType.DOT, TileType.BAMBOO]:for value in range(1, 10): # 1到9for _ in range(4): # 每张牌有4张self.tiles.append(Tile(tile_type, value))# 示例用法
if __name__ == "__main__":deck = TileDeck()print(f"麻将牌堆中共有 {len(deck.tiles)} 张牌")print("前10张牌为:")for tile in deck.tiles[:10]:print(tile)
为了在程序中准确地表示这些牌,我们需要为每张牌定义其属性,包括牌的类型、花色、值或符号等。例如,对于序数牌,我们可以用一个结构来存储其花色(万子、条子、筒子)和数值(1到9);对于字牌,我们则可以使用特定的标识符来表示东、南、西、北风以及中、发、白搭等;而花牌则可以用对应的季节或花卉名称来标识。在程序内部,这些属性可以通过枚举类型、类属性或简单的整数编码来实现,以便于游戏逻辑的处理和牌的比较、匹配等操作。
为了便于程序的实现和扩展,我们可能还需要为这些牌设计一些辅助的函数或方法,比如比较两张牌是否相同、判断一张牌是否属于某个特定类别、根据牌的属性生成对应的显示符号等。这些功能将帮助我们在游戏的不同阶段,如发牌、摸牌、打牌、胡牌判定等,快速准确地处理各种与牌相关的操作。通过对麻将牌的详细表示,我们能够确保程序能够正确地模拟麻将游戏中的各种情况,从而为玩家提供一个既真实又有趣的麻将游戏体验。这种对基础元素的深入理解和精确建模,是构建一个完整且功能丰富的麻将程序的关键所在。
二、游戏主循环
在麻将游戏中游戏主循环是整个程序的核心部分它控制着游戏的节奏和进程。游戏主循环的主要任务是不断地循环处理每个玩家的回合直至游戏结束的条件被满足。这个循环需要精确地管理牌的流动、玩家的操作、游戏状态的更新以及胜利条件的检测。
首先游戏开始时需要初始化所有玩家的状态以及牌堆。每个玩家都有自己的手牌区域和得分情况。接着程序进入主循环在每个循环迭代中依次处理当前玩家的回合。当前玩家从牌堆中摸一张牌加入到自己的手牌中。这时候需要检查该玩家是否因为这张牌而胡牌如果满足胡牌条件游戏就在此时结束并结算分数。
import random
from enum import Enumclass TileType(Enum):"""麻将牌的类型枚举"""WIND = 1 # 风牌DRAGON = 2 # 箭牌BAMBOO = 3 # 筒子CHARACTER = 4 # 万子DOT = 5 # 条子class TileValue(Enum):"""麻将牌的值枚举(用于风牌和箭牌)"""EAST = 1 # 东SOUTH = 2 # 南WEST = 3 # 西NORTH = 4 # 北RED = 5 # 中GREEN = 6 # 发WHITE = 7 # 白搭class Tile:"""表示一张麻将牌"""def __init__(self, tile_type, value):self.tile_type = tile_type # 牌的类型self.value = value # 牌的值def __repr__(self):"""返回牌的字符串表示,便于调试和显示"""type_name = {TileType.WIND: "风",TileType.DRAGON: "箭",TileType.BAMBOO: "筒",TileType.CHARACTER: "万",TileType.DOT: "条"}.get(self.tile_type, "未知")value_name = ""if self.tile_type == TileType.WIND:value_name = {TileValue.EAST: "东",TileValue.SOUTH: "南",TileValue.WEST: "西",TileValue.NORTH: "北"}.get(self.value, "未知")elif self.tile_type == TileType.DRAGON:value_name = {TileValue.RED: "中",TileValue.GREEN: "发",TileValue.WHITE: "白"}.get(self.value, "未知")else:value_name = str(self.value)return f"{type_name}{value_name}"class TileDeck:"""表示麻将牌堆"""def __init__(self):self.tiles = []self.discard_pile = [] # 废牌堆self.initialize_deck()self.shuffle()def initialize_deck(self):"""初始化麻将牌堆,包含所有144张牌"""# 风牌(东、南、西、北)for wind in [TileValue.EAST, TileValue.SOUTH, TileValue.WEST, TileValue.NORTH]:for _ in range(4): # 每种风牌有4张self.tiles.append(Tile(TileType.WIND, wind))# 箭牌(中、发、白)for dragon in [TileValue.RED, TileValue.GREEN, TileValue.WHITE]:for _ in range(4): # 每种箭牌有4张self.tiles.append(Tile(TileType.DRAGON, dragon))# 序数牌:万子、条子、筒子,每种从1到9,每种有4张for tile_type in [TileType.CHARACTER, TileType.DOT, TileType.BAMBOO]:for value in range(1, 10): # 1到9for _ in range(4): # 每张牌有4张self.tiles.append(Tile(tile_type, value))def shuffle(self):"""洗牌"""random.shuffle(self.tiles)def draw_tile(self):"""摸牌"""if len(self.tiles) == 0:return Nonereturn self.tiles.pop()def discard_tile(self, tile):"""打牌到废牌堆"""self.discard_pile.append(tile)class Player:"""表示一个玩家"""def __init__(self, name):self.name = nameself.hand = [] # 手牌self.score = 10000 # 初始分数def draw(self, deck):"""摸牌"""tile = deck.draw_tile()if tile:self.hand.append(tile)return tiledef discard(self, tile):"""打牌"""if tile in self.hand:self.hand.remove(tile)return tilereturn Noneclass MahjongGame:"""麻将游戏主循环"""def __init__(self):self.deck = TileDeck()self.players = [Player(f"玩家 {i + 1}") for i in range(4)]self.current_player_index = 0 # 当前玩家索引self.game_over_flag = False # 游戏结束标志def deal_tiles(self):"""发牌"""# 每个玩家摸13张牌for _ in range(13):for player in self.players:player.draw(self.deck)def check_win(self, player):"""检查玩家是否胡牌(简化版,仅检查手牌数量)"""# 这里只是一个简单的示例,实际胡牌判断逻辑更复杂return len(player.hand) == 14 # 假设摸到第14张牌就胡牌def play_turn(self, player):"""玩家回合"""print(f"{player.name} 的回合")print(f"手牌: {player.hand}")# 摸牌drawn_tile = player.draw(self.deck)print(f"摸到: {drawn_tile}")print(f"当前手牌: {player.hand}")# 检查是否胡牌if self.check_win(player):print(f"{player.name} 胡牌!")self.game_over_flag = Truereturn# 打牌(这里简化为随机打出一张牌)discarded_tile = random.choice(player.hand)player.discard(discarded_tile)self.deck.discard_tile(discarded_tile)print(f"打出: {discarded_tile}")def switch_player(self):"""切换到下一个玩家"""self.current_player_index = (self.current_player_index + 1) % 4def game_over(self):"""检查游戏是否结束"""return self.game_over_flag or len(self.deck.tiles) == 0def start(self):"""开始游戏"""print("麻将游戏开始!")self.deal_tiles() # 发牌while not self.game_over():current_player = self.players[self.current_player_index]self.play_turn(current_player)if not self.game_over():self.switch_player()print("游戏结束!")# 运行游戏
if __name__ == "__main__":game = MahjongGame()game.start()
如果没有胡牌玩家则需要选择一张牌打出。打出的牌可能会引发其他玩家的一系列操作比如其他玩家可以选择碰牌、杠牌或者胡牌。这时候程序需要暂停当前玩家的回合等待其他玩家的响应。如果玩家选择进行这些操作相应的牌会被移动到新的位置并且可能再次检查是否有人因此胡牌。在处理完这些可能的操作后游戏会继续进行下一位玩家的回合。这个过程一直持续直到牌堆中的牌全部被摸完或者有玩家成功胡牌。如果牌摸完了而没有人胡牌则游戏以平局结束所有玩家的得分根据剩余的牌和游戏规则进行调整。
游戏主循环不仅要处理正常的出牌和胡牌还需要处理一些特殊的游戏事件比如玩家的杠牌操作或者特殊牌型的检测。此外游戏主循环还需要管理玩家的分数及时更新并且在游戏结束时显示最终的结果。在实现游戏主循环时需要特别注意游戏逻辑的正确性和流畅性。每个玩家的操作都需要被准确地记录和响应游戏状态的变化要被及时地反映到用户界面上。同时游戏主循环还要处理可能出现的各种异常情况比如网络延迟(如果是在线游戏)或者玩家的不合法操作确保游戏能够顺利进行。
三、胡牌判定
在麻将程序中,胡牌判定是游戏逻辑的核心部分之一,它的复杂性和多样性直接关系到游戏的真实性和可玩性。胡牌判定不仅仅是一个简单的条件判断,而是一个需要综合考虑多种牌型组合和规则细节的复杂过程。胡牌的基本条件通常是玩家手中的牌形成特定的有效组合。这些组合在不同的麻将变体中可能有所不同,但大多数情况下包括“和牌”的基本结构,比如四个顺子或刻子加一个将牌(一对)。除此之外,还有一些特殊的胡牌形式,如“七对”“清一色”“大三元”等,每一种都有其独特的判定逻辑。
import random
from enum import Enumclass TileType(Enum):"""麻将牌的类型枚举"""WIND = 1 # 风牌DRAGON = 2 # 箭牌BAMBOO = 3 # 筒子CHARACTER = 4 # 万子DOT = 5 # 条子class TileValue(Enum):"""麻将牌的值枚举(用于风牌和箭牌)"""EAST = 1 # 东SOUTH = 2 # 南WEST = 3 # 西NORTH = 4 # 北RED = 5 # 中GREEN = 6 # 发WHITE = 7 # 白搭class Tile:"""表示一张麻将牌"""def __init__(self, tile_type, value):self.tile_type = tile_type # 牌的类型self.value = value # 牌的值def __repr__(self):"""返回牌的字符串表示,便于调试和显示"""type_name = {TileType.WIND: "风",TileType.DRAGON: "箭",TileType.BAMBOO: "筒",TileType.CHARACTER: "万",TileType.DOT: "条"}.get(self.tile_type, "未知")value_name = ""if self.tile_type == TileType.WIND:value_name = {TileValue.EAST: "东",TileValue.SOUTH: "南",TileValue.WEST: "西",TileValue.NORTH: "北"}.get(self.value, "未知")elif self.tile_type == TileType.DRAGON:value_name = {TileValue.RED: "中",TileValue.GREEN: "发",TileValue.WHITE: "白"}.get(self.value, "未知")else:value_name = str(self.value)return f"{type_name}{value_name}"class TileDeck:"""表示麻将牌堆"""def __init__(self):self.tiles = []self.discard_pile = [] # 废牌堆self.initialize_deck()self.shuffle()def initialize_deck(self):"""初始化麻将牌堆,包含所有144张牌"""# 风牌(东、南、西、北)for wind in [TileValue.EAST, TileValue.SOUTH, TileValue.WEST, TileValue.NORTH]:for _ in range(4): # 每种风牌有4张self.tiles.append(Tile(TileType.WIND, wind))# 箭牌(中、发、白)for dragon in [TileValue.RED, TileValue.GREEN, TileValue.WHITE]:for _ in range(4): # 每种箭牌有4张self.tiles.append(Tile(TileType.DRAGON, dragon))# 序数牌:万子、条子、筒子,每种从1到9,每种有4张for tile_type in [TileType.CHARACTER, TileType.DOT, TileType.BAMBOO]:for value in range(1, 10): # 1到9for _ in range(4): # 每张牌有4张self.tiles.append(Tile(tile_type, value))def shuffle(self):"""洗牌"""random.shuffle(self.tiles)def draw_tile(self):"""摸牌"""if len(self.tiles) == 0:return Nonereturn self.tiles.pop()def discard_tile(self, tile):"""打牌到废牌堆"""self.discard_pile.append(tile)class Player:"""表示一个玩家"""def __init__(self, name):self.name = nameself.hand = [] # 手牌self.score = 10000 # 初始分数def draw(self, deck):"""摸牌"""tile = deck.draw_tile()if tile:self.hand.append(tile)return tiledef discard(self, tile):"""打牌"""if tile in self.hand:self.hand.remove(tile)return tilereturn Noneclass MahjongGame:"""麻将游戏主循环"""def __init__(self):self.deck = TileDeck()self.players = [Player(f"玩家 {i + 1}") for i in range(4)]self.current_player_index = 0 # 当前玩家索引self.game_over_flag = False # 游戏结束标志def deal_tiles(self):"""发牌"""# 每个玩家摸13张牌for _ in range(13):for player in self.players:player.draw(self.deck)def check_win(self, player):"""检查玩家是否胡牌(简化版)"""# 这里只是一个简单的示例,实际胡牌判断逻辑更复杂# 简化版:检查手牌是否为14张(正常胡牌为14张)return len(player.hand) == 14 def check_exact_win(self, player):"""精确胡牌判定(示例:检查是否为七对)"""# 统计手牌中每张牌的出现次数tile_count = {}for tile in player.hand:tile_str = str(tile)if tile_str in tile_count:tile_count[tile_str] += 1else:tile_count[tile_str] = 1# 检查是否所有牌都是对子for count in tile_count.values():if count != 2:return Falsereturn Truedef play_turn(self, player):"""玩家回合"""print(f"{player.name} 的回合")print(f"手牌: {player.hand}")# 摸牌drawn_tile = player.draw(self.deck)print(f"摸到: {drawn_tile}")print(f"当前手牌: {player.hand}")# 检查是否胡牌if self.check_win(player):print(f"{player.name} 胡牌!")self.game_over_flag = Truereturn# 打牌(这里简化为随机打出一张牌)if self.check_exact_win(player):print(f"{player.name} 七对胡牌!")self.game_over_flag = Truereturndiscarded_tile = random.choice(player.hand)player.discard(discarded_tile)self.deck.discard_tile(discarded_tile)print(f"打出: {discarded_tile}")def switch_player(self):"""切换到下一个玩家"""self.current_player_index = (self.current_player_index + 1) % 4def game_over(self):"""检查游戏是否结束"""return self.game_over_flag or len(self.deck.tiles) == 0def start(self):"""开始游戏"""print("麻将游戏开始!")self.deal_tiles() # 发牌while not self.game_over():current_player = self.players[self.current_player_index]self.play_turn(current_player)if not self.game_over():self.switch_player()print("游戏结束!")if __name__ == "__main__":game = MahjongGame()game.start()
要实现胡牌判定功能,首先需要对玩家的手牌进行分析。手牌通常是一个包含多张牌的列表,程序需要检查这个列表是否满足胡牌的条件。这涉及到对牌的排序、分组和模式匹配。比如,程序需要能够识别出牌中的顺子(三种连续的序数牌)和刻子(三张相同的牌),并确保这些组合的数量和结构符合胡牌的要求。在实现过程中,递归和回溯算法常常被用来穷举可能的牌型组合。这是因为麻将牌的组合方式非常多,直接遍历所有可能性可能会导致效率低下。递归算法可以有效地分解问题,将手牌分成不同的部分进行检查,并在发现不符合条件时及时回溯,尝试其他组合方式。
此外,胡牌判定还需要考虑一些特殊情况,比如是否有剩余的牌未被使用,或者是否满足某些特殊的加分条件。例如,“碰碰胡”要求所有的组合都是刻子,这就需要程序在判定时特别检查是否存在顺子。为了提高判定的效率和准确性,通常会将手牌进行预处理,比如排序和分类。这样可以减少不必要的计算,加快判定过程。同时,为了处理不同的麻将规则变体,胡牌判定逻辑需要具有一定的灵活性和可配置性。可以通过参数化的方式,让程序能够适应不同的规则要求。
相关文章:

手搓四人麻将程序
一、麻将牌的表示 在麻将游戏中,总共有一百四十四张牌,这些牌被分为多个类别,每个类别又包含了不同的牌型。具体来说,麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中,包含有万子、条子和筒子,每种花色…...

PotPlayer 安装 madVR、LAV Filters 以提升解码能力和视频音频效果
PotPlayer自带的解码器并不是最好,如下两张截图都是出自 TOP GUN: Maverick 较暗、灰蒙蒙的一张,是安装插件之前明亮的一张,是安装插件之后 详细安装参考 https://www.bilibili.com/video/BV1UV5qzuE74?spm_id_from333.788.videopod.sectio…...
阿里云域名 绑定 华为云服务器ip
阿里云(万网)域名转入华为云域名图文教程 上-云社区-华为云 阿里云(万网)域名转入华为云域名图文教程-云社区-华为云 在阿里云备案了域名,解析到华为云服务器,不在同一个服务商这样可以使用么?…...
windows7安装node18
1、要安装windows系统更新 2、node下载:CNPM Binaries Mirror 3、下载zip安装包,解压后将目录添加至环境变量。 4、node -v检查是否成功安装。 5、npm install -g vite4.0.0...
Maven配置安装
(2025.1.27)最新版MAVEN的安装和配置教程(超详细)_maven安装-CSDN博客...
小刚说C语言刷题—1153 - 查找“支撑数”
1.题目描述 在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗? 输入 第一行为整数 m,表示输入的整数个数。࿰…...

Kind方式部署k8s单节点集群并创建nginx服务对外访问
资源要求 请准备好doker环境,尽量用比较新的版本。我的docker环境如下 docker 环境: Docker version 20.10.21, build 20.10.21-0ubuntu1~18.04.3 安装kind kind表现上就是一个二进制程序,下载对应版本并增加执行权限即可: cu…...

K个一组链表翻转
目录 1. 题意 2. 解题思路 3. 代码 1. 题意 给一个链表,按 k 进行翻转,也就是 k 2 ,两两进行翻转,如果不够2则不动。 2. 解题思路 首先思考怎么翻转一个链表,反转链表:https://leetcode.cn/problems…...

Python60日基础学习打卡D32
我们已经掌握了相当多的机器学习和python基础知识,现在面对一个全新的官方库,看看是否可以借助官方文档的写法了解其如何使用。 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档。 大多数 Python 库都会有官方文档,里面包含了函数…...

面向恶劣条件的道路交通目标检测----大创自用(当然你也可以在里面学到很多东西)
全部内容梳理 目标检测的两个任务: 预测标签 边界框 语义分割 实力分割 一个是类别 一个是实例级别 分类任务把每个图像当作一张图片看待 所有解决方法是先生成候选区域 再进行分类 置信度: 包括对类别和边界框预测的自信程度 输出分类和IOU分数的…...

基于Java(SSM)+MySQL实现(Web)具有智能推荐功能的图书销售系统
具有智能推荐功能的图书销售系统 1.绪论 1.1 背景、目的、意义 随着互联网的不断发展,电子商务逐渐代替传统的交易方式。各种类型的电子商务网站层出不穷,但细分之下电子商务网站主要分为 B2B,B2C,C2B,C2C 这四大类…...

浙大团队研发Earth Explorer系统,探索深时演化/地学剖面/科研场景,赋能深时地球科学研究
深时地球科学研究聚焦地球的漫长历史,探寻从数十亿年前到如今的地质演化过程,研究范畴广泛,涵盖了地球内部结构、物质组成、生命演化,以及地球与外部环境的相互作用等关键领域。近年来,地学可视化分析方法对多维时空交…...
docker 启动一个python环境的项目
安装镜像 docker pull python:3.8-slim8902端口 启动容器 tail -f /dev/null 持续监听空文件,保持容器活跃 docker run -it \-p 8902:8902 \--name api_mock2 \-v /home/py/test:/app \-w /app \python:3.8-slim \tail -f /dev/null进入容器 docker exec -it api…...

31-35【动手学深度学习】深度学习硬件
1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15,GPU为12。GPU的显存很低,16GB(可能32G封顶),CPU可以一直插内存。 左边是GPU(只能做些很简单的游戏,视频处理),中…...
Linux问题排查-内存使用率高如何分析原因
以下是针对 Linux 系统内存使用率高的分步排查方法,结合用户进程占用、tmpfs 内存占用、内核内存泄漏和黑洞内存等特殊情况进行分析: 第一步:初步观察系统整体内存使用情况 1. 查看系统内存概况 命令:free -h 或 cat /proc/mem…...

SpringMVC2
一、springmvc 接收请求 类上、方法上 RequestMapping GetMapping PostMapping package com.hl.springmvc02.web; import jdk.nashorn.internal.objects.annotations.Getter; import org.springframework.web.bind.annotation.*; RestController RequestMapping(&qu…...

【每日一题丨2025年5.12~5.18】排序相关题
个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…...
ElasticSearch性能优化
ES基础概念介绍: 索引:类似于MySQL中的表,它是具有相同特征的一个数据集。文档:格式为JSON格式,类似于MySQL中的一条数据,它是数据存储的基本数据单元,每一条文档都有一个唯一的ID。查询&#x…...

Typora + PicGo + GitHub 配置图床——图片自动上传 详细教程
文章目录 一、创建 GitHub 仓库二、添加私人令牌三、下载 PicGo四、配置 PicGo五、测试 一、创建 GitHub 仓库 进入 Github 官网 注册一个属于自己的账号,点击创建仓库。 2. 创建自己的新仓库。仓库设置为公开,方便上传图片(你设置私有也可以…...

QT+Visual Studio 配置开发环境教程
一、QT架构 Qt Creator 是一个轻量级、跨平台的 IDE,专为 Qt 开发量身打造,内置对 qmake/CMake 的深度支持、Kits 配置管理、原生 QML 调试器以及较低的资源占用维基百科。 而在 Windows 环境下,Visual Studio 配合 Qt VS Tools 扩展则可将 Q…...

缺乏经验的 PCB 过孔建模方法
您是一名背板设计人员,被指派设计一种新的高速、多千兆位串行链路架构,从多个线卡到背板上的多个交换矩阵交换卡。这些链路必须在第一天以 6GB/s 的速度运行,并且为 10GB/s (IEEE 802.3KR) 做好产品演进的准备。时间表很紧,您需要提出一个背板架构,以允许程序的其余部分…...
layui 介绍
layui(谐音:类 UI) 是一套开源的 Web UI 解决方案,采用自身经典的模块化规范,并遵循原生 HTML/CSS/JS 的开发方式,极易上手,拿来即用。其风格简约轻盈,而组件优雅丰盈,从源代码到使用…...
【漫话机器学习系列】265.普拉托变换的相关问题(Issues With Platt Scaling)
Platt Scaling 的相关问题详解 | 模型校准中的隐患分析 在机器学习模型中,模型预测的“置信度”并不一定等于真实的概率。为了提高模型预测结果的可解释性和实用性,我们通常会使用一种后处理的概率校准方法——Platt Scaling(普拉托变换&…...

【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈
【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈 高性能网络学习目录 基础内容(两周完成): 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发…...

LlamaIndex
1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…...

springboot使用xdoc-report包导出word
背景:项目需要使用xdoc-report.jar根据设置好的word模版,自动填入数据 导出word 框架使用 我的需求是我做一个模板然后往里面填充内容就导出我想要的word文件,问了下chatgpt还有百度,最后选用了xdocreport这个框架,主…...
leetcode 3356. 零数组变换 II 中等
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]: 在 nums 的下标范围 [li, ri] 内选择一个下标 子集。将选中的每个下标对应的元素值减 1。 零数组 是指所有元素都等于 0 的数组。 …...

重拾GMP
目录 GMP总结 线程协程三家对比GMP调度模型 mgp过一遍流程 g 一个G的生命周期 mpschedt全局队列g0视角看看G的调度流程 四大调度类型 主动调度被动调度正常调度抢占调度 宏观的调度流程上面流程的具体细节 schedule()findRunnable()execute()gosched_m()park_m()与ready()goe…...

实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
实验背景 流式细胞仪与微流控技术,为细胞及细胞核成像提供新的路径。传统流式细胞仪在细胞核成像检测方面存在检测通量低,荧光信号微弱等局限,故某光学重点实验室开发一种基于高灵敏度sCMOS科学相机并集成在自组荧光显微镜的微流控细胞核成像…...
C++学习:六个月从基础到就业——C++11/14:其他语言特性
C学习:六个月从基础到就业——C11/14:其他语言特性 本文是我C学习之旅系列的第四十四篇技术文章,也是第三阶段"现代C特性"的第六篇,主要介绍C11/14中引入的其他重要语言特性。查看完整系列目录了解更多内容。 引言 在前…...